adb基本操作

简介

adb的全称为Android Debug Bridge,就是起到调试桥的作用。

adb是[android sdk](https://baike.baidu.com/item/android sdk?fromModule=lemma_inlink)里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备(如G1手机).

它的主要功能有:

  • 运行设备的shell(命令行)

  • 管理模拟器或设备的端口映射

  • 计算机和设备之间上传/下载文件

  • 将本地apk软件安装至模拟器或android设备

架构

adb是一个 C/S架构的应用程序,由三部分组成:

  • adb client:运行在PC上(为DDMS即IDE工作)
  • adb daemon:守护进程,运行于Emulaor
  • adb server:服务进程,运行在PC,管理adb client和adb daemon之间的通信

server与client通信的端口是5037,adb server与emulator交互时使用的端口有两个:

  • 5554专门用于与Emulator实例的连接
  • 5555专门用于与daemon连接

image-1698801892335

环境依赖

ADB依赖

  • JDK

    Java开发工具包

  • platform-tools

    Android平台工具包

下载

JDK的安装以及环境变量的配置,在这里就不详细赘述了,网上一搜一大把。

下面提供几个不同操作系统下的adb工具下载地址:

下载完以后,解压到你想解压的地方

配置

为了方便日后命令行的使用,这里以Windows系统为例,配置一下adb的环境变量。

这里需要注意下步骤5:这里的文件夹路径指向的是你上面下载的压缩包解压的目录路径

image-1698801873477

验证

输入以下两个指令以验证环境是否安装正确:

  • java -version 查看java版本
  • adb version 查看adb版本
C:\Users\liaoy>java -version
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)

C:\Users\liaoy>adb version
Android Debug Bridge version 1.0.41
Version 33.0.3-8952118
Installed as C:\Program Files\platform-tools\adb.exe

如果上面两步验证没有问题以后,那么下面我们就可以开始进入使用环节了

连接设备

adb支持两种连接android系统的方式:

  1. USB方式
  2. 网络方式(ADB远程调试Android设备)

USB方式

  1. Android设备处于开发者模式

    系统–>关于手机–>版本号(连续点击多次至提示打开开发者模式)。

  2. USB连接Android设备

    USB连接Android设备,在开发这模式中,将USB调试和USB安装、USB调试(安全设置),这几个选项都打开,下拉状态栏中USB使用方式选择:传输文件

  3. 验证是否连接设备

    C:\Users\liaoy>adb devices
    List of devices attached
    145621a0	device
    

    当出现xxxxx device字样,则代表设备已经连接成功

  4. 当PC接入的Android设备数量>1台时,执行adb命令会报错提示“adb: more than one device/emulator”

    C:\Users\liaoy>adb shell
    adb:more than one device/emulator
    

    出现以上情况可以使用“-s”参数来指定要操作的设备,例如:

    C:\Users\liaoy>adb -s 145621a0 shell
    

网络方式

  1. 确保电脑和Android设备需连同一wifi

  2. 使用usb数据线连接设备

  3. 设置wifi adb连接端口号

    C:\Users\liaoy>adb tcpip 5555
    restarting in TCP mode port: 5555
    
  4. 查看连接设备IP

    C:\Users\liaoy>adb shell ifconfig wlan0
    wlan0     Link encap:UNSPEC    Driver icnss
              inet addr:192.168.8.124  Bcast:192.168.8.255  Mask:255.255.255.0
              inet6 addr: fe80::e219:9b44:140c:efb7/64 Scope: Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:22787838 errors:0 dropped:0 overruns:0 frame:0
              TX packets:15743149 errors:0 dropped:25 overruns:0 carrier:0
              collisions:0 txqueuelen:3000
              RX bytes:23279809590 TX bytes:8007838414
    
  5. 拔掉usb数据线

  6. 通过IP连接至安卓设备

    • 通过adb connect 指定端口号则连接指定设备的端口号,若不指定端口号,则默认连接5555端口
    C:\Users\liaoy>adb connect 192.168.8.124:5555
    already connected to 192.168.8.124:5555
    
  7. 断开连接

    • 通过adb disconnect 指定ip端口号则断开指定设备的连接,若不指定,则断开所有设备连接
    C:\Users\liaoy>adb disconnect 192.168.8.124:5555
    disconnected 192.168.8.124:5555
    

抓取指定应用日志

1. 获取应用的包名

通过以下两种方式获取需要抓取日志的应用包名

  • 输入命令:adb shell am monitor,随后运行应用程序

    C:\Users\liaoy>adb shell am monitor
    Monitoring activity manager...  available commands:
    (q)uit: finish monitoring
    ** Activity starting: com.baidu.searchbox
    ** Activity resuming: com.baidu.searchbox
    ** Activity resuming: com.baidu.searchbox
    

    通过以上命令可以获取到当前设备在activity状态的程序

  • 输入命令:adb shell pm list packages -3

    C:\Users\liaoy>adb shell pm list packages -3
    package:com.sohu.inputmethod.sogou
    package:com.baidu.searchbox
    package:com.ibimuyu.lockscreen
    package:com.UCMobile
    package:com.ss.android.ugc.aweme
    package:com.tencent.mobileqq
    package:com.shuame.sprite
    package:com.jingdong.app.mall
    package:com.alibaba.android.rimet
    package:com.taobao.taobao
    package:com.qitu.market
    

    通过以上命令可以获取到所有已安装应用的包名

2. 抓取应用日志

  • 进入adb shell;

  • 使用命令logcat | grep com.taobao.taobao(软件的包名)

    C:\Users\liaoy>adb shell
    HWASK-H:/ $ logcat | grep com.taobao.taobao
    11-14 15:29:45.373  4751  4751 I RMS.HwSysResManager: preloadAppForLauncher packageName com.taobao.taobao preloadType 101
    11-14 15:29:45.409  2090  2390 I HwWindowManagerServiceEx: set launch origin and target for: com.taobao.taobao with delay 3000
    11-14 15:29:45.414  2090  2390 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 hwFlg=0x10 cmp=com.taobao.taobao/com.taobao.tao.welcome.Welcome bnds=[192,127][360,322] (has extras)} from uid 10056
    11-14 15:29:45.417  1057  1097 D AwareLog: iawared: WorkingsetProcessCommand subCmd = 354, userId=10109, pid=0, com.taobao.taobao
    11-14 15:29:45.417  1057  1097 D AwareLog: iawared: WorkingsetSendPrereadMsg com.taobao.taobao
    11-14 15:29:45.417  1057  1097 D AwareLog: iawared: WorkingsetStart com.taobao.taobao in monitor0
    11-14 15:29:45.440  2090  2390 D ActivityTaskManager: TaskLaunchParamsModifier:task=null activity=ActivityRecord{c22ef83 u0 com.taobao.taobao/com.taobao.tao.welcome.Welcome t-1} display-from-source=0 display-id=0 display-windowing-mode=1
    11-14 15:29:45.441  2090  2390 D ActivityTaskManager: TaskLaunchParamsModifier:task=null activity=ActivityRecord{c22ef83 u0 com.taobao.taobao/com.taobao.tao.welcome.Welcome t-1} display-from-source=0 display-id=0 display-windowing-mode=1 activity-options-fullscreen=Rect(0, 0 - 0, 0) non-freeform-display maximized-bounds...
    
  • 也可通过[-s]选项,参数值为:*:E 来指定日志输出级别

    • V:不过滤输出所有调试信息,包括 VERBOSE、DEBUG、INFO、WARN、ERROR
    • D:debug过滤器,输出DEBUG、INFO、WARN、ERROR调试信息
    • I:info过滤器,输出INFO、WARN、ERROR调试信息
    • W:waring过滤器,输出WARN和ERROR调试信息
    • E:error过滤器,只输出ERROR调试信息
    130|HWASK-H:/ $ logcat -s *:E | grep com.taobao.taobao
    11-14 15:38:17.326  2090  2285 E WindowManager: win=Window{c370ab1 u0 com.taobao.taobao/com.taobao.tao.welcome.Welcome EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true
    11-14 15:38:19.372  2090  2390 E WifiService: Permission violation - getConfiguredNetworks not allowed for uid=10109, packageName=com.taobao.taobao, reason=java.lang.SecurityException: UID 10109 has no location permission
    11-14 15:38:19.382  2090 14896 E WifiService: Permission violation - getConfiguredNetworks not allowed for uid=10109, packageName=com.taobao.taobao, reason=java.lang.SecurityException: UID 10109 has no location permission
    11-14 15:38:45.785 29795 30536 E ProtoDB : begin compacting: /data/user/0/com.taobao.taobao/files/lsdb-downgrade
    11-14 15:38:45.786 29795 30536 E ProtoDB : finish compacting: /data/user/0/com.taobao.taobao/files/lsdb-downgrade
    11-14 15:38:45.786 29795 30536 E ProtoDB : begin compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:45.786 29795 30536 E ProtoDB : finish compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:45.786 29795 30536 E ProtoDB : begin compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:45.786 29795 30536 E ProtoDB : finish compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:45.786 29795 30536 E ProtoDB : begin compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:45.786 29795 30536 E ProtoDB : finish compacting: /data/user/0/com.taobao.taobao/files/lsdb-uikit_navigation_extern
    11-14 15:38:47.028 30812 30930 E SharedPreferencesImpl: Couldn't rename file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml to backup file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml.bak
    11-14 15:38:47.034 29795 30237 E SharedPreferencesImpl: Couldn't rename file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml to backup file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml.bak
    11-14 15:38:47.039 30812 30930 E SharedPreferencesImpl: Couldn't rename file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml to backup file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml.bak
    11-14 15:38:47.043 29795 30237 E SharedPreferencesImpl: Couldn't rename file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml to backup file /data/user/0/com.taobao.taobao/shared_prefs/adaemon.xml.bak
    11-14 15:38:49.198 29795 30387 E ShopRouterInit: orange change : shop_router, pkgName = com.taobao.taobao
    11-14 15:38:51.281 29795 30223 E SoPatchLogger: DegradeSoUtils:->dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/base.apk"],nativeLibraryDirectories=[/data/user/0/com.taobao.taobao/app_plugins_lib, /data/user/0/com.taobao.taobao/files/swallows/arm64-v8a/0acf1bae557965135ecab91915d22646, /data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/lib/arm64, /data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/base.apk!/lib/arm64-v8a, /system/lib64, /hw_product/lib64, /system/product/lib64]]] couldn't find "libMNN_NPU.so"
    11-14 15:38:51.282 29795 30223 E MNNPyBridge: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/base.apk"],nativeLibraryDirectories=[/data/user/0/com.taobao.taobao/app_plugins_lib, /data/user/0/com.taobao.taobao/files/swallows/arm64-v8a/0acf1bae557965135ecab91915d22646, /data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/lib/arm64, /data/app/com.taobao.taobao-_ymujAQODhiOLC6_u2iTDQ==/base.apk!/lib/arm64-v8a, /system/lib64, /hw_product/lib64, /system/product/lib64]]] couldn't find "libMNN_NPU.so"
    

常用指令

  • adb start-server

    启动ADB服务

  • adb kill-server

    关闭ADB服务

  • adb devices

    列出所有设备

  • adb connect 192.168.100.1:5555

    connect 表示连接到设备
    192.168.100.1:5555 表示设备地址(address)和端口号(dport)

  • adb disconnect

    断开所有连接

  • adb reboot

    重启设备

  • adb reboot recovery

    重启设备到Recovery

  • adb reboot bootloader

    也就是常说的BL锁

  • adb shell wm size

    size 表示获取当前设备屏幕的分辨率

  • adb shell wm size 1080x1920

    size 1080x1920 表示设定屏幕分辨率为1080x1920
    注意 : 1080x1920中的x,是字母x(艾克斯)

  • adb shell wm size reset

    size reset 表示重置当前设备的屏幕分辨率恢复到默认

  • adb shell wm density

    wm density 表示获取当前屏幕密度

  • adb shell wm density 300

    wm density 300 表示设置当前设备屏幕密度为300

  • adb shell wm density reset

    wm density reset 表示重置当前设备的屏幕密度恢复到默认

  • adb shell

    进入shell模式

  • exit

    退出shell模式

  • su

    切换到Root用户

  • adb -s emulator-5554 shell

    -s 表示指定某个设备
    emulator-5554 表示设备名称

  • adb install -g -r .\easyclick.apk

    install 表示安装
    -g 表示赋予所有权限
    -r 表示覆盖安装
    .\wechat.apk 表示需要安装的apk路径支持相对和绝对路径

  • adb shell pm list package -3

    pm 表示Package Manager(包管理器)
    list 表示列表,列出
    package 表示包
    -3 表示第三方应用(即用户自行安装的应用)
    -s 表示系统应用
    -3可省,列出设备所有包名

  • adb shell pm path com.gibb.easyclick

    pm 表示Package Manager(包管理器)
    path 表示安装路径
    com.gibb.easyclick 表示包名,此指令的执行结果,即显示出微信安装包所在的位置路径

  • adb shell pm clear com.gibb.easyclick

    pm 表示Package Manager(包管理器)
    clear 表示清空
    com.gibb.easyclick 表示包名,此指令的执行结果,即清空微信所有数据,恢复到第一次安装的状态
    此指令等同于清空应用详情界面中的存储(Storage)-数据(Data)

  • adb shell dumpsys window

    dumpsys window 表示将当前界面转存成静态文件

  • adb shell dumpsys window|findStr mCurrentFocus

    dumpsys window 表示将当前界面转存成静态文件
    findStr mCurrentFocus 表示查找属性
    获取当前界面的PackageName(包名)和ActivityName(活动名)

  • adb shell pm uninstall com.gibb.easyclick

    pm 表示Package Manager(包管理器)
    uninstall 表示反向安装,即卸载
    com.gibb.easyclick 表示需要卸载的包名,此指令的执行结果,即卸载微信

  • adb shell pm uninstall --user 0 com.gibb.easyclick

    pm 表示Package Manager(包管理器)
    uninstall 表示反向安装,即卸载
    –user 0 表示管理员权限
    com.gibb.easyclick 表示需要卸载的包名
    此指令可以卸载大部分系统自带的应用,适用于强迫症,极端完美主义玩家.需要谨慎使用,卸载后尽量不要关机或者重启设备,否则可能会出现无法开机的情况.或者开机时间很长很长(其实就是系统发现缺少了自带应用,努力恢复的一个过程),有变砖的可能性

  • adb shell am force-stop com.gibb.easyclick

    am 表示Activity Manager(活动管理器)
    force-stop 表示强制停止
    com.gibb.easyclick 表示需要强制停止的包名
    此指令等同于应用详情界面中的强制停止

  • adb shell monkey -p com.gibb.easyclick 1

    monkey 表示压力测试
    -p 表示指定包名
    com.gibb.easyclick 表示需要测试的包名
    1 表示时间,单位毫秒
    大部分情况用来启动某个已知包名的应用,参考来源于Stack Overflow

  • adb shell mkdir test

    mkdir 表示创建文件夹
    test 表示创建新文件夹的名称

  • adb shell touch test.txt

    touch 表示创建新文件,替代方案cat >test.txt
    test.txt 表示创建新文件的名称

  • adb shell cat test.txt

    cat 表示打开文件
    test.txt 表示要打开的文件

  • adb shell cat >test.txt

    创建一个test.txt的文件,并输入内容,ctrl+d退出编辑,enter结束操作如果test.txt存在,之前的内容会被覆盖

  • adb shell cat >>test.txt

    编辑test.txt文件,追加内容,ctrl+d退出编辑,enter结束操作如果test.txt不存在,会自动创建

    ctrl+d

    退出编辑模式

  • adb shell cp /sdcard/1.txt /sdcard/Pictures/1.txt

    cp 表示复制
    /sdcard/1.txt 表示原路径位置
    /sdcard/Pictures/1.txt 表示移动后的路径位置,支持重命名

  • adb shell mv /sdcard/1.txt /sdcard/Pictures/1.txt

    mv 表示移动
    /sdcard/1.txt 表示原路径位置
    /sdcard/Pictures/1.txt 表示移动后的路径位置,支持重命名

  • adb shell rename oldf.txt newf.txt

    rename 表示重命名
    oldf.txt 表示原名称
    newf.txt 表示修改后的名称,重命名

  • adb shell rm test.txt

    rm 表示删除文件
    test.txt 表示需要删除的文件

  • adb shell rmdir test

    rmdir 表示删除文件夹
    test 表示需要删除的文件夹
    需要注意的是,当文件夹test中包含其他文件或文件夹的时候,会删除失败

  • adb shell rm -r test

    rm 表示删除
    -r 表示递归到其子目录
    test 表示需要删除的文件夹
    该方法会删除整个test文件夹,包括其子目录中,请谨慎操作

  • adb shell find -name uiauto*

    find 表示查找匹配
    -name 表示名称区分大小写
    uiauto* 表示匹配规则,其中*表示匹配任意数量的任意字符

  • adb shell find -iname pictures

    find 表示查找匹配
    -iname 表示不区分大小写
    pictures 表示需要查找的名称

  • adb shell find -name [ASP]ictures

    find 表示查找匹配
    -name 表示名称区分大小写
    [ASP]ictures 表示匹配规则,会匹配Aictures和Sictures还有Pictures

  • adb shell input keyevent 3

    input 表示输入模式
    keyevent 表示模拟按键
    3 表示三大金刚中的主页Home,对应KeyCode码表

  • adb shell input keyevent 4

    input 表示输入模式
    keyevent 表示模拟按键
    4 表示三大金刚中的返回Back,对应KeyCode码表

  • adb shell input keyevent 26

    input 表示输入模式
    keyevent 表示模拟按键
    26 表示电源Power,对应KeyCode码表

  • adb shell input keyevent 82

    input 表示输入模式
    keyevent 表示模拟按键
    82 表示三大金刚中的菜单Menu,对应KeyCode码表

  • adb shell input text 1234qwer

    input 表示输入模式
    text 表示输入字符/字符串
    1234qwer 表示需要输入的字符/字符串
    注意 : 因为编码的原因,故不支持输入中文

  • adb shell ime

    扩展一下(对于编码和极端输入有用)

    主要关注list和set,enable和disable仅作了解就行

    ADB编码问题解决方案

    方案参考:查看ADBKeyboard

  • adb shell am broadcast -a ADB_INPUT_TEXT --es msg ‘你好世界’

    ADBKeyboard解决输入中文的编码问题

  • adb shell am broadcast -a ADB_CLEAR_TEXT

    清空输入的文本

  • adb shell input tap x y

    input 表示输入模式
    tap 表示点击
    x 表示需要点击的位置横坐标
    y 表示需要点击的位置纵坐标

  • adb shell input swipe x1 y1 x2 y2

    input 表示输入模式
    swipe 表示滑动
    x1 表示起始位置的横坐标
    y1 表示起始位置的纵坐标
    x2 表示终点位置的横坐标
    y2 表示重点位置的纵坐标

  • adb shell screencap /sdcard/Pictures/now.png

    screencap 表示截图
    /sdcard/Pictures/now.png 表示截图保存的位置

  • adb shell ps

    ps 表示列出当前所有任务(包括name和pid)

  • adb shell kill pid

    kill 表示杀死进程/服务
    pid 表示任务的pid属性

  • adb shell /system/bin/uiautomator dump /sdcard/now.xml

    /system/bin/uiautomator 表示执行uiautomator
    dump 表示将当前界面转存为静态文件
    /sdcard/now.xml 转存位置
    /system/bin/目录下为指令集合,亦可简写为adb shell uiautomator dump /sdcard/now.xml

  • adb push .\1.txt /sdcard/1.txt

    push 表示将PC端的指定文件推送到移动端
    .\1.txt 表示文件在PC端的位置,一般都是用相对路径
    /sdcard/1.txt 表示文件推送到移动端保存的位置
    多个设备同时在线需要指定设备名称,如adb -s emulator-5554 push .\1.txt /sdcard/1.txt

  • adb pull /sdcard/1.txt .\1.txt

    pull 表示拉取移动端文件到PC端
    /sdcard/1.txt 表示文件在移动端的位置
    .\1.txt 表示拉取到PC端保存的位置
    push和pull对应,记忆方法:pull中有两个L,可以联想到汉语中la,相反另外一个则为推送

  • adb remount

    remount 表示挂载为可读写
    常用于Permission Denied(权限不足)的问题,优先考虑挂载,挂载失败再考虑chmod提权

  • adb shell chmod -R 777 path

    chmod 表示提权
    -R 表示提权递归到该目录的子目录,注意大写
    777 表示权限级别
    path 表示需要提权的目录

  • 设备代理模式激活方式1

    推送设备对应的二进制文件,adb push newagent-x86 /data/local/tmp/agent
    cd到tmp,chmod -R 777 agent//提权
    执行adb shell /data/local/tmp/agent -mode=runagent -dport=19901,19902,19903 --password=123

  • 设备代理模式激活方式2

    路径提权,adb remount//remount succeeded
    推送二进制文件到system目录 adb push newagent-x86 /system/bin/agent//直接推送会报错,但并不影响激活效果
    执行二进制文件 adb shell /system/bin/agent -mode=runagent -dport=19901,19902,19903 --password=123

  • 设备代理模式激活方式3

    exe程序批量激活

    激活结果验证

    查询指定端口号19901,19902,19903是否存在通讯 adb shell netstat -ant