美文网首页
Android性能优化总结

Android性能优化总结

作者: 百事可乐99 | 来源:发表于2020-06-17 09:53 被阅读0次

    性能优化:

    1. 卡顿优化

    1. 绘制问题

      1. 布局复杂导致 -》 使用hierarchy viewer分析。减少嵌套层级,使用ViewStub延迟绘制,去掉不必要的背景

        • 使用include、merge标签
        • 尽量不嵌套使用RelativeLayout
        • 在复杂布局界面使用ConstraintLayout
        • 使用ViewStub标签延迟初始化View
        • 去掉多余的background,少使用复杂shape
      2. 主线程耗时问题导致 -》使用profiler分析卡顿点,采用异步的方式优化

      3. 布局加载优化。性能瓶颈主要在LayoutInflater.inflate()过程

        1. XmlPullParser涉及到IO操作,布局越复杂,IO耗时越长
        2. createView涉及到反射,当调用次数很频繁的时候会有性能问题

        解决方案:

        • AsyncLayoutInflater
        • X2C 使用APT+JavaPoet技术做到编译期将XML转化为动态加载视图的Java代码
    2. 内存问题(问题根源是GC的时候stop the world导致所有线程挂起,出现卡顿问题)

      1. 减少内存抖动,避免短时间内大量创建与回收对象(如有需要,可以使用对象池的方式
      2. 使用leak canary分析,避免内存泄漏问题
        1. 资源未关闭
        2. 注册对象未释放
        3. 内部类持有外部类强引用导致泄漏
        4. handler问题
        5. 单例问题
        6. 静态变量持有大数据对象
        7. ThreadLocal使用不当引起泄漏
        8. 线程池问题,使用了Executors
      3. 内存空间优化
        1. 使用对象引用(强软弱虚引用)
        2. 数据类型优化(ArrayMap、SparseArray、Lrucache)
        3. Bitmap优化
        4. 解析数据后存入缓存,不再每一次都重新解析一遍(具体表现是首页卡片列表的json解析完成之后,会使用一个map存入内存中,后面刷新的时候不再重新解析,直接使用内存中的解析结果)

    2. 启动优化

    1. 启动时间测量:
      1. adb shell am start -W com.mymoney.sms/.ui.SplashActivity
      2. adb logcat | grep Displayed
    2. 添加startingwindow,启动的时候给Application设置一个背景
    3. application初始化的时候,进行异步和延迟(IdleHandler)的改造
    4. 异步加载可能有一些SDK会依赖别的SDK,比如B的初始化依赖A先初始化,这个时候我们可以自己实现一个有序队列,或者使用条件阻塞(CountDownLatch)
    5. 更深入的优化:
      1. 安装包重排布:让启动阶段需要的文件尽量排布在同一个dex中,减少io的开销,从而达到提高性能的目的。主要包括类重排列(redex)和资源重排列(支付宝资源重排列
      2. 启动阶段抑制GC:这个方案主要针对dalvik虚拟机,art虚拟机对GC有做优化,dalvik在查找无用对象的时候会挂起所有线程,art虚拟机这个过程是并发执行的,所有这个优化对art虚拟机收益不大,参考:支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
      3. 针对5.0以下设备MultiDex的优化,参考:面试官:今日头条启动很快,你觉得可能是做了哪些优化?

    3. apk体积优化

    相关文章

      网友评论

          本文标题:Android性能优化总结

          本文链接:https://www.haomeiwen.com/subject/umyjxktx.html