1.引言
最近买了张绍文老师的安卓课程,没学习一章总有种拓展了自己知识的感觉,但是运用到实际工作中显得懵逼,索性本着了解的心态看看,记录下一些一些知识。张老师的课程链接:https://time.geekbang.org/column/article/70966
2.正题
应用崩溃有下面几种情况
-
java层面,可以通过Logcat 看到日志
-
jni native层面,这种崩溃一般都会在Logcat中显示 “信号量”,可以在data/tom文件下看到native 崩溃的日志
-
低内存oom,或者被 low memory killer 干掉了
-
线程数开启太多 (400个线程就出问题)
-
文件句柄打开没关闭(800个就出问题)
3. 内存优化
-
apk体积的优化。一个apk占用的内存有以下几个点:
image -
Bitmap优化
-
内存泄露 java 内存泄露和native 内存泄露
4. 卡顿问题分析
卡顿问题最终都是反应在cpu上。通过以下命令可以快速看出那个线程cpu占用:
/proc/[pid]/stat // 进程 CPU 使用情况
/proc/[pid]/task/[tid]/stat // 进程下面各个线程的 CPU 使用情况
/proc/[pid]/sched // 进程 CPU 调度相关
/proc/loadavg // 系统平均负载,uptime 命令对应文件
卡顿分析工具:
Traceview,Nanoscope,Systrace,Simpleperf
5.卡顿监控
-
帧率
工具:Choreographer,Android Vitals -
生命周期方法
Activity、Service、Receiver 组件生命周期的耗时和调用次数也是我们重点关注的性能问题。Activity 的 onCreate() 不应该超过 1秒,不然会影响用户看到页面的时间。Service 和 Receiver 虽然是后台组件,不过它们生命周期也是占用主线程的,也是我们需要关注的问题。 -
线程监控
1.线程数量。需要监控线程数量的多少,以及创建线程的方式。例如有没有使用我们特有的线程池,这块可以通过 got hook 线程的 nativeCreate() 函数。主要用于进行线程收敛,也就是减少线程数量
2.线程时间。监控线程的用户时间 utime、系统时间 stime 和优先级。主要是看哪些线程 utime+stime 时间比较多,占用了过多的 CPU
网友评论