Android性能优化总结-上篇

作者: i校长 | 来源:发表于2019-02-27 11:18 被阅读116次

内容

本次内容,包含视频1-11集的学习总结,取重点及关键点一一罗列出来。整体学习下来,感受到了很多新的知识点,说明在性能优化这个范畴里,还是有很多可以挖掘的,不啰嗦了,接下来开始总结。

崩溃捕获

  1. java崩溃
    通常用try catch,但不是所有的崩溃都可以用它来解决,而是从源头入手,了解崩溃的本质,并想办法解决这个问题
  2. native崩溃
    推荐先阅读《Android 平台 Native 代码的崩溃捕获机制及实现》
    捕获流程:
    捕获流程
  • 编译端。编译 C/C++ 代码时,需要将带符号信息的文件保留下来。
  • 客户端。捕获到崩溃时候,将收集到尽可能多的有用信息写入日志文件,然后选择合适的时机上传到服务器。
  • 服务端。读取客户端上报的日志文件,寻找适合的符号文件,生成可读的 C/C++ 调用栈。
    要实现这一套崩溃流程,需要对linux,汇编有一定的造诣,所以还是推荐大家了解,可以使用腾讯的Bugly或者阿里的啄木鸟。

崩溃的衡量指标

UV崩溃率 = 发生的崩溃UV / 登录UV
我们不要一味的追求这个万分之一的崩溃率,出发点应落脚在用户体验上,找到发生崩溃的本质,并解决之。

衡量崩溃稳定性

UV 异常率 = 发生异常退出或者崩溃的UV / 登录UV
应用退出包括如下:

  • 主动自杀。Process.killProcess()、exit() 等。
  • 崩溃。出现了 Java 或 Native 崩溃。
  • 系统重启;系统出现异常、断电、用户主动重启等,我们可以通过比较应用开机运行时间是否比之前记录的值更小。
  • 被系统杀死。被 low memory killer 杀掉、从系统的任务管理器中划掉等。
  • ANR。
    在每一种退出之后做好对应标记,不管是异常还是正常退出都要做,这样在下次启动后,就知道要如何处理,如何上报。
    Sample Chapter01

崩溃内容采集

分析的内容包括但不限于:

  • 进程名、线程名用来判断是前台进程还是后台,是不是在UI线程中发生
  • 崩溃堆栈和类型用来分析属于java崩溃、Native崩溃、ANR,不同类型不同关注点、再分析是系统代码崩溃,还是自己代码崩溃。
  • Logcat 信息 大部分java崩溃的情况,通过Logcat信息就可以确认到具体原因。如果是系统级别的崩溃,记录文件在 /system/etc/event-log-tags 中
  • 另外 机型、系统、厂商、CPU、ABI、linux版本等信息的采集也是很有帮助的
  • 设备状态:是否root、是否模拟器、是否多开
  • 系统剩余内存通过读取文件/proc/meminfo获取,当系统内存不足时,OOM、大量GC、系统频繁自杀拉起等问题非常容易出现
  • 应用使用内存通过java内存、RSS(Resident Set Size)、PSS(Proportional Set Size)来计算,读取文件/proc/self/maps。
  • 虚拟内存: 通过/proc/self/status计算,类似OOM、tgkill问题有时候是由于虚拟内存不足导致的。
  • 资源信息:当发现堆内存和设备内存都正常的情况还是出现内存分配失败,这就跟资源泄漏有很大关系,1. 文件句柄fd,通过/proc/self/limits获得,单进程允许打开的最大文件句柄数1024个,如果超过800就很危险。 2. 线程数,一个线程2M虚拟内存,过多的线程对虚拟内存和文件句柄都带来压力 。 3. JNI , 使用JNI时,很容易出现引用失效,引用爆表的崩溃,通过DumpReferenceTables统计JNI引用表,分析JNI泄漏问题。资源的信息都要输出到日志中。
  • 应用信息:1. 崩溃具体场景,在那个页面发生的 2. 操作路径,用户的操作路径也是很重要的信息 3. 其他自定义信息, 例如运行时间,是否加载了补丁,是否全新安装还是覆盖安装等信息
  • 除了上面的信息,还可以对磁盘空间、电量、网络等信息统计分析,辅助我们解决问题
    总之就是获取足够多的信息,来帮助我们快速定位问题。

崩溃内容分析

1. 确认重点

  • 确认严重程度:这里就需要融会贯通,结合实际业务,解决优先级高的崩溃,具体问题具体分析。
  • 崩溃基本信息:这里主要分别出java崩溃、Native崩溃、ANR,然后再进一步分析。
  • Logcat:日志级别是Warning、Error的信息需要特别注意,这里如ANR的时,会有“am_anr”、“am_kill” 等关键字,会提供很多有用的信息。
  • 各资源情况:这里主要对内存信息、资源信息、应用信息的分析,例如看是不是内存不足、还是文件句柄泄漏导致的。

2. 查找共性

这里就要分析共同点,特定手机出现,还是特定机型,特定操作,特定ROM,甚至是国家,地区等,都可以作为条件筛选。

3. 尝试复现

通过收集的用户操作路径来进一步复现,需要耐得住寂寞,反复猜测,反复发灰度,反复验证。这里有各疑难问题就是系统崩溃,很多开发都觉得系统崩溃跟自己没关系,又不是自己的问题,其实想法错误,想提高还是有办法的,系统崩溃也是可以尝试解决。

  • 先看是什么系统版本,什么特定ROM导致的
  • 查看是否使用不恰当的API,是否可以更换其他实现方式
  • Hook解决,java Hook、Native Hook 这里推荐一个文章学习下Hook
    崩溃问题是个长期的过程,尽可能的提前预防,需要在应用的整个发布流程中做控制,从代码规范到功能编写,到单元测试,甚至到灰度,发布等,一整套的逻辑都关系着应用的好坏。加油。
    SampleChapter02
    未完待续。

相关文章

网友评论

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

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