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 adbdsetprop service.adb.tcp.port 5555start 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模拟器,速度能快很多倍