Android性能优化

2019-08-25  本文已影响0人  LeoFranz

优化角度


RAM方面

Res方面

其他


内存泄露优化

减少OOM

Android系统为每一个应用程序都设置了一个硬性的Dalvik Heap Size最大限制阈值,这个阈值在不同的设备上会因为RAM大小不同而各有差异。ActivityManager.getMemoryClass()可以用来查询当前应用的Heap Size阈值。命令行也可以查看相关的内存信息
减少OOM方面:
其实避免内存泄露也是间接避免了OOM

APP启动优化

一般情况下我们会利用主题去防止出现白屏
需要尽可能减少Application的onCreate中所要做的事情,比如一些不重要的SDK延迟或者异步加载;
有几个方向:
1、利用开启APP时候提前展示的window,快速展示一个界面,给用户视觉上快速的感觉:onCreate函数开头将activity的theme设置为style中的主题,然后在oncreate函数运行过程中又切换成activity标签下配置的背景。
2、异步初始化三方组件
3、减少IO、网络等密集请求

线程优化

采用线程池,一是减少线程重复创建或销毁带来的性能损耗;
二是控制最大并发线程数,防止大量线程抢CPU造成卡顿

apk瘦身

为什么要瘦身:大体积下载转化率低,同时对服务器增加流量压力,此外会影响手机厂商预置应用
利用ProGuard压缩代码去除无用资源,通过移除不需要的代码,重命名类,域与方法等等对代码进行压缩,优化与混淆。使用ProGuard可以使得你的代码更加紧凑,这样能够减少mapping代码所需要的内存空间。
使用 XZ 或者 7-Zip 压缩Library
第三方开源库的瘦身,仅保留自己需要的部分
so的优化与配置,只保留一类so
动态下发一些资源:字库、so、换肤包等

布局优化

尽量减少布局层级,同层级时候使用功能较低的ViewGroup,比如FrameLayout和LinearLayout,但性能较低的layout拓展性差难以实现较复杂的布局,导致需要嵌套,这时候还是建议使用RelativeLayout毕竟嵌套也会降低性能。
实用策略:

绘制优化

为了让屏幕的刷新帧率达到60fps,我们需要确保在时间16ms(1000/60Hz)内完成单次刷新的操作(包括measure、layout以及draw)
onDraw方法中不要创造大量临时对象,因为该方法会被频繁调用,大量GC伤不起。此外也不要使用耗时操作你懂的啦
减少overDraw的产生,尽量让一个像素只绘制一次,减少布局重叠。
除了布局精简,还可以去掉每行RelativeLayout的背景色;去掉每行TextView的背景色;必要的话去掉activity使用的Theme的背景色。

ListView优化

ListView只是一个代表,很多复杂的View都可以参考如下建议
使用ViewHolder并减少在getView中的复杂操作
根据滑动速度来变化view的操作,比如快速滑动时候不开启线程
采用硬件加速来优化view的绘制

Bitmap优化

ANR分析

避免ANR的核心西路是不要在主线程做耗时操作,ANR在activity中的规定出现时限是5秒,在广播中是10秒
出现原因有主线程无法响应触摸或者用户输入,线程之间等待死锁等等。

电量优化

为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求
合理的使用一些传感器、谨慎的使用Wake Lock
检测可以利用battery-historian

其他建议

减少对象
减少枚举
常量使用static final修饰
使用Android特有的数据结构,如SparseArray和pair他们具备更好的性能
适当使用弱引用和软引用
采用内存缓存和磁盘缓存
尽量使用静态内部类

性能优化工具

Android Device Monitor(DDMS) was deprecated in Android Studio 3.1 and removed from Android Studio 3.2,此外,SYSTrace TraceView都被AndroidProfile取代了,不过特定场景上述工具还可用

性能分析工具分两个流派:
第一个流派是 instrument。获取一段时间内所有函数的调用过程,可以通过分析这段时间内的函数调用流程,再进一步分析待优化的点。

第二个流派是 sample。有选择性或者采用抽样的方式观察某些函数调用过程,可以通过这些有限的信息推测出流程中的可疑点,然后再继续细化分析。

在 Android Studio 3.2 的 Profiler 中直接集成了几种性能分析工具,其中:Sample Java Methods 的功能类似于 Traceview 的 sample 类型。Trace Java Methods 的功能类似于 Traceview 的 instrument 类型。Trace System Calls 的功能类似于 systrace。SampleNative (API Level 26+) 的功能类似于 Simpleperf。坦白来说,Profiler 界面在某些方面不如这些工具自带的界面,支持配置的参数也不如命令行,不过 Profiler 的确大大降低了开发者的使用门槛。

https://developer.android.google.cn/studio/profile/monitor.html

此外,优化过程中使用低端手机更易发现瓶颈

上一篇 下一篇

猜你喜欢

热点阅读