2.Android开发常用的ADB命令
本文思维导图
ADB下载
ADB是什么?ADB是android debug bridge--> 安卓调试桥
下载
一般来说,作为android开发人员,不需要下载。在sdk里自带就有。在sdk的platform-tools目录下就有。
如果是测试人员的话,可以到这个地址上去下载:
下载好了配置环境变量,如要是开发人员只配置环境变量就好了。一般来说,你安装好了有带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
大家可以参考这篇文章
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>] action (常用)
[-d <DATA_URI>] data的Uri
[-t <MIME_TYPE>] mime type
[-c <CATEGORY> [-c <CATEGORY>] ...] 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 <COMPONENT>] 组件名称
[-f <FLAGS>] [<URI>] 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啦,到这里常用的基本上就够用了。
其他用得比较少的,需要的时候自己去查一下吧。