EventLogTags.logtags,它是个日志工具,很多模块有该文件.
event log 在framework层常常使用,通过类似EventLog.writeEvent()写log,这种log被保存在/system/etc/event-log-tags.
./frameworks/base/services/core/java/com/android/server/wm/EventLogTags.logtags
wm_set_resumed_activity (User|1|5),(Component Name|3),(Reason|3)
如何查看 event log
查看Event所有的tags
adb shell cat /system/etc/event-log-tags
输出events日志信息
adb logcat -b events
实战 event log
//1.0
am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)
实例:
I am_proc_start: [0,765,10069,com.android.systemui,service,{com.android.systemui/com.android.systemui.wallpapers.ImageWallpaper}]
解析:
启动一个进程:UserId=0,PID=765,UID=10069,ProcessName=com.android.systemui,Type=service,Component=com.android.systemui/com.android.systemui.wallpapers.ImageWallpaper
//下面都是android系统耗时关键字
//2.0
am_anr (User|1|5),(pid|1|5),(Package Name|3),(Flags|1|5),(reason|3)
实例:
I am_anr : [0,2699,com.example.text_app,552124230,Input dispatching timed out (9ac3957 com.example.text_app/com.example.text_app.MainActivity (server) is not responding.
Waited 5000ms for MotionEvent(deviceId=4, eventTime=3126039070000, source=TOUCHSCREEN, displayId=0,
action=DOWN, actionButton=0x00000000, flags=0x00000000,
metaState=0x00000000, buttonState=0x00000000, classification=NONE,
edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan,
pointers=[0: (237.5, 114.8)]), policyFlags=0x62000000)]
解析:
UserId=0,PID=2699,包名=com.example.text_app,flags=...,anr原因:Input dispatching timed out is not responding(Waited 5000ms)
//3.0
binder_sample (descriptor|3),(method_num|1|5),(time|1|3),(blocking_package|3),(sample_percent|1|6)
作用:监控每个进程的主线程的binder transaction的耗时情况, 当超过阈值(比如:500ms)时,则输出相应的目标调用信息.
(block -> 阻塞)
2754 2754 I binder_sample [android.app.IActivityManager,35,2900,anroid.process.media,5]
解析:
主线程2754,调用android.app.IActivityManager的接口,对应的方法transaction code为35,
耗费时间2900ms,该block所在包名为anroid.process.media
//4.0
dvm_lock_sample: [process_name,thread_id,lock_holder,lock_holder_tid,
lock_holder_method,lock_holder_method_line,lock_waiter,
lock_waiter_tid,lock_waiter_method,lock_waiter_method_line,wait_time]
其中,process_name是发生锁竞争的进程名,thread_id是发生锁竞争的线程ID,
lock_holder是持有锁的对象名,lock_holder_tid是持有锁的线程ID,
lock_holder_method是持有锁的方法名,
lock_holder_method_line是持有锁的方法所在的行号,
lock_waiter是等待锁的对象名,
lock_waiter_tid是等待锁的线程ID,
lock_waiter_method是等待锁的方法名,
lock_waiter_method_line是等待锁的方法所在的行号,
wait_time是等待锁的时间(毫秒)
I dvm_lock_sample: [system_server,1,Binder:699_13,16162,AlarmManagerService.java,
2185,void com.android.server.AlarmManagerService$4.remove(android.app.PendingIntent, android.app.IAlarmListener),
-,4170,void com.android.server.AlarmManagerService$AlarmThread.run(),100]
解析:
在system_server进程中,线程1(Binder:699_13)在执行AlarmManagerService.java的2185行,
即remove方法时,试图获取一个锁,但是发现这个锁已经被线程16162持有,
而线程16162正在执行AlarmManagerService.java的4170行,即run方法.因此,线程1进入等待状态,等待了100毫秒.
dvm_lock_sample:当某个线程等待lock的时间blocked超过阈值(比如:500ms),则输出当前的持锁状态.
Android ANR基本Log分析
Android ANR问题(一)-基本分析方法
event log 流程分析
Android R app 冷启动:
wm_task_created-->wm_stack_created-->wm_create_task-->wm_create_activity
-->am_proc_start-->am_proc_bound-->wm_restart_activity-->wm_set_resumed_activity
-->wm_on_create_called-->wm_on_start_called-->wm_on_resume_calle
开发小tips
adb connect 192.168.1.xxx
#mm(mma、mmm、mmma) -B -j2 2>&1 开始编译模块
注:-B表示编译模块的所有文件,-j2表示编译的时候开启两个线程,2>&1表示将错误切换到输出(输入为0,输出为1,错误为2)。
find ./ -name "*.xml" |xargs grep "status_bar_height" 高效搜索
git show xxx --name-only 查看某个提交修改了那些文件
linux内核调试信息dmesg和kmsg命令
adb shell dmesg
adb shell 然后执行 cat /proc/kmsg
adb shell
dumpsys window | grep mCurrentFocus
service list | grep lyl
settings list system (查看系统settings-system属性)
cat /proc/meminfo
df 查看系统分区
ifconfig wlan0:WIFI eth0:有线
ifconfig eth0 up 连接以太网
ifconfig eth0 down 断开
cd system/bin/ bootanimation 看开机动画是否能播放
adb shell am start com.android.settings/com.android.settings.Settings
adb shell dumpsys package com.android.launcher3
adb shell dumpsys window com.android.launcher3
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-xxxx_r.ninja framework-minus-apex
frameworks/ framework-minus-apex
frameworks/base/services 下有修改代码,则要编译services.jar
adb shell settings get global auto_time_zone
//获取所有关于产品的系统属性
adb shell getprop | grep product
adb shell cat /system/build.prop | grep product
adb reboot loader 切换烧录 模式
git log --oneline 查看很多git 提交日志
gitk git图形化界面的插件
git show xxx --name-only
git cherry-pick commitid 合并commit
adb shell input keyevent 4 back 3 home
adb shell "dumpsys activity top | grep '#[0-9]: ' | tail -n 1" 获取Settings当前界面的Fragment
Android.mk编译apk不生成ota包或者odex包
LOCAL_DEX_PREOPT:=false
首先查看当前webview的版本,使用如下命令查询
adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html
作用:输出dumpsys帮助信息。
dumpsys -help
查看Dumpsys包含服务列表
作用:输出dumpsys所有可打印服务信息,开发者可以关注需要调试服务的名称。
dumpsys -l
输出指定服务的信息
作用:输出指定的服务的 dump 信息。
格式:dumpsys [servicename]
示例:输出服务 SurfaceFlinger的信息,可执行命令:
dumpsys SurfaceFlinger
输出指定服务和应有进程的信息
作用:输出指定服务指定应用进程信息。
格式:dumpsys [servicename] [应用名]
示例:输出服务名为 meminfo,进程名为 com.android.systemui 的内存信息,执行命令:
dumpsys meminfo com.android.systemu
//查看所有activity的信心,Stack编号
dumpsys activity activities
//查看所有Window
dumpsys window windows
cat proc/mounts 查看设备存储分区信息
df -h 查看设备存储使用率
dumpsysmeminfo 输出内容包含哪些?
最佳的答案,包含所有实名 binder 中实现的
dump 接口中打印的数据,具体可以搜索源
码,
如何使用dumpsys信息,一些变量打印
service list | grep power 先查是否有这个service
dumpsys power | grep Last 在dump 查看service里面的一些变量打印
winscope,perfetto 分析工具
Gpio口的输入输出, 输出是外部设备可以控制gpio这个节点 高低电平 输入 板子上可以读取这些节点的值,外部不可以控制
adb shell
logcat ActivityManager:I MyApp:D *:S
示例说明:支持所有的日志信息,除了那些标签为"ActivityManager"和优先级为"Info"以上的、标签为
"MyApp"和优先级为"Debug"以上的。