Android的性能优化主要从四方面入手,内存优化、布局优化、网络优化和安装包优化。

  • 常用检查工具
    LeakCanary是一个三方检测内存泄漏的工具库 ,集成后会自动检测应用运行期间的内存泄漏,并直观的输出。
    Android自带的Android Profiler ,可以检测CPU、MEMERY、NETWORK三方的性能。
    BlockCanary是一个三方用来检测UI卡顿的工具库,像LeakCanary一样集成后当发生UI卡顿现象时会输出卡顿的信息,通过输出的信息可以很方便的来定位导致卡顿的原因。

  • 内存优化
    内存优化的方式时避免内存泄漏(节流)、增加内存(开源)。
    常见的内存泄露:

  1. 单例导致的泄漏。在创建单例时传入了具体页面的Context,由于单例的静态属性,导致单例一致持有该Context引用,一直到应用程序结束。正确的做法是创建单例时应用传入应用级别的Context,也就是Application的Context,这样就保证了单例生命周期与传入Context的统一。
  2. 静态变量导致的内存泄漏。JVM中可以知道静态变量是在方法区的,它的生命周期是从类加载到应用程序结束,如果静态变量中持有了具体页面的Context就会导致页面finish后Context不会被GC,这样就导致了内存泄露。
  3. 非静态内部类导致的内存泄露。非静态内部类创建呢的Handle或Thread在执行延时操作时一直持有当前的Activity引用,这时候在Activity finish后就会导致内存泄漏。解决方式是使用静态内部类并用弱引用调用Activity;另外还可以在onDestroy中调用handler.removeCallbacksAndMessages取消所有事件消息。
  4. 使用资源没有及时关闭。常见操作有:数据流操作完没有关闭、bitmap没及时Recycle等
  5. 三方的没及时接绑。EventBus(unregister)和Rxjava中(dispose)。
  6. 动画执行导致的。在Activity finish时动画执行还在进行。解决就是在onDestroy时cacel动画。
  7. WebView导致的泄漏。 WebView即使调用了destroy也会导致内存泄漏。解决方式时使用弱引用WeekReference或者将WebView所在的Activity置于另外一个进程中。

增加内存方案一般会在Application下添加largeHeap=”true”,活着新开进程来时应用的内存总空间增大。

  • 布局优化 16ms
  1. 使用RelativeLayout减少View层级
  2. 利用抽离常用的布局
  3. 使用加载不常用的布局
  4. 使用减少布局嵌套
  5. 减少多余的背景绘制
  6. canvas.clipRect()裁剪可见区域,其他区域就不会被多余绘制。
  • 网络优化
  1. 合理合并网络请求
  2. 网络缓存
  3. 大数据分页请求
  4. 网络数据传输压缩(Gzip)
  5. 图片压缩、缩略图
  • 安装包优化
    apk的构成:
  1. assets文件夹:配置文件、资源文件 文件夹内的资源时通过AssetManager类内方法获取。
  2. res:资源文件,文件名会自动生成对应ID映射到.R文件中。
  3. META-INF:保存呢应用的签名信息,保证APK的完整性。
  4. AndroidManifest.xml:描述应用的配置信息。
  5. classes.dex:Dalvik虚拟机可执行的字节码文件,SDK下dx工具将JAVA字节码转化为Dalvik字节码。
  6. resources.arsc:资源文件和资源ID间的映射关系。

根据spk的构成做一下几方面的优化:

  1. 混淆:使用proGuard代码混淆工具,它包含了代码的压缩、优化、混淆等功能。
  2. 资源优化:利用lint工具删除冗余代码,资源文件的最小化等。
  3. 重复功能库:去除一些功能重复库的引用。
  4. 插件化:功能模块放在服务器上,按需下载。
    5.so库优化:保留v7版本,删除armeabi和v8版本的SO库,v7库可以按足市场上绝大多树手机的要求。