Android各种调试命令
控制台下
写mac跟sn
#写MAC
su
echo 1 > /sys/class/unifykeys/attach
echo mac > /sys/class/unifykeys/name
echo 00:22:6D:D2:27:13 > /sys/class/unifykeys/write
cat /sys/class/unifykeys/read
#写SN
su
echo 1 > /sys/class/unifykeys/attach
echo usid > /sys/class/unifykeys/name
echo 2023011038 > /sys/class/unifykeys/write
cat /sys/class/unifykeys/read
#读MAC
adb shell getprop ro.boot.mac
#读SN
adb shell getprop ro.serialno
pm系列
pm工具为包管理(package manager)的简称,可以使用pm工具来执行应用的安装和查询应用包的信息、系统权限、控制应用。pm工具是Android开发与测试过程中必不可少的工具。通常放置在System/bin下。
# 列出所有已安装应用程序的包名信息
pm list packages
# 查询所有系统应用的包名
pm list packages -s
# 查询所有第三方应用的包名
pm list packages -3
# 获取指定应用程序包(PACKAGE)的详细信息,包括包名、版本号、权限等
pm dump PACKAGE
# 启用指定包名的应用程序
pm enable PACKAGE_NAME
# 卸载软件
pm uninstall PACKAGE_NAME
# 禁用指定包名的应用程序
pm disable PACKAGE_NAME
# 授权给指定包名的应用程序指定权限
pm grant PACKAGE_NAME PERMISSION
# 撤销指定包名的应用程序指定权限
pm revoke PACKAGE_NAME PERMISSION
# 清除指定包名应用程序的数据及缓存
pm clear PACKAGE_NAME
# 强制停止指定包名的应用程序
am force-stop PACKAGE_NAME
am系列
# 通过命令启动APK
am start -n APK包名/启动类名
截屏录屏
# 截屏
/system/bin/screencap -p /sdcard/screencap.png
# 录屏10秒钟
screenrecord --time-limit 10 /sdcard/BlackScreen.mp4
抓取log
# 清除当前日志缓冲区的内容
logcat -c
# 捕获设备上的日志,使用 "threadtime" 格式显示,并将日志输出到 "/data/123.log" 文件
logcat -c && logcat -v threadtime > /data/123.log
# 捕获设备上的日志,使用 "time" 格式显示,并将日志输出到 "/data/123.log" 文件
logcat -c && logcat -v time > /data/123.log
# 使用adb pull命令将设备上的 "/data/123.log" 文件拉到本地目标路径
adb pull /data/123.log /本地目标路径/
控制gpio口
# 创建 GPIO 控制口,将 GPIO 编号 488 导出到/sys/class/gpio/ 目录下
echo 488 > /sys/class/gpio/export
# 查看 GPIO 控制口的方向,输入还是输出
cat /sys/class/gpio/gpio488/direction
# 设置 GPIO 控制口的方向为输出
echo out > /sys/class/gpio/gpio488/direction
# 设置 GPIO 控制口的值为高电平(1),将 GPIO 置为高电平状态
echo 1 > /sys/class/gpio/gpio488/value
# 设置 GPIO 控制口的值为低电平(0),将 GPIO 置为低电平状态
echo 0 > /sys/class/gpio/gpio488/value
# 取消 GPIO 的导出,释放 GPIO 控制口
echo 488 > /sys/class/gpio/unexport
获取系统属性
# 获取系统的属性
getprop
e.g :getprop persist.sys.timezone
# 设置系统的属性
setprop
e.g :setprop persist.sys.timezone Asia/Tokyo
log级别
echo 7 >/proc/sys/kernel/printk
查看内存
adb shell df -h 查看分区情况
du -sh * 查询目录的磁盘使用空间
adb shell dumpsys meminfo $package_name or $pid 获取单个进程对应的内存信息
SVC系列
svc power stayon [true|false|usb|ac|wireless] // 屏幕保持亮起或暗屏 [长亮|长暗|usb接入长亮|充电长亮|连接wifi长亮]
svc power reboot [reason] // 重启设备,可选参数 [reason] 表示重启原因
svc power shutdown // 关机
svc power forcesuspend [time] // 强制休眠,time为定时休眠时间(毫秒)
svc usb setFunctions [function] // 设置USB功能,[function] 可选项:`mtp`, `ptp`, `rndis`, `midi`
svc usb getFunctions // 获取当前启用的USB功能列表
svc usb resetUsbGadget // 重置USB设备
svc data enable // 打开数据流量
svc data disable // 关闭数据流量
svc wifi enable // 打开Wi-Fi
svc wifi disable // 关闭Wi-Fi
svc nfc enable // 打开NFC
svc nfc disable // 关闭NFC
svc bluetooth enable // 打开蓝牙
svc bluetooth disable // 关闭蓝牙
uboot下
设置kernel log级别
# 设置环境变量 loglevel 的值为 7
s4_ap222# env set loglevel 7
# 将当前环境变量保存到存储设备中
s4_ap222# env save
# 重新启动设备,应用新的环境变量设置
s4_ap222# reboot
控制gpio口
# 查看所有 GPIO 口的状态
gpio status -a
# 拉高指定 GPIOX_8 口的电平
gpio set GPIOX_8
# 拉低指定 GPIOX_8 口的电平
gpio clear GPIOX_8
不过这个操作方式在reboot之后就失去作用了
code下
查看apk的包名和权限
./sdk_name/prebuilts/sdk/tools/linux/bin/aapt dump badging /apk_path/apkName
#需要修改sdk_name\apk_path\apkName为自己对应的信息
example: ./prebuilts/sdk/tools/linux/bin/aapt dump badging ./xxx.apk
删除out下面的.dtb文件(修改dtsi文件时需要)
#查找out目录下的所有dtb文件并执行删除
find out/ -name *.dtb | xargs rm -rf
查看一个apk的详细信息
# 查看 APK 文件的基本信息,包括包名、版本等
aapt dump badging xxx.apk
# 使用 grep 过滤出 APK 文件的包名信息
aapt dump badging xxx.apk | grep package
# 使用 grep 过滤出 APK 文件的权限信息
aapt dump badging xxx.apk | grep permission
# 使用 grep 过滤出 APK 文件的活动(Activity)信息
aapt dump badging xxx.apk | grep activity
# 解包查看完整的 AndroidManifest.xml
aapt dump xmltree base.apk AndroidManifest.xml
这个命令可以查看到apk的包名,版本信息,启动活动,SDK版本,权限信息,目标设备等
也可以在【consol】下使用
dumpsys package 包名
这个命令不仅会显示apk的基本信息还会显示UID,进程信息等,比较多,建议使用的时候结合grep
常用信息
TV的settings:am start -n com.android.tv.settings/.MainSettings
TV的settings代码位置:vendor/amlogic/common/apps/DroidTvSettings/Settings/
AOSP Settings代码位置:packages/apps/Settings/
AOSP Settings:am start -n com.android.settings/.Settings
log: import android.util.Log;
开机启动的DefaultActivity :packages/apps/Provision/src/com/android/provision/DefaultActivity.java
开机执行的shell脚本:
build/make/tools/buildinfo.sh
输出系统属性:
settings get
在代码中给apk签名:
java -Djava.library.path="prebuilts/sdk/tools/linux/lib64" -jar ./prebuilts/sdk/tools/lib/signapk.jar vendor/xxxx/android-certs/platform.x509.pem vendor/xxxx/android-certs/platform.pk8 OTAForAB-1.1.apk OTAForAB-1.1_si.apk
常见问题
Android 11 进入开发者模式显示developer options are not available for this user
原因是开机没有执行com.android.provision/.DefaultActivity这个开机向导活动
注意:如果这个DefaultActivity没有效果,那说明没有编译Provision,需要编译这个。
手动输入
settings put global device_provisioned 1
settings put secure user_setup_complete 1
settings put secure tv_user_setup_complete 1
然后重新打开就可以了,更多信息请查看下面的commit:Changed Provision app so it can trigger device owner provisioning
❗目录结构
device:关于各种不同产品的配置,一些ro. 属性,一些软件的内置(Settings), "kl"文件,init.rc文件(权限和服务),开机动画, 语言时区
vendor: 厂商的定制化软件
framework: 系统设置、app权限、按键监听
Android源码根目录 | 描述 |
---|---|
art | 全新的ART运行环境 |
bionic | 系统C库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及generic等基础开发包配置 |
cts | Android兼容性测试套件标准 |
dalvik | dalvik虚拟机 |
developers | 开发者目录 |
development | 应用程序开发相关 |
device | 设备相关配置 |
docs | 参考文档目录 |
external | 开源模组相关文件 |
frameworks | 应用程序框架,Android系统核心部分,由Java和C++编写 |
hardware | 主要是硬件抽象层的代码 |
kernel | Android的内核配置 |
libcore | 核心库相关文件 |
libnativehelper | 动态库,实现JNI库的基础 |
out | 编译完成后代码输出在此目录 |
pdk | Plug Development Kit 的缩写,本地开发套件 |
platform_testing | 平台测试 |
prebuilts | x86和arm架构下预编译的一些资源 |
sdk | sdk和模拟器 |
packages | 应用程序包 |
system | 底层文件系统库、应用和组件 |
test | 安卓供应商测试套件(VTS)实验室 |
toolchain | 工具链文件 |
tools | 工具文件 |
Makefile | 全局Makefile文件,用来定义编译规则 |
vendor | 厂商定制内容 |