Android性能优化
/ / 点击 /Android的性能优化主要从四方面入手,内存优化、布局优化、网络优化和安装包优化。
常用检查工具
LeakCanary是一个三方检测内存泄漏的工具库 ,集成后会自动检测应用运行期间的内存泄漏,并直观的输出。
Android自带的Android Profiler ,可以检测CPU、MEMERY、NETWORK三方的性能。
BlockCanary是一个三方用来检测UI卡顿的工具库,像LeakCanary一样集成后当发生UI卡顿现象时会输出卡顿的信息,通过输出的信息可以很方便的来定位导致卡顿的原因。内存优化
内存优化的方式时避免内存泄漏(节流)、增加内存(开源)。
常见的内存泄露:
- 单例导致的泄漏。在创建单例时传入了具体页面的Context,由于单例的静态属性,导致单例一致持有该Context引用,一直到应用程序结束。正确的做法是创建单例时应用传入应用级别的Context,也就是Application的Context,这样就保证了单例生命周期与传入Context的统一。
- 静态变量导致的内存泄漏。JVM中可以知道静态变量是在方法区的,它的生命周期是从类加载到应用程序结束,如果静态变量中持有了具体页面的Context就会导致页面finish后Context不会被GC,这样就导致了内存泄露。
- 非静态内部类导致的内存泄露。非静态内部类创建呢的Handle或Thread在执行延时操作时一直持有当前的Activity引用,这时候在Activity finish后就会导致内存泄漏。解决方式是使用静态内部类并用弱引用调用Activity;另外还可以在onDestroy中调用handler.removeCallbacksAndMessages取消所有事件消息。
- 使用资源没有及时关闭。常见操作有:数据流操作完没有关闭、bitmap没及时Recycle等
- 三方的没及时接绑。EventBus(unregister)和Rxjava中(dispose)。
- 动画执行导致的。在Activity finish时动画执行还在进行。解决就是在onDestroy时cacel动画。
- WebView导致的泄漏。 WebView即使调用了destroy也会导致内存泄漏。解决方式时使用弱引用WeekReference或者将WebView所在的Activity置于另外一个进程中。
增加内存方案一般会在Application下添加largeHeap=”true”,活着新开进程来时应用的内存总空间增大。
- 布局优化 16ms
- 使用RelativeLayout减少View层级
- 利用
抽离常用的布局 - 使用
加载不常用的布局 - 使用
减少布局嵌套 - 减少多余的背景绘制
- canvas.clipRect()裁剪可见区域,其他区域就不会被多余绘制。
- 网络优化
- 合理合并网络请求
- 网络缓存
- 大数据分页请求
- 网络数据传输压缩(Gzip)
- 图片压缩、缩略图
- 安装包优化
apk的构成:
- assets文件夹:配置文件、资源文件 文件夹内的资源时通过AssetManager类内方法获取。
- res:资源文件,文件名会自动生成对应ID映射到.R文件中。
- META-INF:保存呢应用的签名信息,保证APK的完整性。
- AndroidManifest.xml:描述应用的配置信息。
- classes.dex:Dalvik虚拟机可执行的字节码文件,SDK下dx工具将JAVA字节码转化为Dalvik字节码。
- resources.arsc:资源文件和资源ID间的映射关系。
根据spk的构成做一下几方面的优化:
- 混淆:使用proGuard代码混淆工具,它包含了代码的压缩、优化、混淆等功能。
- 资源优化:利用lint工具删除冗余代码,资源文件的最小化等。
- 重复功能库:去除一些功能重复库的引用。
- 插件化:功能模块放在服务器上,按需下载。
5.so库优化:保留v7版本,删除armeabi和v8版本的SO库,v7库可以按足市场上绝大多树手机的要求。
全文完。