ADB是什么?

ADB是android debug bridge–> 安卓调试桥

下载

一般来说,作为android开发人员,不需要下载。在sdk里自带就有。在sdk的platform-tools目录下就有。

如果是测试人员的话,可以到这个地址上去下载:

ADB下载

下载好了然后需要配置环境变量:

右键此电脑->属性->高级系统设置->环境变量->系统变量->Path(添加adb.exe的文件夹路径)->一直点击确定即可

测试:WIN+R,输入cmd进入命令行,输入adb出现下面结果就说明成功了

手机配置

  • 打开开发者模式—>不同手机不一样,可以在设置里搜索一下。默认开发者模式是不可见的,需要多次点击android版本号
  • 要允许USB调试
  • 允许Usb安装应用
  • 关闭各种系统优化

插上手机usb时,可能会弹窗需要授权,点击允许就可以了。

常用命令

查看设备

adb devices:查看当前连接设备

重新挂载

命令:adb remount

remount就是重新挂载的意思。

一般做系统开发才会用到这个命令。

比如说,你要推送东西进system目录下,你需要重新挂载,默认情况下是只读的状态。

如果出现如下提示,提示说我不是root,我得adb root才行。那我们就执行一下adb root,再执行adb remount

Not running as root. Try “adb root” first.

设备重启

命令:adb reboot

如果提示你不是root的,你切换一下root用户就好了。

设备关机

adb shell reboot -p

选择设备

如果你执行adb名的话,则会提示你有多台设备,比如说,我电脑现在有两个手机设备

我执行adb reboot

就会提示多台设备,可以加-s参数来指定设备。

adb -s xxx设备名称

进入shell

命令:adb shell

就进入到了安卓系统的shell了。

常用的shell命令

列出文件

ls -l

目录切换

cd 目录地址

比如说我去查看data/data/下的目录,这个是我们应用的内部目录,里面有很多包名,对应着各应用的文件夹。

我没有权限,那怎么办呢?我们输入su就可以了

查看文件路径

pwd

删除文件

rm命令,如果是文件夹则要加参数-r,强制删除-f,force

创建文件夹

mkdir 文件夹名称

创建文件

touch 文件名

移动文件

mv 需要移动的文件 移动到的文件夹路径(./ 当前路径)

文件查看

有时候临时查看,我们可以用里面的命令cat,vim,vi,more这些命令可能没有,被阉割掉了。或者说本来就是没有的,毕竟android要的是linux的内核。

cat 文件名

发现全是乱码。怎么解决呢?得设置一下编码

chcp 65001

65001是utf-8,936是gbk,再看就行了

文件操作

从Android系统中拉取文件出来

命令: adb pull 内部文件地址 本地目录

如果我们进去里面是用了su命令的, 切换到超级用户。我们就要先adb root

推送文件到android系统中

命令: adb push 本地文件 安卓系统内部路径

应用场景

抓取Log

命令: adb logcat > xxx.log

输入ctrl+c停止抓取log

adb抓取Log有好些个参数,比如说等级,输出时间之类的。

一般建议全抓取,然后用Notepad++来搜索Log

ADB获取包名

应用场景: 我们在开发的时候,有时需要打开别人的应用,如果没有别人的文档的时候。你怎么知道别人的action,category之类的是什么呢?或者用显式意图,你也得知道别人的包名和入口类的全名称呀。然后构建compoment,用于启动。

那怎么获取到包名呢?

我一般会用logcat抓取log,然后过滤一些特定的标识

比如说

1
2
adb shell
logcat | grep cmp=

然后去打开你的目标应用

1
locat | grep START

这个也是有的

应用安装

命令: adb install 本地apk地址

直接拖拽apk也可

不过需要这个手机端得允许usb安装应用

卸载应用

adb uninstall 包名

直接adb跟包名就好,一般我们只卸载自己的,不过你可以去卸载一下系统的应用试试看!

一般系统应用的目录是:

1
2
/system/priv-app
/system/app

第三方应用的目录在

1
/data/app

启动一个Acitivity

命令: adb shell am start -n 包名/类名

这种是显示意图启动

后面的斜杠不是或的意思,就是要两个都写。比如说:

adb shell am start -n com.android.chrome/org.chromium.chrome.browser.ChromeTabbedActivity

这样子就启动了google浏览器了, 前提是得有哈。

adb发送广播

这个做系统开发比较常用,比如说做一些测试的时候。不需要写代码。

直接发就好了

1
2
3
adb shell am broadcast -a 参数

[-a ] action (常用) [-d <DATA_URI>] data的Uri [-t <MIME_TYPE>] mime type [-c [-c ] ...] category (一般) [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] (字符串参数 先是key 再是value) [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] (布尔类型参数 先是key 再是value) [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] (整型参数 先是key 再是value) [-n ] 组件名称 [-f ] [] flags

这样子,我们写个广播接收者,然后我们发送一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TestBroadcast extends BroadcastReceiver {

private static final String TAG = "TestBroadcast";

@Override
public void onReceive(Context context,Intent intent) {
String action = intent.getAction();
Log.d(TAG,"action is == > " + action);
if("net.example.test.ACTION.TEST".equals(action)) {
String text = intent.getStringExtra("text");
boolean isHansom = intent.getBooleanExtra("isHansom",false);
int monies = intent.getIntExtra("money",-1);
Log.d(TAG,"text == > " + text);
Log.d(TAG,"isHansom == > " + isHansom);
Log.d(TAG,"monies == > " + monies);
}
}
}

注册

1
2
3
4
5
<receiver android:name=".test.TestBroadcast">
<intent-filter>
<action android:name="net.example.test.ACTION.TEST" />
</intent-filter>
</receiver>

ADB截图

adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png ./

截图,放到特定位置

ADB发送模拟按键

命令: adb shell input keyevent 键码(keyCode)

具体的KeyCode可以去看源码:

android.view.KeyEvent

Home和Back按钮

1
2
3
public static final int KEYCODE_HOME = 3;
/** Key code constant: Back key. */
public static final int KEYCODE_BACK = 4;

eg: adb shell input keyevent 3