优化Android App

学习资源

博文

总结性

性能分析的网站


  • NimbleDroid 一个 Android 应用性能分析服务网站
  • PageSpeed Insights 能够测试网页在移动设备和桌面设备上的性能工具
  • APM(Application performance magic) : 应用程序性能管理

    2011年时国外的APM行业 NewRelic 和 APPDynamics 国内:听云, OneAPM, 博睿(bonree) 云智慧,阿里百川码力

针对性优化

图片压缩Apk体积缩小

网络优化

内存优化

速度优化

优化实践


内存泄漏

  • Memory Analyzer(MAT) Tool
    • Leak Suspects:内存泄露报告
    • Top Components:吃货报告
    • Histogram:每个Class占用内存
    • Dominator Tree:列出哪些对象占用内存最多以及谁hold住这些对象
    • OQL (Ctrl + F5 run) select * from instanceof android.app.Activity

** Mat tutorial: **
1) 使用Memory Analyzer tool(MAT)分析内存泄漏
2) Video youtube Google I/O 2011: Memory management for Android Apps
3) MAT - Memory Analyzer Tool 使用进阶
4) 从MAT数据中还原Bitmap原图
Docuemnt

1) eclipse.org document MemoryAnalyzer
2) developer.android investigating your RAM usage
Blog

  • adb 使用
    • 检查应用退出后Activities/Views 是否为零;
      adb shell dumpsys meminfo [应用包名]
    • 多次进入退出后的占用内存TOTAL不应变化太大;
  • onTrimMemory回调
    • 响应此回调释放非必须内存;
    • 验证
      adb shell dumpsys gfxinfo 【应用包名】-cmd trim 5
      adb shell dumpsys meminfo 【应用包名】查看内存大小

UI卡顿和稳定性

  1. 工作线程优先级设置为Process.THREAD_PRIORITY_BACKGROUND

卡顿常见原因
1)人为在UI线程中做轻微耗时操作,导致UI线程卡顿;
2) 布局Layout过于复杂,无法在16ms内完成渲染;
3)同一时间动画执行的次数过多,导致CPU或GPU负载过重;
4) View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重;
5) View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染;
6)内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作;
7) 冗余资源及逻辑等导致加载和执行缓慢;
8)工作线程优先级未设置为
Process.THREAD_PRIORITY_BACKGROUND
导致后台线程抢占UI线程cpu时间片,阻塞渲染操作;
9) ANR;
卡顿分析解决的一般步骤

  • 解决过度绘制问题
    1) 调试GPU过度绘制中打开调试,看对应界面是否有过度绘制,如果有先解决掉:

    2) 定位过渡绘制区域
    3) 利用Android提供的工具进行位置确认以及修改(HierarchyView , Tracer for OpenGL ES)
    4) 定位到具体的视图(xml文件或者View)
    5) 通过代码和xml文件分析过渡绘制的原因
    6) 结合具体情况进行优化
    7) 使用Lint工具进一步优化
  • 检查是否有主线程做了耗时操作:
    1) Application 开启 StrictMode;
    public void onCreate() {
    if (DEVELOPER_MODE) {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
         .detectAll() .penaltyLog() .build());
       StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
       .detectAll() .penaltyLog() .build());
    }
       super.onCreate();
    }
  • 如果主线程无耗时操作,还存在卡顿,有很大可能是必须在UI线程操作的一些逻辑有问题,比如控件measure、layout耗时过多等,此时可通过Traceview以及systrace来进行分析。
  • Traceview:Traceview主要用做热点分析,找出最需要优化的点。
    图中展示了Trace期间各方法调用关系,调用次数以及耗时比例
  • systrace:抓取trace:
  • 使用hugo打印方法调用的时长及参数

Method Tracing 优化启动时间

官网:Generate trace logs by instrumenting your app
Java 代码android.os.Debug.startMethodTracing() 和 stopMethodTracing()

# 启动HomePageActivity并每1s跟踪方法调用
adb shell am start -n com.runan.countprisoner/.view.activity.HomePageActivity --start-profiler /data/local/tmp/startup.trace --sampling 1000
 终止跟踪
adb shell am profile stop
# 拉取 .trace 文件到本机当前目录
adb pull /data/local/tmp/startup.trace .

Android Studio -> File -> open 直接打开*.trace

Glide Gif 性能优化

官方工具


Android Monitor

Device Monitor

Viewing Overall Memory Allocations 参考 Investigating Your RAM Usage

  • adb shell dumpsys meminfo <package_name|pid> [-d] 【难点】 对meminfo 的解读
  • Dalvik/ART Log Messages 【难点】解读

Testing Display Performance 十分详细的关于显示优化的介绍。

第三方工具


  • 由腾讯出品的GT(随身调),直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment),支持iOS和Android两个手机平台,主要功能可对APP进行快速的性能测试(CPU、内存、流量、电量、帧率/流畅度等等)、开发日志的查看、Crash日志查看、网络数据包的抓取、APP内部参数的调试、真机代码耗时统计等。还提高基础API进行开发。
  • LeakCanary
    LeakCanary
  • yourkit Java Profiler, and square/leakcanary recommend to use memory leak analyzer like mat
  • FlatBuffers:性能最高的序列化库,由 Google 游戏开发小组专为性能而设计
  • Parcelable API:Android 进程间传递数据,性能远优于 Java 默认序列化机制
  • BlockCanaryEx
  • 加速你的Android应用
  • 保险套项目

    Note : 『保险套』是一个超轻超薄的Android工具库,将它套在Android应用工程里裸露的Context上,再传入第三方SDK(通常是其初始化方法),即可防止三方SDK损害用户体验

    常用小Tips

  • SparseArray ——Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray。
  • 查看Activity启动时间
    adb shell am start -W com.niuwa/.activity.HomePageActivity

参考:

  1. http://blog.tingyun.com/web/article/detail/155
  2. Android P 电量管理
  3. Android vitals