0%

Android开发工具和命令手册

ADB(Android Debug Bridge)安卓调试工具

ADB是连接Android手机与PC端的桥梁,通过adb可以管理、操作模拟器和设备,如安装软件、查看设备软硬件参数、系统升级等

Mac配置环境变量

  1. 修改~/.bash_profile文件如下
1
2
3
export ANDROID_HOME=/Users/name/Library/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools`
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
  1. 执行source .bash_profile生效,如果使用了zsh,在~/.zshrc文件末尾添加source ~/.bash_profile

常用adb命令

  • adb connect <手机ip[:端口号]>:连接adb,默认端口号为5555
  • adb 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,大部分系统无法直接root
  • adb 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及以下:

  1. 使用USB连接
  2. 输入adb tcpip 5555
  3. 拔掉USB
  4. 输入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
2
3
4
5
6
7
8
9
10
11
12
选项
"-s": 设置输出日志的标签, 只显示该标签的日志;
"-f": 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
"-r": 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
"-n": 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
"-v": 设置日志的输出格式, 注意只能设置一项;
"-c": 清空所有的日志缓存信息;
"-d": 将缓存的日志输出到屏幕上, 并且不会阻塞;
"-t": 输出最近的几行日志, 输出完退出, 不阻塞;
"-g": 查看日志缓冲区信息;
"-b": 加载一个日志缓冲区, 默认是 main, 下面详解;
"-B": 以二进制形式输出日志;
1
2
3
4
5
6
7
8
过滤项格式 : <tag>[:priority] , 标签:日志等级, 默认的日志过滤项是"*:I";如"*:E"表示过滤Error以上。
-- V : Verbose (明细);
-- D : Debug (调试);
-- I : Info (信息);
-- W : Warn (警告);
-- E : Error (错误);
-- F: Fatal (严重错误);
-- S : Silent(Super all output) (最高的优先级, 可能不会记载东西);

常用android调试命令手册

可以结合grep命令过滤关键信息。

grep [options] PATTERN FILEgrep -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 startam startserviceam 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:开启/关闭wifi
  • getpropsetprop:查看、设置系统属性,结合grep过滤可以查看系统信息,如内存大小、版本等
  • settings get/put <namespace:system/global/secure> <key> [value]:查看Settings Provider属性
    • settings get system date_formatsettings 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]:查看和设置设备分辨率和dpi
  • reboot:重启设备
  • screencap 1.png:截屏
  • screenrecord 1.mp4:录屏
  • cmd overlay list:查看overlay apk
  • tcpdump -p -vv -s 0 -w /mnt/sdcard/capture.pcap:抓包,使用wireshark分析。系统需要root
  • busybox vi <file>:busybox集成了linux常用工具和命令,短小精悍,适合嵌入式平台。系统不支持vi等命令时可以使用busybox。
  • find ./ -name runtime-permissions.xml:查找文件
  • ifconfig:查看ip地址和mac地址
  • pwd:输出当前路径
  • ping:尝试连接ip或域名
  • chmod [权限数字] [路径]:修改文件权限,777表示任何用户可读可写
  • md5 [文件]:获取文件md5值

终端登录工具

  1. adb shell
  2. windows上使用MobaXterm:支持SSH、FTP、串口、VNC等
  3. mac上使用串口:通过screen <串口名称,如tty.usbserial-gggggggg1> <波特率,如115200>连接

tty(Teletypes,或者teletypewriters):终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

tty也是一个Unix命令,用来给出当前终端设备的名称。

在Linux系统的设备特殊文件目录/dev/下,TTY设备包括虚拟控制台,串口以及伪终端设备

/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。

Prop属性

原理

系统开机后会从以下系统文件中读取默认的属性,并写入共享内存中。按顺序读取,后面的会覆盖前面的

1
2
3
4
5
// bionic/libc/include/sys/_system_properties.h
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
#define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// system/core/init/property_service.c
void start_property_service(void)
{
int fd;
//...
load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
#ifdef ALLOW_LOCAL_PROP_OVERRIDE
load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
#endif /* ALLOW_LOCAL_PROP_OVERRIDE */
/* Read persistent properties after all default values have been loaded. */
load_persistent_properties();
update_legacy_atvc_properties();
//...
}

设置方式

  1. setprop、getprop命令
  2. 修改prop系统文件:需要root
  3. Java调用,有权限限制
1
2
3
4
5
//java API
import android.os.SystemProperties;

public static String get(String key, String def) {}
public static void set(String key, String val) {}

注意事项

  1. ro.开头的属性只读
  2. persist.开头的属性名永久保存。其他属性(debug.、service.开头)开机之后清除:
    1. 设置persist属性的时候会写入/data/property/persistent_properties文件中
    2. 加载属性的时候会从该文件读取
  3. 直接编辑prop文件修改属性,会永久保存
  4. 属性名最大长度是32,属性值最大长度是92
1
2
3
//bionic/libc/include/sys/system_properties.h
#define PROP_NAME_MAX 32
#define PROP_VALUE_MAX 92

模拟器

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】

Win10开启虚拟化技术

总结

  • 如果是IntelCPU还是建议使用HAXM,支持硬件加速。
  • 如果是AMD CPU建议使用Win10的Hyper-V技术
  • 建议使用x86模拟器,速度能快很多倍

参考Android模拟器安装

欢迎关注我的其它发布渠道