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时间占比等情况