启动优化
主题过度优化
从UI视觉上优化冷启动切换体验;
Application初始化优化
都是为了加速主线程:通常包括:
1. 布局初始化
2. 阻塞主线程的耗时操作,I/O,网络
3. Bitmap、矢量图等加载
组织好application里面多组件的初始化,能延迟的放到子线程。编排好初始化顺序。
UI渲染优化
工具:systrace | layoutInspector|hierarchy view
measure, layout, draw每个阶段代码重复运行,耗时操作;
减少层级;约束布局;
无用背景移除,window background null;
背景分段给到子控件上,父控件不设置;
滑动帧率检测;
ViewStub;
动态addView
内存抖动
短时间大量对象分配,又快速释放内存。一般是循环体内创建对象。
主要是onDraw里面重复创建。对象池等解决方案。
工具:android profiler。
crash优化
崩溃率指标:
接入工具库:bugly;阿里,网易等也有工具监控。或者公司内自己开发的工具。
崩溃类型:
-
java层
代码逻辑上的exception;
low memory killer杀掉;
anr崩溃;
-
native层
日志分析
java: Fatal, Exception, System.err, event log
jni: DEBUG: backtrace, signal, addr, SIGSEGV, SIGABRT,
addr2line, so的符号表
内存优化
工具:profiler,MAT,LeakCannary
LeakCannary原理大致是通过weakReference和new WeakReference第二个参数的gc回调
内存模型:(方法区[运行时常量池]、堆)、(程序计数器、本地方法栈、虚拟机栈)
对象存活:
引用计数;
可达性分析,gc root。
垃圾回收算法:
-
标记清除算法:简单粗暴。标记后,清理;
-
复制算法:分半,来回复制;
-
标记整理:GC较为频繁。内存移动范围大。
-
分带收集算法:8:1:1分配内存空间,新生态容易死,复制一下就解决了,而且比较少量,内存热区;
长久不能回收的往老年代放。
内存泄漏
工具:profiler,MAT。
多次抓取prof文件,分析。一般来讲,fragment过多,activity过多,被持有。再分析下MAT里面的objects和引用关系。找到谁耽误了内存释放。
图片的使用,注意RGB565,resize。不过现在都用Glide省去了不少烦恼。
卡顿优化
16.6ms;vsync。
工具:systrace
分析分析一些黄色红色区域的方法执行;自行研究代码执行时间等等;
blockCannary
监听了ActivityThread的消息队列disptachMessage的事件;统计事件处理的时间消耗。
因为所谓的主线程卡顿,其实就是在UI线程这个handler里面干的每一件时间是否超时嘛。
SharedPerfence优化
Sqlite优化
网络优化
多线程优化
volatile
synchronized
AtomicXXX
jdk1.6以后,推荐使用synchronized,java源码都改用了。
synchronized的升级过程:
->偏向锁(偏向加锁的第一个线程来抢占则不用同步处理;)
->轻量级锁(不释放cpu,自旋锁CAS,就是在JVM层面,在锁门口等着期待着别人释放,马上抢进去)
->重量级锁(系统内核态用户态切换,挂起线程,阻塞)
多线程编程
asyncTask、HandlerThread、IntentService、ThreadPoolExcutors
APK优化
无用资源清理;gradle编译忽略;proguard忽略;第三方包的精简。
tinypng;shape|selector图形背景色;
微信的资源压缩方案;
混淆;