阳光沙滩
让学习编程变得简单
Android开发测试常用的ADB命令
发表于 2020-05-10    阅读次数 315

本文思维导图

图片描述

ADB下载

ADB是什么?ADB是android debug bridge--> 安卓调试桥

官方文档

下载

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

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

ADB/ADB驱动下载

下载好了配置环境变量,如要是开发人员只配置环境变量就好了。一般来说,你安装好了有带sdk版本的AndroidStudio的话,应该就有sdk了,sdk里有adb,如果没有配置环境变量,就配置一下。如果不会就看视频吧。

手机配置

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

插上手机Usb时,可能会弹窗需要授权,这个时候注意一下。允许就可以了。

设备相关命令

查看设备


C:\Users\TrillGates>adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached

连接上设备以后:

C:\Users\TrillGates>adb devices
List of devices attached
142e4d6 device

连接上多个设备以后:

你看,我这里就有两台设备了。

C:\Users\TrillGates>adb devices
adb server is out of date.  killing...
* daemon started successfully *
List of devices attached
142e4d6 device
emulator-5554   device

重新挂载

命令为adb remount

remount就是重新挂载的意思。

一般做系统开发的同学才用到这个命令。

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

C:\Users\TrillGates>adb remount
Not running as root. Try "adb root" first.

提示说我不是root,我得adb root才行。

那我们就执行一下adb root

C:\Users\TrillGates>adb remount
Not running as root. Try "adb root" first.

C:\Users\TrillGates>adb root
restarting adbd as root

C:\Users\TrillGates>adb remount
remount succeeded

C:\Users\TrillGates>

设备重启

adb reboot

这个没什么好演示的,如果提示你不是root的,你切换一下root用户就好了。

设备关机

adb shell reboot -p

-p 则是poweroff的意思

选择设备

当我们电脑连接上多个设备后

跟前面的一样

C:\Users\TrillGates>adb devices
adb server is out of date.  killing...
* daemon started successfully *
List of devices attached
142e4d6 device
emulator-5554   device

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

我执行adb reboot

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

adb -s xxx设备名称

比如说我让涩会被212b5110关机

adb -s 212b5110 shell reboot -p

进入shell

命令

adb shell

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

常用的shell命令

列出文件

ls -l

这个时候已经进入到了android系统了,你可以理解为一个阉割版本的linux系统,所以可以使用linux部分命令。

看:

图片描述

有一些是被禁止了,有一些列出来了。

这是不是跟我们在AndroidStudio里看到的是一样的呀!

图片描述

如果你在AS上查看,有权限问题。那么你先用ADB切换到root用户即可。

目录切换

cd 目录地址

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

图片描述

结果我没有权限

那怎么办呢?

我们输入su

图片描述

这样就可以了。

查看文件路径

pwd

比如说刚才我们进入了/data/data

pwd一下

generic_x86:/data/data # pwd
pwd
/data/data

删除文件

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

图片描述

文件查看

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

图片描述

发现呢是乱码

怎么解决呢?

得设置一下编码

chcp 65001

65001是utf-8,936是gbk

图片描述

再看就可以了。

文件操作

从Android系统中拉取文件出来

命令:

adb pull 内部文件地址 本地目录

比如说我要拉取刚才的那个sp文件

generic_x86:/data/data/com.sunofbeaches.ticketunion/shared_prefs # pwd
pwd
/data/data/com.sunofbeaches.ticketunion/shared_prefs

pwd查看一下目录,然后退出来

然后说,不存在

图片描述

明明存在,怎么就不存在了呢?

这个时候,我们就要意思到权限问题了。

我们进去里面是用了su命令的, 切换到超级用户。

所以我们要先adb root

图片描述

推送文件到android系统中

命令格式

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

我们推送刚才这个文件到/data/data的根目录下

图片描述

有兴趣的同学进去查看一下吧。

okay到这里我们就把文件推送和拉取搞定了。

应用场景

抓取Log

我相信很多同学都遇到过as抽风的情况,抓Log总怀疑人生,怎么as的logcat没有输出呢?

这个时候 ,你就可以通过adb命令来抓取Log了。

命令

adb logcat > xxx.log

图片描述

这样就抓到啦!!

当我们输入这个命令的时候,就在抓Log了,这个时候 我们去复现问题。

然后ctrl+c停止抓取log

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

一般我是全抓取,然后用Notepad++来搜索Log

大家可以参考这篇文章

Android初学者高频问题

ADB获取包名

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

那怎么获取到包名呢?

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

比如说

adb shell
logcat | grep cmp=

然后去打开你的目标应用

比如说我打开了浏览器

chrome

图片描述

这样子就有了

可以拿到跟浏览器相关的包命以及目前打开的activity的全路径名称了。

还可以

locat | grep START
···

这个也是有的

## 应用安装

命令:

```shell
adb install 本地apk地址

apk直接拖拽即可

这个手机端得允许Usb安装应用

卸载应用

adb uninstall 包名

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

一般系统应用的目录是:

/system/priv-app
/system/app

图片描述

图片描述

第三方应用的目录在

/data/app

图片描述

启动一个Acitivity

命令

adb shell am start -n 包名/类名

这种是显示意图启动

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

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

这样子就启动了google浏览器了, 前提是得有哈。这个组件我们不是在前面用logcat找出来了嘛。

adb发送广播

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

直接发就好了

adb shell am broadcast 参数

[-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

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

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.sunofbeach.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);
        }
    }
}

注册

<receiver android:name=".test.TestBroadcast">
	<intent-filter>
		<action android:name="net.sunofbeach.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原生代码是怎么实现返回键和Home键功能的呢?

也可以去看源码

android.view.KeyEvent

Home和Back按钮提这两个

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

那我发一个Home看看是不是应用退到后台了

adb shell input keyevent 3 

okay啦,到这里常用的基本上就够用了。

其他用得比较少的,需要的时候自己去查一下吧。