借助友盟+U-APM实现安卓应用优化:使用反射测试安卓设备是否使用“动态壁纸”

本文涉及的产品
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: ⾸先,这可能是⼀个⾮常罕⻅的优化,但我们仍然花费了⼤量的时间和精⼒弄清楚这个优化的细节,所以我认为分享这个⼩优化是有意义的。期待有⼀天, 某个地⽅的某个⼈可能会碰到相同的问题,并从这篇⽂章中受益。

⾸先,这可能是⼀个⾮常罕⻅的优化,但我们仍然花费了⼤量的时间和精⼒弄清楚这个优化的细节,所以我认为分享这个⼩优化是有意义的。期待有⼀天,某个地⽅的某个⼈可能会碰到相同的问题,并从这篇⽂章中受益。

什么是反射?

反射⽤于观察并修改程序在运⾏时的⾏为。⼀个反射导向的程序组件可以监测⼀个范围内的代码 执⾏情况,可以根据获取的⽬标对象信息及与此相关的范围修改⾃身。这可通过在运⾏时动态分 配程序代码实现。


在类型检测严格的⾯向对象的编程语⾔如Java中,⼀般需要在编译期间对程序中需要调⽤的对象的具体类型、接⼝interface资料成员elds和⽅法的合法性进⾏检查。反射技术则允许将对需要调⽤的对象的消息检查⼯作从编译期间推迟到运⾏期间再现场执⾏。

 

这样⼀来,可以在编译期间先不明确⽬标对象的接⼝interface名称、字段elds即对象的资料成员(成员变量)可⽤⽅法,然后在运⾏根据⽬标对象⾃身的消息决定如何处理。还允许根据判断结果进⾏实例化新对象和相关⽅法的调⽤。

为什么会出现这个问题?

我们⼀直收到投诉,⽤户声称启⽤动态壁纸后,我们的Buzz⼩部件在红米Note5上滞后。了复现此问题,我们使⽤友盟+U-APM在红⽶Note5上进⾏线上测试,同时使⽤⾃定义异常抛出问题。

1.jpg

测试表明,这个异常是通过WallpaperManager.getInstance(this).getWallpaperInfo()if代码触发的,也就是说,这是由于应⽤程序模糊了桌⾯,并试图在桌⾯上呈现内容导致的问题。如果桌⾯上运⾏着动态壁纸,那么模糊它会造成⼀些周期性的处理器消耗。

为什么要使用反射,而不是API?

我更希望我们的每个应⽤程序在AndroidMarket中只有⼀个版本,⽽⽤于此的API仅在⼀部SDK中可⽤。反射使我们能够使⽤API同时仍然让应⽤程序在具有较旧固件的设备上运⾏。

如何解决?

好了,我们要开始展示解决⽅案了

if(WallpaperManager.getInstance(this).getWallpaperInfo()!=null){//不模糊}

要使⽤反射来做到这⼀点,我们必须使⽤Class.forName("")Class.getDeclaredMethod()Object.invoke()⽅法,有点像这样:

 

boolean blurBackground = true;

//get the WallpaperManager Class

Class classWallpaperManager = Class.forName("android.app.WallpaperManager");

if(classWallpaperManager != null)

{

//find its .getInstance(this) method

Method methodGetInstance = classWallpaperManager.getDeclaredMethod("getInsta

//invoke the WallpaperManager's .getInstance(this) method to get one

Object objWallpaperManager = methodGetInstance.invoke(classWallpaperManager,

 

//discover the WallpaperManager Object's .getWallpaperInfo() Method

Method methodGetWallpaperInfo = objWallpaperManager.getClass().getMethod("ge

//invoke it

Object objWallPaperInfo = methodGetWallpaperInfo.invoke(objWallpaperManager,

if(objWallPaperInfo!=null)

{

Log.d("WidgetDroid","WallpaperInfo not null");

blurBackground=false;

}

}

同样为了确保安全调⽤,我们将它包装在⼀个快速的 Android版本检查和⼀个 try/catch块中以确保安全:

⼤功告成,现在如果设备使⽤的是动态壁纸,应⽤程序背景就不会模糊了,我们的WidgetWorld可以恢复正常。


相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
11天前
|
IDE Java 开发工具
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"应用
本文将引导读者完成安卓应用开发的初步入门,包括安装必要的开发工具、配置开发环境、创建第一个简单的安卓项目,以及解释其背后的一些基本概念。通过一步步的指导和解释,本文旨在为安卓开发新手提供一个清晰、易懂的起点,帮助读者顺利地迈出安卓开发的第一步。
190 65
|
11天前
|
存储 Java Android开发
探索安卓应用开发:构建你的第一个"Hello World"应用
【9月更文挑战第24天】在本文中,我们将踏上一段激动人心的旅程,深入安卓应用开发的奥秘。通过一个简单而经典的“Hello World”项目,我们将解锁安卓应用开发的基础概念和步骤。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供一次实操体验。从搭建开发环境到运行你的应用,每一步都清晰易懂,确保你能顺利地迈出安卓开发的第一步。让我们开始吧,探索如何将一行简单的代码转变为一个功能齐全的安卓应用!
|
11天前
|
数据采集 人工智能 安全
软件测试中的人工智能应用与挑战
在这篇文章中,我们将深入探讨人工智能(AI)在软件测试中的应用及其所面临的挑战。通过分析当前的技术趋势和具体案例,揭示AI如何提高测试效率和准确性,并指出在实施过程中遇到的主要问题及可能的解决途径。
25 1
|
7天前
|
测试技术
探索软件测试的奥秘:从基础理论到实践应用
【9月更文挑战第28天】在数字化时代,软件已成为我们生活中不可或缺的一部分。然而,随着软件复杂性的增加,确保其质量和可靠性变得日益重要。本文将带你深入了解软件测试的核心概念、方法论以及如何在实际工作中运用这些知识来提升软件质量。无论你是软件测试新手还是希望深化理解,这篇文章都将为你提供宝贵的洞见和实用技巧。
|
19天前
|
敏捷开发 IDE 测试技术
自动化测试框架的选择与应用
【9月更文挑战第16天】在软件开发周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的流行,自动化测试成为提升软件质量和效率的关键手段。本文将探讨如何根据项目需求选择合适的自动化测试框架,并通过实际案例分析展示其在软件开发过程中的应用。我们将从单元测试、集成测试到端到端测试等多个层面,讨论自动化测试的最佳实践和常见问题解决策略。
|
15天前
|
开发框架 搜索推荐 开发工具
打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第51天】本文是一篇面向初学者的Flutter入门教程,旨在通过简单易懂的语言和实际代码示例,引导读者步入跨平台移动应用开发的世界。文章首先介绍了Flutter的基本概念和优势,然后逐步展示了如何搭建开发环境、创建第一个Flutter应用,并实现了一个简单的待办事项列表。最后,文章探讨了Flutter在实现高性能和美观界面方面的潜力,鼓励读者发挥创意,探索更多可能。
66 15
|
6天前
|
监控 安全 Java
Kotlin 在公司上网监控中的安卓开发应用
在数字化办公环境中,公司对员工上网行为的监控日益重要。Kotlin 作为一种基于 JVM 的编程语言,具备简洁、安全、高效的特性,已成为安卓开发的首选语言之一。通过网络请求拦截,Kotlin 可实现网址监控、访问时间记录等功能,满足公司上网监控需求。其简洁性有助于快速构建强大的监控应用,并便于后续维护与扩展。因此,Kotlin 在安卓上网监控应用开发中展现出广阔前景。
9 1
|
9天前
|
敏捷开发 Java 测试技术
自动化测试框架的选择与应用
【9月更文挑战第26天】在软件开发的海洋里,自动化测试是那一盏指路明灯。它不仅加快了开发周期,还提升了软件质量。本文将带你探索自动化测试框架的世界,了解它们的核心特性、适用场景及如何根据项目需求做出明智选择。让我们一起启航,找到那把打开高效、稳定软件生产大门的钥匙。
|
7天前
|
数据采集 人工智能 自然语言处理
软件测试中的人工智能应用与挑战
本文探讨了人工智能在软件测试中的应用及其所面临的挑战。通过分析AI技术如何优化测试流程、提高测试效率以及目前存在的局限性,文章提供了对软件测试未来发展趋势的深入思考。
|
9天前
|
机器学习/深度学习 人工智能 监控
软件测试中的人工智能应用与挑战
随着科技的迅猛发展,人工智能(AI)在软件测试中的应用越来越广泛。本文将探讨AI在软件测试中的具体应用场景、带来的优势以及所面临的挑战,旨在为软件开发和测试人员提供有价值的参考。
下一篇
无影云桌面