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

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

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

什么是反射?

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


在类型检测严格的⾯向对象的编程语⾔如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监测,评估网站服务质量和用户体验。
相关文章
|
21天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
1月前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
54 10
|
14天前
|
监控 开发工具 Android开发
ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
阿里云 ARMS 用户体验监控(RUM)推出了针对原生鸿蒙应用的 SDK。SDK 使用 ArkTS 语言开发,支持页面采集、资源加载采集、异常采集及自定义采集等功能,能够全面监控鸿蒙应用的表现。集成简单,只需几步即可将 SDK 接入项目中,为鸿蒙应用的开发者提供了强有力的支持。
|
1月前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
|
26天前
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试框架在软件开发中的应用与挑战##
本文将深入探讨自动化测试框架在现代软件开发过程中的应用,分析其优势与面临的挑战。通过具体案例分析,揭示如何有效整合自动化测试以提升软件质量和开发效率。 ##
|
23天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
敏捷开发 监控 jenkins
探索自动化测试框架在敏捷开发中的应用与优化##
本文深入探讨了自动化测试框架在现代敏捷软件开发流程中的关键作用,分析了其面临的挑战及优化策略。通过对比传统测试方法,阐述了自动化测试如何加速软件迭代周期,提升产品质量,并针对实施过程中的常见问题提出了解决方案。旨在为读者提供一套高效、可扩展的自动化测试实践指南。 ##
41 9
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
29 4
|
29天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
34 1
|
24天前
|
Java 测试技术 API
软件测试中的自动化测试框架选择与应用##
在快速迭代的软件开发周期中,选择合适的自动化测试框架对于提高软件质量和开发效率至关重要。本文探讨了当前流行的几种自动化测试框架的特点和适用场景,旨在为软件开发团队提供决策依据。 ##