参考文章:Android APP性能优化的四个方面最全总结 - zhangbijun1230的专栏 - CSDN博客
https://blog.csdn.net/zhangbijun1230/article/details/79449725
1.从4个方面入手
流畅;稳定;省电,省流量;安装包大小
2.造成性能问题的的原因
内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积
3.优化建议
①布局优化要通过减少层级、减少测量和绘制时间、提高复用性三个方面入手
减少层级。合理使用RelativeLayout和LinerLayout,合理使用Merge。
提高显示速度。使用ViewStub,它是一个看不见的、不占布局位置、占用资源非常小的视图对象。
布局复用。可以通过标签来提高复用。尽可能少用wrap_content。wrap_content 会增加布局measure时计算成本,在已知宽高为固定值时,不用wrap_content 。删除控件中无用的属性。
②避免过度绘制;③启动优化;④合理的刷新机制:尽量减少刷新次数;尽量避免后台有高cpu线程运行;缩小刷新区域。
常见内存泄漏场景
①资源性对象未关闭。比如Cursor、File文件等,往往都用了一些缓冲,在不使用时,应该及时关闭它们。
②注册对象未注销。比如事件注册后未注销,会导致观察者列表中维持着对象的引用。
类的静态变量持有大数据对象。
非静态内部类的静态实例。
③Handler临时性内存泄漏。如果Handler是非静态的,容易导致Activity或Service不会被回收。
④容器中的对象没清理造成的内存泄漏。
⑤WebView。WebView存在着内存泄漏的问题,在应用中只要使用一次WebView,内存就不会被释放掉。
LeakCanary是一个检测内存泄漏的开源库,使用非常简单,可以在发生内存泄漏时告警,并且生成leak tarce分析泄漏位置,同时可以提供Dump文件进行分析。
4.优化内存空间
①对象引用。强引用、软引用、弱引用、虚引用四种引用类型,根据业务需求合理使用不同,选择不同的引用类型。
②减少不必要的内存开销。注意自动装箱,增加内存复用,比如有效利用系统自带的资源、视图复用、对象池、Bitmap对象的复用。
③使用最优的数据类型。比如针对数据类容器结构,可以使用ArrayMap数据结构,避免使用枚举类型,使用缓存Lrucache等等。
④图片内存优化。可以设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等等。
5.稳定性优化
①提高代码质量。比如开发期间的代码审核,看些代码设计逻辑,业务合理性等。
②代码静态扫描工具。常见工具有Android Lint、Findbugs、Checkstyle、PMD等等。
③Crash监控。把一些崩溃的信息,异常信息及时地记录下来,以便后续分析解决。
④Crash上传机制。在Crash后,尽量先保存日志到本地,然后等下一次网络正常时再上传日志信息。
6.耗电优化
①在Android5.0之后专门引入了一个获取设备上电量消耗信息的API:Battery Historian。Battery Historian是一款由Google提供的Android系统电量分析工具,和Systrace一样,是一款图形化数据分析工具,直观地展示出手机的电量消耗过程,通过输入电量分析文件,显示消耗情况,最后提供一些可供参考电量优化的方法。
②计算优化,避开浮点运算等。
③避免WaleLock使用不当。
④使用Job Scheduler。
7.减少安装包大小
①代码混淆。使用ProGuard代码混淆器工具,它包括压缩、优化、混淆等功能。
②资源优化。比如使用Android Lint删除冗余资源,资源文件最少化等。
③图片优化。比如利用AAPT工具对PNG格式的图片做压缩处理,降低图片色彩位数等。
④避免重复功能的库,使用WebP图片格式等。
⑤插件化。比如功能模块放在服务器上,按需下载,可以减少安装包大小。
8.性能分析工具
①Profile GPU Rendering:一个图形监测工具,能实时反应当前绘制的耗时,横轴表示时间,纵轴表示每一帧的耗时,随着时间推移,从左到右的刷新呈现,提供一个标准的耗时,如果高于标准耗时,就表示当前这一帧丢失
②TraceView是Android SDK自带的工具,用来分析函数调用过程,可以对Android的应用程序以及Framework层的代码进行性能分析。它是一个图形化的工具,最终会产生一个图表,用于对性能分析进行说明,可以分析到每一个方法的执行时间,其中可以统计出该方法调用次数和递归次数,实际时长等参数维度,使用非常直观,分析性能非常方便。
③Systrace是Android 4.1及以上版本提供的性能数据采样和分析工具,它是通过系统的角度来返回一些信息。它可以帮助开发者收集Android关键子系统,如Surfaceflinger、WindowManagerService等Framework部分关键模块、服务、View系统等运行信息,从而帮助开发者更直观地分析系统瓶颈,改进性能。Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载等,在UI显示性能分析上提供很好的数据,特别是在动画播放不流畅、渲染卡等问题上。
9.内存分析工具
①Memory Monitor
是一款使用非常简单的图形化工具,可以很好地监控系统或应用的内存使用情况,主要有以下功能:
显示可用和已用内存,并且以时间为维度实时反应内存分配和回收情况。
快速判断应用程序的运行缓慢是否由于过度的内存回收导致。
快速判断应用是否由于内存不足导致程序崩溃。
②Heap Viewer
Heap Viewer的主要功能是查看不同数据类型在内存中的使用情况,可以看到当前进程中的Heap Size的情况,分别有哪些类型的数据,以及各种类型数据占比情况。通过分析这些数据来找到大的内存对象,再进一步分析这些大对象,进而通过优化减少内存开销,也可以通过数据的变化发现内存泄漏。
③Allocation Tracker
Memory Monitor和Heap Viewer都可以很直观且实时地监控内存使用情况,还能发现内存问题,但发现内存问题后不能再进一步找到原因,或者发现一块异常内存,但不能区别是否正常,同时在发现问题后,也不能定位到具体的类和方法。这时就需要使用另一个内存分析工具Allocation Tracker,进行更详细的分析,Allocation Tracker可以分配跟踪记录应用程序的内存分配,并列出了它们的调用堆栈,可以查看所有对象内存分配的周期。
④Memory Analyzer Tool(MAT)
MAT是一个快速,功能丰富的Java Heap分析工具,通过分析Java进程的内存快照HPROF分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。
特别感谢:Android APP性能优化的四个方面最全总结 - zhangbijun1230的专栏 - CSDN博客
https://blog.csdn.net/zhangbijun1230/article/details/79449725
网友评论