Android adb 使用手册,机顶盒开发必看

本文详细介绍了Android调试桥(adb)的功能、工作原理,包括客户端、守护程序和服务器的交互,以及如何在Android设备上启用USB调试、选择设备、执行各种操作如日志检索、模拟按键、修改系统设置等。此外,还涵盖了adb的高级用法,如ContentProvider管理、应用程序启动和网络包抓取等。
摘要由CSDN通过智能技术生成

Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发机器上运行。您可以通过发出 adb 命令从命令行终端调用客户端。

  • 守护程序 (adbd) :用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。

  • 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。

adb 包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下。如果您需要独立的 Android SDK 平台工具软件包,请点击此处进行下载。

adb是Android SDK里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备。

adb 的工作原理

当您启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程已在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令。

注意:所有 adb 客户端均使用端口 5037 与 adb 服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接。

每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554

模拟器 1,adb:5555

模拟器 2,控制台:5556

模拟器 2,adb:5557

依此类推。

如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。

服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端或从某个脚本控制任意设备。

在设备上启用 adb 调试

如要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 USB 调试(位于开发者选项下)。在 Android 4.2(API 级别 17)及更高版本中,开发者选项屏幕默认处于隐藏状态。如需将其显示出来,请启用开发者选项。

现在,您已经可以通过 USB 连接设备了。您可以通过从 android_sdk/platform-tools/ 目录执行 adb devices 来验证设备是否已连接。如果已连接,您将看到设备名称以“设备”形式列出。

注意:当您连接搭载 Android 4.2.2(API 级别 17)或更高版本的设备时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的 RSA 密钥。这种安全机制可以保护用户设备,因为它可以确保用户只有在能够解锁设备并确认对话框的情况下才能执行 USB 调试和其他 adb 命令。

如需详细了解如何通过 USB 连接到设备,请参阅在硬件设备上运行应用。

选择设备

如果同时连接了多个设备,则需要选择你想操作/控制的设备,用 -s 来选择设备

# 例如连接了两个设备如下
~ yezi$ adb devices
List of devices attached
10.1.1.217:5555  device
192.168.31.78:5555  device


# 通过-s选择对应的设备执行命令即可,如果只连接了一个设备,可以直接执行adb命令,无需选择对应的设备
adb -s 10.1.1.217:5555 shell

检索日志

adb logcat -v threadtime | grep 检索条件 #不含空格可不加"",含空格需加""
adb logcat -v threadtime -d | grep 检索条件 #检索缓冲区日志
adb logcat -t 100 | grep 检索条件 #检索最近100行日志
adb logcat -t 100 *:E | grep 检索条件 #检索最近100行error日志

模拟按键

# 模拟按下返回键
adb -s shell input keyevent 4


# 常用按键键值
    /** Key code constant: Home key.
     * This key is handled by the framework and is never delivered to applications. */
    public static final int KEYCODE_HOME            = 3;
    /** Key code constant: Back key. */
    public static final int KEYCODE_BACK            = 4;
    /** Key code constant: '0' key. */
    public static final int KEYCODE_0               = 7;
    /** Key code constant: '1' key. */
    public static final int KEYCODE_1               = 8;
    /** Key code constant: '2' key. */
    public static final int KEYCODE_2               = 9;
    /** Key code constant: '3' key. */
    public static final int KEYCODE_3               = 10;
    /** Key code constant: '4' key. */
    public static final int KEYCODE_4               = 11;
    /** Key code constant: '5' key. */
    public static final int KEYCODE_5               = 12;
    /** Key code constant: '6' key. */
    public static final int KEYCODE_6               = 13;
    /** Key code constant: '7' key. */
    public static final int KEYCODE_7               = 14;
    /** Key code constant: '8' key. */
    public static final int KEYCODE_8               = 15;
    /** Key code constant: '9' key. */
    public static final int KEYCODE_9               = 16;
    /** Key code constant: Directional Pad Up key.
     * May also be synthesized from trackball motions. */
    public static final int KEYCODE_DPAD_UP         = 19;
    /** Key code constant: Directional Pad Down key.
     * May also be synthesized from trackball motions. */
    public static final int KEYCODE_DPAD_DOWN       = 20;
    /** Key code constant: Directional Pad Left key.
     * May also be synthesized from trackball motions. */
    public static final int KEYCODE_DPAD_LEFT       = 21;
    /** Key code constant: Directional Pad Right key.
     * May also be synthesized from trackball motions. */
    public static final int KEYCODE_DPAD_RIGHT      = 22;
    /** Key code constant: Directional Pad Center key.
     * May also be synthesized from trackball motions. */
    public static final int KEYCODE_DPAD_CENTER     = 23;

文本输入

adb shell input text "string"
adb shell input text '12ab\$ab12' #特殊字符使用单引号加\转义

模拟touch

adb shell input tap <x> <y>

模拟滑动

adb shell input swipe <x1> <y1> <x2> <y2>

检索盒子信息

adb shell getprop | grep mac

启动应用

#通过包名启动
adb shell am start com.android.camera 
#通过Action启动
adb shell am start -a android.settings.SETTINGS 
#通过包名类名启动  
adb shell am start -n com.android.camera/.Camera
#携带参数
adb shell am start -n com.android.camera/.Camera -e key1 value1 --es key2 value2 --ez key value 
#通过monkey启动
adb shell monkey -p com.android.settings 1 


# 常用参数类型
    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]

停止应用

adb shell am force-stop com.android.settings

修改系统时间

adb shell date -s 20231113.173800

查看ContentProvider

adb shell content query --uri content://settings/system/
修改ContentProvider
adb shell content update --uri content://xxx/xxx/xxx --bind value:s:111
删除ContentProvider
adb shell content delete --uri content://settings/system/xxx
发送广播通知
# 通过Action发送
adb shell am broadcast -a com.android.test --es  test_string "this is test string" --ei test_int 100 --ez test_boolean  true
# 通过包名类名发送
adb shell am broadcast -n com.android.settings/com.android.settings.iflytek.IflytekReceiver -a Search -t xiri/search


# broadcast 常用参数
adb shell am broadcast 后面的参数有:
  [-a <ACTION>] 
  [-d <DATA_URI>] 
  [-t <MIME_TYPE>] 
  [-c <CATEGORY> ]  
  [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]  
  [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]  
  [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]  
  [-n <COMPONENT>] 
  [-f <FLAGS>] 
  [<URI>]

抓网络包

#抓网络包保存至SD卡
adb shell tcpdump -i any -p -s 0 -w /sdcard/11.pcap
#从SD卡pull
adb pull /sdcard/11.pcap ~/log/11.pcap

截图

#截图保存到sdcard
adb shell screencap -p /mnt/sdcard/*.png
#截图直接保存到电脑, 将\n转换\r\n, 因此需要用sed删除多余的\r (适用windows和Linux)
adb shell screencap -p | sed 's/\r$//' > screen.png 
#截图直接保存到电脑(适用macos)
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > 11.png

查询安装包信息

adb shell dumpsys package com.android.settings

查询栈顶Activity信息

adb shell dumpsys activity top

查看已安装apk路径

adb shell pm path com.android.settings

清除已安装apk数据和缓存

adb shell pm clear com.android.settings

重新挂载system分区,获取读写权限

方式一:

su
mount -o remount,rw rootfs /system/

方式二:

su
mount -o rw,remount -t auto /system

播放视频

adb shell am start -a android.intent.action.VIEW -t "video/*" -d "playUrl"
启动浏览器
adb shell am start -a android.intent.action.VIEW -d "https://www.baidu.com"
设置代理

添加全局代理

adb shell settings put global http_proxy 127.0.0.1:8888

查看已设置代理

adb shell settings get global http_proxy

删除全局代理(推荐方案三)

方案一(需重启)如 delete 命令无效请参考方案二

adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port

方案二(需要root权限 , 执行后需重启设备)

sqlite3 /data/data/com.android.providers.settings/databases/settings.db
# sqlite> select * from global;
sqlite> delete from global where name="global_http_proxy_host";
sqlite> delete from global where name="global_http_proxy_port";
sqlite> delete from global where name="http_proxy";
sqlite> .exit

方案三 设置一个无效代理 (效果等同于删除代理) ,实时生效

adb shell settings put global http_proxy :0
安装证书

使用charles或finder等工具查看https接口里需要安装证书,手机可直接通过系统设置可视化界面安装,没有可视化界面的机顶盒可以尝试使用下方命令安装,部分设备系统可能会阉割相关服务导致无法使用

adb shell am start -n com.android.certinstaller/.CertInstallerMain -a android.intent.action.VIEW -t application/x-x509-ca-cert -d file:///sdcard/charles.cer
启动锁屏密码设置页

通过命令安装证书时可能需要设置pin码,如果无法打开pin码设置尝试通过下述命令打开。

adb shell am start com.android.settings/.ChooseLockGeneric
查看Activity启动时间

测试冷启动时间时可以使用-W查看启动时间

adb shell am start -W -a "Action"

查看系统启动时间

# 查看系统启动时间 /proc/uptime 记录两个数值  例如:327098.68 959753.11 ,第一个数值是 从系统启动到现在的时间(单位:秒)第二个数值是 系统空闲的时间(单位:秒)
adb shell cat /proc/uptime


# 借助awk直接格式化
adb shell cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d 秒",run_days,run_hour,run_minute,run_second);print("");}'
查看设备组件信息
adb shell dumpsys activity activities # 查看Activity组件信息
adb shell dumpsys activity services # 查看Service组件信息
adb shell dumpsys activity providers # 查看ContentProvider组件信息
adb shell dumpsys activity broadcasts # 查看BraodcastReceiver信息
adb shell dumpsys activity intents # 查看Intent信息
adb shell dumpsys activity processes # 查看进程信息

封堵IP

可以通过adb直接拦截某个服务器的请求,可用于测试异常情况,ACCEPT放通,DROP封堵

# Ipv4
封堵:iptables -I INPUT -s 192.168.1.138 -j DROP
解除:iptables -I INPUT -s 192.168.1.138 -j ACCEPT


# Ipv6
封堵:ip6tables -I INPUT -s 1050:0000:0000:0000:0005:0600:300c:326b -j DROP
解除:ip6tables -I INPUT -s 1050:0000:0000:0000:0005:0600:300c:326b -j ACCEPT
无线连接ADB

设备未root

1.连接数据线开启adb调试
2.打开端口5555(支持5555-5585) "adb tcpip 5555"
3.拔掉数据线,使用"adb connect ip:port" 连接

设备已root

借助wireless adb等第三方软件连接

MIUI 删除系统内置应用

adb shell pm uninstall --user 0 {pkg}
作者:Android_叶子
链接:https://juejin.cn/post/7339807020370690083

关注我获取更多知识或者投稿

3c6f9b5d6f66ba17743f5db1d7ffe230.jpeg

8f0e8d4455fa1a1a4852b0d8a0553ff6.jpeg

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值