ADB(Android Debug Bridge)安卓调试工具
ADB是连接Android手机与PC端的桥梁,通过adb可以管理、操作模拟器和设备,如安装软件、查看设备软硬件参数、系统升级等
Mac配置环境变量
- 修改
~/.bash_profile
文件如下
1 | export ANDROID_HOME=/Users/name/Library/Android/sdk |
- 执行
source .bash_profile
生效,如果使用了zsh
,在~/.zshrc
文件末尾添加source ~/.bash_profile
常用adb命令
adb connect <手机ip[:端口号]>
:连接adb,默认端口号为5555adb disconnect
:断开连接adb devices
:查看连接的设备adb [command] --help
:查看某个命令的帮助adb install 电脑路径/xxx.apk
:安装apk到手机。-r覆盖安装,-t安装测试包,-d忽略版本大小adb pull 手机存储路径 电脑路径
:从手机拷贝到电脑adb push 电脑路径 手机存储路径
:从电脑拷贝到手机adb shell
:进入Android终端。-s
:如果连接了多个设备,使用-s指定设备adb root
:开启root,大部分系统无法直接rootadb remount
:挂载目录,设置为可读写(需先root),或者进入终端输入mount -o remount,rw [路径]
- 开启无线adb(需先root):连接串口或USB,进入终端输入
stop adbd
setprop service.adb.tcp.port 5555
start adbd
adb kill-server
:杀死adb服务adb start-server
:启动adb服务
无线连接ADB
参考官方文档
Android11及更高版本:开发者选项中打开无线调试
Android10及以下:
- 使用USB连接
- 输入
adb tcpip 5555
- 拔掉USB
- 输入
adb connect <ip地址>:5555
输出设备日志
adb logcat > logcat.log
:输出日志到logcat.log文件夹,如果没有则新建adb logcat > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%时%time:~3,2%分%time:~6,2%.log"
:以日期时间命名文件logcat -d -f <文件名>
:输出日志,-d表示将缓存日志全部输出dmesg
:查看linux kernel开机日志
adb logcat [选项] [过滤项]
1 | 选项 |
1 | 过滤项格式 : <tag>[:priority] , 标签:日志等级, 默认的日志过滤项是"*:I";如"*:E"表示过滤Error以上。 |
常用android调试命令手册
可以结合grep
命令过滤关键信息。
grep [options] PATTERN FILE
:grep -inR enable_global_input *
- -i:忽略大小写
- -n:输出匹配的行号
- -R:递归遍历文件夹
- -E:可以输入多个:
grep -E "word1|word2|word3" file.txt
dumpsys、pm、am、wm
等命令本质也是通过执行代码运行的,可以在framework中搜索到相关代码,了解原理
dumpsys
dumpsys activity
:输出Android组件信息,可以加上a[ctivities]、b[roadcasts]、s[ervices]、prov[iders]等过滤特定信息dumpsys window windows
:获取窗口信息,结合grep mFocus
获取当前窗口dumpsys package <packagename>
:输出应用包信息,结合grep version
查看应用版本,结合grep path
查看应用路径dumpsys meminfo
:查看内存信息dumpsys cpuinfo
:查看cpu信息
pm
pm list package -f
:输出所有已安装apk- -f:输出安装路径
- -3:过滤出第三方应用
- -s:过滤出系统应用
- -d:过滤disable应用
- -U:显示应用uid
- –uid UID:过滤指定uid应用
- –user USER_ID:过滤指定userid应用
pm install/uninstall <apk文件>
:安装应用,-r覆盖安装,-t安装测试包,-d忽略版本大小pm path [package_name]
:查看应用安装路径pm dump <packagename>
:查看应用信息pm clear
:清除应用缓存数据pm enable/disable <包名/组件名>
:启用/禁用组件,设置为disable之后组件无法运行。如开机向导应用,运行完毕之后禁用,下次开机就会直接进入桌面pm list permissions [group]
:输出已知权限-d
:仅列出危险权限-g
:按组进行整理
pm list features
:输出系统支持的功能pm list libraries
:输出系统支持的所有库pm list users
:输出系统中的所有用户
am
am start
、am startservice
、am broadcast
:启动组件- -p:包名
- -n:包名/Manifest注册组件名。
- -a:action启动
- -c:category
- -d:data,uri启动
am force-stop <包名>
:退出应用
input
input
:输入事件input keyevent <keycode>
:输入按键事件input text xxx
:输入文本input tap <x> <y>
:输入点击事件input swipe <x1> <y1> <x2> <y2>
:输入滑动事件- …
getevent
:获取按键键值sendevent <device:设备> <type:事件类型> <scanCode:linux键值> <value:键值>
:发送按键事件- scanCode是linux层的键值和android keycode不一样。红外按键是从底层驱动传入,转换为Linux层scanCode,再转换为Android的KeyCode。
- 1为按下,0为松开
- 如
sendevent /dev/input/event0 1 658 1 && sendevent /dev/input/event0 0 0 0 && sendevent /dev/input/event0 1 658 0 && sendevent /dev/input/event0 0 0 0
性能相关
dumpsys meminfo
:查看内存信息dumpsys procstats
:查看进程内存、CPU信息dumpsys cpuinfo
:查看cpu信息dumpsys batterystats <package_name>
:查看应用能耗cat /proc/meminfo
:查看设备内存free
:查看可用内存procrank
:查看所有进程内存使用showmap -a <pid>
:查看进程内存信息和对应的地址区域df -h
:查看设备存储空间cat /proc/进程号/oom_adj
:查看当前进程adj值cat /proc/进程号/oom_score_adj
:查看真正有效的adj值vmstat [Delay] [Count]
:查看CPU和内存使用率,虚拟内存交换情况,IO读写情况top
:查看进程信息,内存和CPU使用情况-m <num>
:显示多少个进程-n <num>
:刷新次数-d <num>
:刷新间隔-s <col>
:按列排序,如cpu、vss、rss、thr等-t
:显示线程信息
其他
kill -9 $(pidof com.afauria.sample)
:kill某个应用进程,避免每次ps查看进程号uiautomator dump [file]
:输出layout结构层级logcat -d -f <文件名>
:输出日志,-d表示将缓存日志全部输出dmesg
:查看内核日志cat /sys/class/net/wlan0/address
:查看mac地址svc wifi enable/disable
:开启/关闭wifigetprop
、setprop
:查看、设置系统属性,结合grep过滤可以查看系统信息,如内存大小、版本等settings get/put <namespace:system/global/secure> <key> [value]
:查看Settings Provider属性settings get system date_format
、settings put system date_format dd-MM-yyyy
:设置日期格式settings put global http_proxy 127.0.0.1:8888
:设置代理,用于fiddle抓包settings put global adb_enabled 0
:关闭USB调试
wm size [如1920x1080]
、wm density [如240]
:查看和设置设备分辨率和dpireboot
:重启设备screencap 1.png
:截屏screenrecord 1.mp4
:录屏cmd overlay list
:查看overlay apktcpdump -p -vv -s 0 -w /mnt/sdcard/capture.pcap
:抓包,使用wireshark分析。系统需要rootbusybox vi <file>
:busybox集成了linux常用工具和命令,短小精悍,适合嵌入式平台。系统不支持vi等命令时可以使用busybox。find ./ -name runtime-permissions.xml
:查找文件ifconfig
:查看ip地址和mac地址pwd
:输出当前路径ping
:尝试连接ip或域名chmod [权限数字] [路径]
:修改文件权限,777表示任何用户可读可写md5 [文件]
:获取文件md5值
终端登录工具
- adb shell
- windows上使用MobaXterm:支持SSH、FTP、串口、VNC等
- mac上使用串口:通过
screen <串口名称,如tty.usbserial-gggggggg1> <波特率,如115200>
连接
tty(Teletypes,或者teletypewriters):终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
tty也是一个Unix命令,用来给出当前终端设备的名称。
在Linux系统的设备特殊文件目录/dev/下,TTY设备包括虚拟控制台,串口以及伪终端设备
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。
Prop属性
原理
系统开机后会从以下系统文件中读取默认的属性,并写入共享内存中。按顺序读取,后面的会覆盖前面的
1 | // bionic/libc/include/sys/_system_properties.h |
1 | // system/core/init/property_service.c |
设置方式
- setprop、getprop命令
- 修改prop系统文件:需要root
- Java调用,有权限限制
1 | //java API |
注意事项
- ro.开头的属性只读
- persist.开头的属性名永久保存。其他属性(debug.、service.开头)开机之后清除:
- 设置persist属性的时候会写入
/data/property/persistent_properties
文件中 - 加载属性的时候会从该文件读取
- 设置persist属性的时候会写入
- 直接编辑prop文件修改属性,会永久保存
- 属性名最大长度是32,属性值最大长度是92
1 | //bionic/libc/include/sys/system_properties.h |
模拟器
Windows运行Android模拟器
Intel CPU
Intel CPU使用HAXM(Hardware Accelerated Execution Manager)技术,使用基于 Intel(R) Virtualization Technology (VT) 的硬件加速,实现 Android 模拟器加速。
需要在BIOS中开启硬件支持VT,并且Android sdk需要安装Intel x86 Emulator Accelerator(HAXM)扩展。
AMD CPU
AMD通过Android Studio运行模拟器会报错,如”提示CPU不支持”,或者”建议使用x86模拟器”。在BIOS中开启虚拟化也没用。
解决办法:
- 使用GenyMotion模拟器,并且在Android Studio上安装GenyMotion插件。
- 问题:GenyMotion使用Virtual Box虚拟化技术,而我的电脑运行了Docker,Docker在Windows上使用的是Hyper-V虚拟化技术,两个一起开会出问题。
- 官方在Android Emulator 27.3.1上给出了解决方案,结合了Win10的Hyper-V技术。
- Win10系统
- 在Android sdk中安装Android Emulator 27.3.1以上的版本
- 安装x86的镜像,x86_64(打开很慢)和armeabi-v7a(更慢)
- 在控制面板->程序->启用或关闭Windows功能中,打开Windows虚拟机监控程序平台(Windows Hypervisor Platform)
- 重启电脑
打开Hyper-V技术
打开【Windows程序和功能->启用或关闭Windows功能->选中Hyper-V】
总结
- 如果是IntelCPU还是建议使用HAXM,支持硬件加速。
- 如果是AMD CPU建议使用Win10的Hyper-V技术
- 建议使用x86模拟器,速度能快很多倍