Android ROM 常见debug方法
logcat
1 原生自带开机抓log, 如果没有抓取到,可能和selinux权限有关
setprop persist.logd.logpersistd logcatd
2 设置logcat buffer
// reboot生效,log buffer 16M
setprop persist.logd.size 16777216
// 重启失效
logcat -G 10M
selinux
Enforcing: SELinux处于开启状态,会阻止进程违反SELinux策略访问资源的行为
Permissive: SELinux关闭,不会阻止进程违反SELinux策略访问资源的行为
getenforce
setenforce [ Enforcing | Permissive | 1 | 0 ]
calltrace
java
try { ...... }catch(Exception e){ e.printStackTrace(); } }
c/c++
CallStack::logStack(LOG_TAG);
Add the this line in Android.mk : LOCAL_SHARED_LIBRARIES := libutils libutilscallstack
settings
settings put system sound_effects_enabled 0
settings get system sound_effects_enabled
dumpsys
// 可以dump的当前所有服务
adb shell service list
dumpsys activity services
dumpsys activity broadcasts
dumpsys SurfaceFlinger
Debugging Log
adb shell dmesg > dmesg.txt
adb shell bugreportz > bugreportz.txt
am
命令 | 功能 | 实现方法 |
---|
am start [options ] <INTENT > | 启动Activity | startActivityAsUser | am startservice <INTENT > | 启动Service | startService | am stopservice <INTENT > | 停止Service | stopService | am broadcast <INTENT > | 发送广播 | broadcastIntent | am kill <PACKAGE > | 杀指定后台进程 | killBackgroundProcesses | am kill-all | 杀所有后台进程 | killAllBackgroundProcesses | am force-stop <PACKAGE > | 强杀进程 | forceStopPackage | am hang | 系统卡住 | hang | am restart | 重启 | restart | am bug-report | 创建bugreport | requestBugReport | am dumpheap <pid > <file > | 进程pid的堆信息输出到file | dumpheap | am send-trim-memory <pid > <level > | 收紧进程的内存 | setProcessMemoryTrimLevel | am monitor | 监控 | MyActivityController.run |
常用参数
-a <ACTION> : 指定Intent action, 实现原理Intent.setAction();-n <COMPONENT> : 指定组件名,格式为{包名}/.{主Activity名},实现原理Intent.setComponent();-d <DATA_URI> : 指定Intent data URI-t <MIME_TYPE> : 指定Intent MIME Type-c <CATEGORY> [-c <CATEGORY>] ...] :指定Intent category,实现原理Intent.addCategory()-p <PACKAGE> : 指定包名,实现原理Intent.setPackage();-f <FLAGS> : 添加flags,实现原理Intent.setFlags(int ),紧接着的参数必须是int型
pm
命令 | 功能 | 实现方法 |
---|
list packages | 列举app包信息 | PMS.getInstalledPackages | install [options ] <PATH > | 安装应用 | PMS.installPackageAsUser | uninstall [options ]<package > | 卸载应用 | IPackageInstaller.uninstall | enable <包名或组件名 > | enable | PMS.setEnabledSetting | disable <包名或组件名 > | disable | PMS.setEnabledSetting | hide <package > | 隐藏应用 | PMS.setApplicationHiddenSettingAsUser | unhide <package > | 显示应用 | PMS.setApplicationHiddenSettingAsUser | get-install-location | 获取安装位置 | PMS.getInstallLocation | set-install-location | 设置安装位置 | PMS.setInstallLocation | path <package > | 查看App路径 | PMS.getPackageInfo | clear <package > | 清空App数据 | AMS.clearApplicationUserData | get-max-users | 最大用户数 | UserManager.getMaxSupportedUsers | force-dex-opt <package > | dex优化 | PMS.forceDexOpt | dump <package > | dump信息 | AM.dumpPackageStateStatic | trim-caches <目标size > | 紧缩cache目标大小 | PMS.freeStorageAndNotify |
pm install命令
安装应用
pm install [options] <PATH>
其中[options]参数:
- -r: 覆盖安装已存在Apk,并保持原有数据;
- -d: 运行安装低版本Apk;
- -t: 运行安装测试Apk
- -i : 指定Apk的安装器;
- -s: 安装apk到共享快存储,比如sdcard;
- -f: 安装apk到内部系统内存;
- -l: 安装过程,持有转发锁
- -g: 准许Apk manifest中的所有权限;
debuggerd
debuggerd -b [pid],可输出Native进程的调用栈
sysrq-trigger
// 导出内存分配信息
echo m > /proc/sysrq-trigger
// 导出当前任务状态信息
echo t > /proc/sysrq-trigger
// 导出当前CPU寄存器和标志位信息
echo p > /proc/sysrq-trigger
debuggerd
debuggerd -b [pid],可输出Native进程的调用栈
sysrq-trigger
// 导出内存分配信息
echo m > /proc/sysrq-trigger
// 导出当前任务状态信息
echo t > /proc/sysrq-trigger
// 导出当前CPU寄存器和标志位信息
echo p > /proc/sysrq-trigger
内存分析命令
1. dumpsys meminfo
2. procrank
3. cat /proc/meminfo
4. free
5. showmap
6. vmstat
dumpsys meminfo 适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大;procrank 适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;cat /proc/meminfo 适用场景: 查看系统的详尽内存信息,包含内核情况;free 适用场景: 只查看系统的可用内存;showmap 适用场景: 查看进程的虚拟地址空间的内存分配情况;vmstat 适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况
|