安卓开发日志采集和分析面面谈

· 浏览次数 : 0

小编点评

## 进程死亡时间点定位步骤总结 **第一步:确定进程死亡的原因** * 通过分析进程状态、日志记录、异常信息等,确定导致进程死亡的原因。 * 可以参考文章《进程-确定进程死亡时间》第二步:假设进程死亡的原因,设置怀疑点,根据经验搜索关键字。 **第二步:验证怀疑点是否正确关键字附录参考搜索** * 根据怀疑点,搜索相关关键字。 * 可以参考以下关键词: * Empty for 06-10 13:32:13.057 * stopped com.xxx.aaa * Sending signal. PID: 2566 SIG: 906-07 * Force stopping、installPackageLI、deletePackageX06-10 15:59:30.827 * Force finishing、Force removing、Force stopping **第三步:复现出现异常的步骤,验证怀疑点是否正确关键字附录参考搜索** * 根据关键词,重复执行导致进程死亡的步骤。 * 验证是否能够再次出现异常。 **其他** * 如果以上步骤无法确定进程死亡时间点,可以尝试使用其他方法,例如: * 使用`ps`命令查看进程状态。 * 使用`top`命令查看进程运行的优先级。 * 使用`htop`命令查看进程的内存占用情况。

正文

日志面面谈

为什么需要日志

复现问题,回溯到问题产生时候的系统状态,有利于定位和分析问题。

安卓日志有哪些?

cpu

关注的纬度:

  • 单个应用使用
  • 系统cpu分配
  • 温度

有什么用:

  1. App卡顿、ANR
  2. App异常退出

怎么用:

1.应用使用

adb shell dumpsys activity processes  >> D:\app_process.log
adb shell COLUMNS=512 top -n 1 -s cpu >>D:\cpu.log
adb shell COLUMNS=512 top -n 1 -s vss  >>D:\cpu_vss.log
adb shell COLUMNS=512 top -n 1 -s thr  >>D:\cpu_thr.log
  1. CPU内存
adb shell dumpsys cpuinfo >> D:\cpu_meminfo.log
  1. CPU温度
adb shell cat /sys/class/thermal/thermal_zone0/temp >> D:\cpu_tmp.log

内存存储器

关注的纬度:

  • 系统内存分配情况
    • adb shell COLUMNS=512 top -n 1 -s vss
    • adb dumpsys meminfo
  • 单个应用内存分配情况
    • profile->memory->hprof
    • adb shell dumpsys meminfo com.xx
    • leakcanary

有什么用:

帮助定位内存抖动、内存溢出、内存泄漏的问题

怎么用:

  1. 系统内存
adb shell dumpsys meminfo >> D:\system_meminfo.log
  1. 指定app内存
adb shell dumpsys meminfo  com.xx >>>> D:\com.xx_meminfo.log
adb shell am dumpheap com.xx/data/anr/Launcher.hprof

任务栈

关注的纬度:

  • Ams Stack
  • Service Stack
  • Broadcast

有什么用:

关注界面上启动过的Activity、Service、Broadcast,分析页面导航异常、页面加载异常、后台任务异常的问题

怎么用:

1.activity

adb shell dumpsys activity >> D:\AmsStack.log

2.广播

adb shell dumpsys activity broadcasts >>D:\broadcasts.log

3.服务

adb shell dumpsys activity services >>D:\services .log

anr

关注的纬度:

  • 系统anr日志
  • Blockcanary日志

有什么用:

分析App无响应的原因、App被杀死的原因

怎么用:

adb pull /data/anr D:\2021\

trace

关注的纬度:

  • trace日志

有什么用:

分析App无响应的原因、App被杀死的原因

Log

关注的维度:

  • Systemlog
  • Eventlog
  • kernellog

怎么用:

  1. logcat输出
adb logcat -v time >D:\log.txt
  1. dev/log导出
adb pull /dev/log/ D:\ohters\

该目录有4种文件

  • radio:输出通讯系统(无线/电话相关)的log。
  • system:输出系统缓冲区的log。
  • events:输出事件缓冲区的log。
  • main:全部java层的log, 也是主缓冲区 (默认缓冲区)。

3.其他路径的日志按需导出

  • /data/local/tmp/*
  • /data/tmp/*
  • /data/system/usagestats/*
  • /data/system/appusagestates/*
  • /data/system/dropbox/*
  • /data/tombstones/*
  • /data/anr/*

综上可以看到,要抓的日志真是太多了,抓起来麻烦,看起来汇总分析也麻烦,那么有没有一个现成工具供我们收集和分析呢,答案是有!安卓系统提供了Bugreport!

日志阅读的思路

第一步:定位进程死亡的时间点,参考《进程-确定进程死亡时间》
第二步:假设进程死亡的原因,设置怀疑点,根据经验搜索关键字。
第三步:复现出现异常的步骤,验证怀疑点是否正确

日志解析工具Bugreport

如何用

  1. 导出日志

    adb bugreport 1>>D:\ohters\bugreport.log
    
  2. 下载ChkBugReport.jar

  3. 生成html报告

    java -jar ./chkbugreport.jar ./bugreport.log
    

可能遇到的问题:
Failed to get bugreportz version, which is only available on devices running Android 7.0 or later. Trying a plain-text bug report instead.
解决步骤:

  1. 下载21版本的adb
  2. 关闭正在运行的高版本adb adb kill-server
  3. 指定21版本的adb来捕获日志D:\ohters\adb bugreport 1>>D:\ohters\bugreport.log

有什么用

输出到Android系统的Bugreport包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。
配合安卓工具ChkBugReport可以将日志信息可视化显示到静态页面种。

日志分析经验积累

日志阅读的思路

第一步:定位进程死亡的时间点,参考《进程-确定进程死亡时间》
第二步:假设进程死亡的原因,设置怀疑点,根据经验搜索关键字。
第三步:复现出现异常的步骤,验证怀疑点是否正确

关键字附录参考
搜索 Fatal
搜索 uncaughtException
搜索 crashreport
搜索 Exception
搜索 Application Not Response
搜索 NetworkOnMainThreadException
搜索 ANR Warning
搜索 AnrManager
搜索 Anr in

13种常见进程死亡原因

  1. java层的崩溃

    • 通过java层logcat看是否崩溃(crashHandler或者调试版logcat)
    • 如果java层没有任何相关日志打印就从c层看(在bugreport.zip->FS->data->tombstones->对应时间的日志)
  2. 低内存原因

    • 搜索关键字lowmemorykiller
    • 导出内存日
  3. 被其他进程杀死

    • Android11我们可以通过在bugreport日志文件里面搜索Historical Process Exit for关键字,就能看到自己的进程被谁杀死。
  4. 怀疑是进程已经不活动了被系统杀

    • 搜索关键字empty for
    06-10 13:32:13.057 1000 1700 1812 I am_kill : [0,2409,com.miui.screenrecorder,955,empty for 1800s]
    
  5. epmty进程被杀,系统内empty进程数量达到阈值26(不同手机略有不同)会按时间顺序查杀进程,搜索关键字empty ;

    06-10 16:00:54.244 1000 1700 1795 I ActivityManager: Killing 20081:com.android.providers.calendar/u0a72 (adj 985): empty #26
    
  6. 自己退出,结束自己,搜索关键字: exited 、cleanly
    有时候应用退出不一定是因为奔溃,可能是程序员代码没写对或者漏掉了一些环境细节让应用主动退出了。除了看ApplicationExitInfo外我们还能通过logcat看到。

    06-10  10:17:04.053 root 689 689 I Zygote : Process 29263 exited cleanly (0)
    06-10  10:17:04.056 1000 1692 1805 I libprocessgroup: Successfully killed process cgroup uid 10252 pid 29263 in 122ms
    06-10  10:17:03.933 1000 1692 5189 I ActivityManager: Process com.tencent.tmgp.pubgmhd (pid 29263) has died: hvy HVY
    
  7. 被系统进程杀掉
    系统app调用forceStopPackage 接口,杀掉我们的应用,我们搜索stop com.xxx.aaa due to from process

    06-15 19:34:10.498 26589 29585 I ActivityManager: Killing 14459:com.xiaomi.misubscreenui/1000 (adj 0): stop com.xiaomi.misubscreenui due to from process:com.miui.voiceassist
    
  8. 线程过度使用CPU导致所在进程被杀
    上次adj降为Service以下到现在经历2221553 ms,cpu POWER_CHECK_MAX_CPU_4 = 2, 两次检测时间间隔为300044 ms,使用cpu时间为16720ms,超过2%,就会被杀。

    06-06 18:07:44.445 1000 1651 1798 I am_kill : [0,22157,com.ximalaya.ting.android,900,excessive cpu 16720 during 300044 dur=2221553 limit=2]
    	06-06 18:07:44.445 1000 1651 1798 I ActivityManager: Killing 22157:com.ximalaya.ting.android/u0a239 (adj 900): excessive cpu 16720 during 300044 dur=2221553 limit=2
    	06-06 18:07:44.566 root 681 681 I Zygote : Process 22157 exited due to signal 9 (Killed)
    
  9. 线程异常所在进程被杀,进程的某个线程发生异常,自己发Signal 9信号给Zygote 杀掉自己,搜索关键字 Sending signal

    06-07 16:53:03.027 1000 2566 2582 I Process : Sending signal. PID: 2566 SIG: 9
    06-07 16:53:03.154 root 681 681 I Zygote : Process 2566 exited due to signal 9 (Killed)
    06-07 16:53:03.167 1000 1734 4006 I ActivityManager: Process com.android.systemui (pid 2566) has died: pers PER
    
  10. 应用重装,被杀,搜索关键字Force stopping、installPackageLI、deletePackageX

    06-10 15:59:30.827 1000 1700 1812 I ActivityManager: Force stopping com.google.android.gms appid=10190 user=-1: installPackageLI
    06-10 15:59:30.984 1000 1700 1812 I ActivityManager: Killing 3876:com.google.android.dialer/u0a180 (adj -700): stop com.google.android.gms: installPackageLI
    
  11. ANR被杀

  12. OOM被杀

  13. 死锁被杀,搜索关键字Force finishing 、Force removing、Force stopping

与安卓开发日志采集和分析面面谈相似的内容:

安卓开发日志采集和分析面面谈

明确系统提供了哪些日志,cpu、meminfo、app、log等,我们怎么看日志,看日志的三步骤,怎么用工具提高分析日志的效率,bugreport和chkbugreport。

FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流

​RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMP Streamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等,可谓功能强大

几种常用到的 Hybrid App 技术框架

移动操作系统在经历了诸神混战之后,BlackBerry OS、Symbian OS、Windows Phone 等早期的移动操作系统逐渐因失去竞争力而退出。目前,市场上主要只剩下安卓和 iOS 两大阵营,使得 iOS 和安卓工程师成为抢手资源。然而,由于两者系统的差异,开发同一个应用需投入两倍的工作

手机用户的开源福音「GitHub 热点速览」

不知道多少用安卓机的小伙伴,被开屏广告烦过。相比有些克制的 iOS 机,安卓机是个应用基本上都有开屏广告,少则 3s 多则 10s,本周获得 1k+ star 的 Android-Touch-Helper 就是帮你免去看广告烦恼的项目。此外,iOS 和 Android 双系统之间的媒体资料传递也有新法子,NearDrop 让你用苹果设备给安卓设备投递照片。

云图说|移动应用安全服务—App的体检中心,全面检测,安全上路!

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要: 移动应用安全服务,面向App安全检测服务,为企业解决App(包括安卓/鸿蒙)安全漏洞、隐私合规等安全问题。 本文分享

钥匙环服务,打造无缝的跨设备登录体验

近些年来,随着手机技术迭代更新越来越快,用户更换手机的周期也在缩短,在这样的背景下,开发者不得不面临以下问题: 同一开发者旗下常常有多个安卓应用和多形态应用(快应用和Web应用),用户更换一个新的设备(手机或平板)后,在新设备上登录各应用时每次都需要重复输入帐号和密码,导致用户在登录阶段流失率增加,

安卓架构组件-依赖注入

安卓依赖注入 什么是依赖注入 依赖注入(DI,Dependency Injection)是一种广泛的编程技术。把依赖(所需对象)传递给其它对象创建,好处是类的耦合更加松散,遵循依赖倒置的原则。 类获取所需对象 class Engine { fun start() { println("engine

详解安卓架构入门

准备 首先进入安卓架构入门的代码仓库: Android Architecture Starter Templates: https://github.com/android/architecture-templates 先看看介绍,简单分析一下: 架构入门的模板 UI 界面非常简陋 Navigati

移动端termux安装kali

1.相关准备一部安卓手机,termux,NVAC,浏览器2.安装kali首先进入kali的官网选择文档找到Android手机上的kali找到NetHunter-Rootless找到kali安装命令:termux-setup-storagepkg install wgetwget -O install

uiautomator2环境搭建+元素定位(安卓)

一.环境搭建 1.安装uiautomator2 在终端使用pip安装即可 pip install uiautomator2 2.安装adb 可参考:https://www.cnblogs.com/lihongtaoya/p/14970306.html 3.安装weditor 终端执行如下命令 pip