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

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 来选择设备

makefile 复制代码
# 例如连接了两个设备如下
~ 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 

检索日志

perl 复制代码
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日志

模拟按键

php 复制代码
# 模拟按下返回键
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;

文本输入

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

模拟touch

xml 复制代码
adb shell input tap <x> <y>

模拟滑动

xml 复制代码
adb shell input swipe <x1> <y1> <x2> <y2>

检索盒子信息

perl 复制代码
adb shell getprop | grep mac  

启动应用

ini 复制代码
#通过包名启动
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> ...]

停止应用

arduino 复制代码
adb shell am force-stop com.android.settings

修改系统时间

bash 复制代码
adb shell date -s 20231113.173800

查看ContentProvider

css 复制代码
adb shell content query --uri content://settings/system/

修改ContentProvider

css 复制代码
adb shell content update --uri content://xxx/xxx/xxx --bind value:s:111

删除ContentProvider

css 复制代码
adb shell content delete --uri content://settings/system/xxx

发送广播通知

css 复制代码
# 通过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>] 

抓网络包

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

截图

bash 复制代码
#截图保存到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

查询安装包信息

go 复制代码
adb shell dumpsys package com.android.settings

查询栈顶Activity信息

css 复制代码
adb shell dumpsys activity top

查看已安装apk路径

lua 复制代码
adb shell pm path com.android.settings

清除已安装apk数据和缓存

arduino 复制代码
adb shell pm clear com.android.settings

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

方式一:

bash 复制代码
su
mount -o remount,rw rootfs /system/

方式二:

arduino 复制代码
su
mount -o rw,remount -t auto /system

播放视频

sql 复制代码
adb shell am start -a android.intent.action.VIEW -t "video/*" -d "playUrl"

启动浏览器

sql 复制代码
adb shell am start -a android.intent.action.VIEW -d "https://www.baidu.com"

设置代理

添加全局代理

arduino 复制代码
adb shell settings put global http_proxy 127.0.0.1:8888

查看已设置代理

csharp 复制代码
adb shell settings get global http_proxy

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

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

javascript 复制代码
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权限 , 执行后需重启设备)

sql 复制代码
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

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

arduino 复制代码
adb shell settings put global http_proxy :0

安装证书

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

bash 复制代码
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码设置尝试通过下述命令打开。

bash 复制代码
adb shell am start com.android.settings/.ChooseLockGeneric

查看Activity启动时间

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

sql 复制代码
adb shell am start -W -a "Action"

查看系统启动时间

bash 复制代码
# 查看系统启动时间 /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("");}'

查看设备组件信息

bash 复制代码
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封堵

css 复制代码
# 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

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

设备已root

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

MIUI 删除系统内置应用

css 复制代码
adb shell pm uninstall --user 0 {pkg}
相关推荐
一颗松鼠2 分钟前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds22 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
吕彬-前端1 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱1 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓3 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4113 小时前
无网络安装ionic和运行
前端·npm
理想不理想v3 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云3 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js