Android ROM 常见debug方法

本文介绍了多种Android平台上的调试方法,包括使用logcat捕获日志、调整SELinux模式、调用堆栈跟踪、设置系统参数、利用dumpsys进行系统状态抓取、通过ADB命令管理应用程序和服务等。还详细说明了如何使用pm和am命令来安装、管理和测试应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>启动ActivitystartActivityAsUser
am startservice <INTENT>启动ServicestartService
am stopservice <INTENT>停止ServicestopService
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创建bugreportrequestBugReport
am dumpheap <pid> <file>进程pid的堆信息输出到filedumpheap
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 <包名或组件名>enablePMS.setEnabledSetting
disable <包名或组件名>disablePMS.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
  1. dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大;
  2. procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;
  3. cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况;
  4. free适用场景: 只查看系统的可用内存;
  5. showmap适用场景: 查看进程的虚拟地址空间的内存分配情况;
  6. vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况
<think>嗯,用户想知道如何在Android设备上检测当前运行的版本是否为userdebug。我需要根据他们提供的引用资料来整理答案。首先,引用1提到通过TARGET_BUILD_VARIANT来判断编译版本,如果是userdebug或eng的话,ALLOW_ADBD_NO_AUTH为1。这可能是在编译时的属性,但用户可能想知道在运行时如何检测。然后引用3提到了adb shell命令来查看版本,比如通过getprop或者检查ro.build.type属性。 用户的问题分两个部分:检测当前运行的build类型是否为userdebug,以及如何在代码中进行判断。根据引用3,使用adb shell getprop ro.build.type可以返回user、userdebug或eng。这应该是一个直接的方法。另外,在代码中,可以通过Build.TYPE来获取这个属性,比如Build.TYPE.equals("userdebug")。需要确认这个字段是否可靠,但根据常见Android API,Build类确实包含这些信息。 另外,引用1提到的TARGET_BUILD_VARIANT可能是在编译时的变量,而用户可能需要的是运行时检测。所以答案应该集中在运行时的方法,比如使用系统属性或者Build类的字段。另外,用户可能没有root权限,所以方法应该不需要root。adb方法适合通过命令行检查,而代码中的方法适合在应用内部判断。 还要注意用户可能是在开发过程中需要这个判断,比如根据不同的版本启用不同的功能或日志。需要确保提供的方法准确,并且考虑到不同的设备可能有不同的设置,比如自定义ROM可能修改这些属性,但一般情况下,ro.build.type是标准的。</think>在Android中检测当前设备是否为userdebug版本,可以通过以下方法实现: ### 方法一:通过系统属性获取 1. 使用`adb shell`执行命令: ```bash adb shell getprop ro.build.type ``` 若输出结果为$userdebug$,则表明当前为调试版本。其他可能结果包括$user$(正式版)和$eng$(工程机)[^3]。 2. 在Java代码中判断: ```java if (Build.TYPE.equals("userdebug")) { // 当前为userdebug版本 } ``` 通过`Build.TYPE`字段直接获取编译类型[^2]。 ### 方法二:检查adb root权限 在userdebug版本中可通过以下命令验证: ```bash adb root adb remount ``` 若成功获取root权限且可重新挂载系统分区,则表明是调试版本(注意:需要设备已开启USB调试授权)[^1]。 ### 方法三:查看系统文件 检查`/system/build.prop`文件中的属性: ```bash adb shell grep "ro.build.type" /system/build.prop ``` 该文件包含完整的构建属性信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值