>>>> 什么是ADB
ADB的全称是Android Debug Bridge,是一个与模拟器或者连接设备通讯的桥梁。ADB是CS结构包含三个部分:
adb kill-server
和adb start-server
进行server的重启。ADB的功能异常强大,在测试过程中合理的使用能够达到事半功倍的效果。以下的章节,我们就来介绍下常用的adb命令。
使用adb shell am可以启动activity,services,发送broadcast等。其中am是ActivityManager的缩写。ActivityManager的功能是与系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行的进程信息,任务信息,服务信息等。
在命令行或shell中执行命令adb shell am
将会列出am的使用方法:
下面笔者将介绍测试过程中常用的命令:
1、adb shell am start
使用该命令需要后接参数已经PackageName/Activity类的类名来启动activity。而PackageName和Activity列表可以通过文件AndroidManifest.xml文件查看。 例如Package的名字是com.example.lvchongen.adbdemo
,而仅有的activity是MainActivity
。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lvchongen.adbdemo" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
下面重点介绍下不同的参数的使用方法:
-W:wait for launch to complete,等待启动完成后返回启动的时间,启动时间是判断APP性能的重要指标之一。类WaitResult
的实例res将会记录Activity的启动结果用于对状态进行判断。
-S:force stop the target app before starting the activity,在启动Activity之前先判断时候已经启动,若启动则关闭进程后再次开启;若未启动,则直接打开Activity。
2、adb shell am startservice
使用该命令能够启动app中的service,前提是在注册service的时候,需要使用属性android:exported="true"
。本例中作者在app中注册了一个服务DemoService,并在其中添加了log以记录当前服务的状态。
adb logcat | grep -i DemoService
来查看当前服务的状态。首先查看当前的service状态,DemoService并未启动;之后使用adb shell am startservice com.example.adbdemo/.DemoService
来启动servcie;最后使用命令adb logcat
查看当前的service状态。
我们可以看到,通过这条命令成功的将DemoService启动。
3、adb shell am stopservice
与startservice相反,这条命令能够停止已经启动的服务。当服务未启动的时候,执行该命令则返回Service not stopped: was not running的信息。这里我们沿用startservice中的例子。
adb shell am stopservice com.example.adbdemo/.DemoService
来停止DemoService。
可以看到,该命令能够成功停止正在运行的service。
4、adb shell am force-stop
使用该命令的接受参数是APK包名,用来停止正在运行的app。
ps | grep adbdemo
来确认app正在运行中。adb shell am force-stop com.example.adbdemo
来停止app。ps | grep adbdemo
来确认app已经停止运行。5、adb shell am kill
使用该命令传入的参数是APK的包名,用来杀掉在后台运行的APK。
ps | grep adbdemo
来确认app正在运行中。adb shell am kill com.example.adbdemo
来杀死后台的进程。ps | grep adbdemo
来确认app已经停止运行。
6、adb shell am broadcast
使用该命令可以通过系统发送指定的广播,为了演示这个例子,我们需要修改示例的代码用来接受广播。
7、adb shell am dumpheap
使用该命令可以获取指定进程的内存使用情况。
com.example.adbdemo
。也可以通过使用命令ps | grep adbdemo
来获取当前apk的pid。这里我们为了方便,仅仅使用apk的包名作为输入参数。adb shell am dumpheap com.example.adbdemo /data/local/tmp/demo.hprof
来生成记录进程内存使用情况的文件demo.hprof,之后再使用命令adb pull /data/local/tmp/demo.hprof ./
将文件存储到指定的位置。使用adb shell pm命令可以模拟android行为或者查询设备上的应用等,其中pm是packagemanager的缩写。
下面笔者将介绍测试过程中常用的命令:
1、adb shell pm list package
Filter参数 | 作用 |
---|---|
-f | 查看所有的关于apk的相关文件 |
-d | 只展示被disable的apk信息 |
-e | 只展示enable的apk信息 |
-s | 只展示系统自带的apk信息 |
-3 | 只展示第三方apk的信息 |
-i | 查看所有apk对应的安装源 |
-u | 展示所有apk信息,包含未安装的apk |
2、adb shell pm list permission-groups
该命令是用于列出设备中所有的permission-group。
adb shell pm list permission-groups
将返回如下结果:
3、adb shell pm list permissions
该命令用于列出设备中所有的应用所需要的权限。
adb shell pm list permissions
将返回如下结果:
4、adb shell pm path
该命令后接apk的包名,用于列出该apk的安装路径。
adb shell pm path com.example.adbdemo
后将返回如下结果:
5、adb shell pm dump
该命令后接apk的包名,用于列出与该apk相关的系统信息。
adb shell pm dump com.example.adbdemo
后将返回如下结果:
6、adb shell pm install
该命令后接apk在手机或模拟器中的绝对路径,并通过不同的参数控制APK的安装。
adb install
,而另一个就是pm install,通过阅读源代码我们发现其实adb install
最终还是调用pm install
,那么两者的差别在哪里呢?adb install
先将安装包push到手机或模拟器的一个临时位置,再执行pm install
进行安装。-r
,-s
和-f
,分别代表覆盖安装,安装到外部存储和安装到内部存储。7、adb shell pm uninstall
该命令后接apk的包名,用于卸载已经安装在手机或模拟器的APK。
adb shell pm uninstall com.example.adbdemo
进行卸载的操作,返回如下结果:
8、adb shell pm clear
该命令后接apk的包名,用于清除apk的应用数据,而这部分数据一般存储与/data/data下,主要记录了用户的行为所产生的应用数据。成功清除的标志是再次打开应用时,应用本地记录的数据已经消失,呈现的界面和第一次安装该应用相同。
adb shell pm clear com.example.adbdemo
进行清除数据的操作,返回如下结果:
使用adb shell appops系列命令可以查看或修改APK的相关权限,在实际测试的过程中,我们可以通过禁用某种权限来测试程序的异常处理以及与用户的相关交互。
下面笔者将介绍测试过程中常用的命令:
1、adb shell appops get
该命令后接apk的包名,用于获取应用的权限申请列表及时间。以下以微信的apk为例:
com.tencent.mm
adb shell appops get com.tencent.mm
来获取权限列表。这里可以看到微信已经申请了四个权限,分别是WAKE_LOCK
,OP_READ_PHONE_STATE
,READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
。
2、adb shell appops set
该命令后接APK的包名,权限的名称以及对应的控制标示符,其中标示符为allow
,deny
,ignore
和default
,分别代表允许,禁止,忽略和默认。
WRITE_EXTERNAL_STORAGE: allow; time=+1s798ms ago
,本例我们将禁止该权限,则使用命令adb shell appops set com.tencent.mm WRITE_EXTERNAL_STORAGE deny
来修改权限。从返回的结果来看,我们的确对微信停止了该权限的授权。
3、adb shell appops reset
该命令后接APK的包名,用于重新设置应用的权限,恢复到用户第一次授权的状态下。
adb shell appops reset com.tencent.mm
来恢复READ_EXTERNAL_STORAGE
的权限,reset后我们再次查看,发现权限已经被allow。
使用adb shell wm系列命名能够获取或设置设备的屏幕分辨率,DPI和overscan。
下面笔者将介绍几个常用的命令:
1、adb shell wm size
该命令可以获取当前设备的屏幕分辨率以及重新设置分辨率,但设置的分辨率是临时的,将在手机重启后恢复正常,在root后可以通过修改系统文件将默认分辨率永久修改,感兴趣的读者可以试验下,这里就不赘述了。
adb shell wm size
获得当前的分辨率1080P。
adb shell wm size HxW
来设置自定义的分辨率。例如adb shell wm size 720x1080
。
我们可以看到修改分辨率后的效果"惨目忍睹":
adb shell wm size reset
来恢复系统的默认分辨率。
2、adb shell wm density
该命令可以获取当前设备的屏幕密度以及重新设置屏幕密度,同样该设置是临时的。
adb shell wm density
来查看手机的屏幕密度。
adb shell wm density 300
来重新设置屏幕的密度。
adb shell wm density reset
来恢复系统默认的屏幕密度。
3、adb shell wm overscan
该命令可以将屏幕显示限定在一定区域内,同样这些设置是临时的。
adb shell wm overscan 0,0,0,540
来限制显示的区域,操作后显示效果如下图:
adb shell wm overscan reset
来恢复屏幕的显示区域。该命令是用于控制电源管理,wifi开关,数据流量等。存在于/system/bin目录下,可见在执行的时候需要root权限。
因为笔者的设备没有root权限,所以只是简单介绍几个svc的命令:
1、adb shell svc data enable/disable
该命令用于操作数据流量的开关
2、adb shell svc wifi enable/disable
该命令用于操作wifi的开关
3、adb shell svc power stayon true/false/usb/ac
该命令用于设置屏幕时候常亮,其中usb表示插入usb的时候常亮,ac表示插入电源时常亮。
该命令用于获取或设置一些系统级别的选项。使用格式是adb shell settings get/put/delete secure/system/global parameter
1、命令中的操作符get/put/delete
2、命令中的namespace
3、几个展示adb shell settings的例子
以上就是adb shell settings
的用法,具体的属性可以在上文中提到的帮助文档去查询,根据自己的需求来使用对应的命令。
adb shell settings get secure default_input_method
获取默认的输入法。可以看到这里使用了谷歌输入法作为默认的输入法。
adb shell settings put system screen_brightness 100
调节屏幕的显示亮度adb shell settings get system screen_off_timeout
获取屏幕自动休眠的时间。
这里可以看到,屏幕自动熄灭的时间间隔是2分钟。
我们使用命令得到的结果是120000毫秒,也就是2分钟。
该命令用于模拟键盘,按键和触摸屏幕等事件。使用格式是adb shell input [event] command
。 其中[event]
是不同的事件。
1、adb shell input text
该命令可以用来输入一些指定的字符,笔者使用命令adb shell input text 'HelloADB'
来在可编辑的界面进行输入:
可以看到,在搜索页面出现了通过命令输入的HelloADB
2、adb shell input keyevent
该命令可以用来模拟键盘的输入,在keyevent后接键盘按键的对应键码即可。例如模拟点击菜单按钮就可以使用命令adb shell input keyevent KEYCODE_MENU
。常用的按键键码如下表格:
对应键码 | 按键 | 对应键码 | 按键 |
---|---|---|---|
0 | KEYCODE_UNKNOWN | 43 | KEYCODE_O |
1 | KEYCODE_MENU | 44 | KEYCODE_P |
2 | KEYCODESOFTRIGHT | 45 | KEYCODE_Q |
3 | KEYCODE_HOME | 46 | KEYCODE_R |
4 | KEYCODE_BACK | 47 | KEYCODE_S |
5 | KEYCODE_CALL | 48 | KEYCODE_T |
6 | KEYCODE_ENDCALL | 49 | KEYCODE_U |
7 | KEYCODE_0 | 50 | KEYCODE_V |
8 | KEYCODE_1 | 51 | KEYCODE_W |
9 | KEYCODE_2 | 52 | KEYCODE_X |
10 | KEYCODE_3 | 53 | KEYCODE_Y |
11 | KEYCODE_4 | 54 | KEYCODE_Z |
12 | KEYCODE_5 | 55 | KEYCODE_COMMA |
13 | KEYCODE_6 | 56 | KEYCODE_PERIOD |
14 | KEYCODE_7 | 57 | KEYCODEALTLEFT |
15 | KEYCODE_8 | 58 | KEYCODEALTRIGHT |
16 | KEYCODE_9 | 59 | KEYCODESHIFTLEFT |
17 | KEYCODE_STAR | 60 | KEYCODESHIFTRIGHT |
18 | KEYCODE_POUND | 61 | KEYCODE_TAB |
19 | KEYCODEDPADUP | 62 | KEYCODE_SPACE |
20 | KEYCODEDPADDOWN | 63 | KEYCODE_SYM |
21 | KEYCODEDPADLEFT | 64 | KEYCODE_EXPLORER |
22 | KEYCODEDPADRIGHT | 65 | KEYCODE_ENVELOPE |
23 | KEYCODEDPADCENTER | 66 | KEYCODE_ENTER |
24 | KEYCODEVOLUMEUP | 67 | KEYCODE_DEL |
25 | KEYCODEVOLUMEDOWN | 68 | KEYCODE_GRAVE |
26 | KEYCODE_POWER | 69 | KEYCODE_MINUS |
27 | KEYCODE_CAMERA | 70 | KEYCODE_EQUALS |
28 | KEYCODE_CLEAR | 71 | KEYCODELEFTBRACKET |
29 | KEYCODE_A | 72 | KEYCODERIGHTBRACKET |
30 | KEYCODE_B | 73 | KEYCODE_BACKSLASH |
31 | KEYCODE_C | 74 | KEYCODE_SEMICOLON |
32 | KEYCODE_D | 75 | KEYCODE_APOSTROPHE |
33 | KEYCODE_E | 76 | KEYCODE_SLASH |
34 | KEYCODE_F | 77 | KEYCODE_AT |
35 | KEYCODE_ G | 78 | KEYCODE_NUM |
36 | KEYCODE_H | 79 | KEYCODE_HEADSETHOOK |
37 | KEYCODE_I | 80 | KEYCODE_FOCUS |
38 | KEYCODE_J | 81 | KEYCODE_PLUS |
39 | KEYCODE_K | 82 | KEYCODE_MENU |
40 | KEYCODE_L | 83 | KEYCODE_NOTIFICATION |
41 | KEYCODE_M | 84 | KEYCODE_SEARCH |
42 | KEYCODE_N | 85 | TAGLASTKEYCODE |
3、adb shell input tap
该命令用于模拟点击屏幕,位置用坐标来表示,如需要点击坐标(100,100)的位置,需要使用命令adb shell input tap 100 100
即可。
4、adb shell input swipe
该命令用于模拟划动屏幕的操作,使用方法为adb shell input swipe x y x1 y1 time
, 其中x,y,x1,y1为起点和终点的坐标,而time是划动所需的时间。
例如使用命令adb shell input swipe 50 1250 250 100 500
进行android菜单的向下划动。
5、adb shell input press
该命令用于显示traceball,打开traceball的步骤是:
6、adb shell input roll
该命令用于点击traceball所在的位置。
以上就是所有adb shell input
相关的命令和用法。在实际中,我们可以在执行自动化用例的时候,穿插使用这些模拟输入来实现自动化用例的顺利执行。
该命令用于打印系统的信息,如activity,cpu和电量等信息。对于我们了解当前系统的状态,以及在测试过程中获取app对系统的影响提供了数据依据。
1、adb shell dumpsys cpuinfo
用于打印当前手机或模拟器中cpu的相关信息。
这里可以看到,会根据当前cpu的使用比例从大到小排序。我们可以很快找到测试app所占用的cpu信息。
2、adb shell dumpsys battery
用于打印当前手机或模拟器的电量相关信息。
因为笔者使用了USB线连接了手机与电脑,故显示USB powered: true
3、adb shell dumpsys package
用于打印模拟器或手机中app的相关信息。
adb shell dumpsys package -h
来获取具体参数的作用和使用方法。
adb shell dumpsys package -p | grep -i tencent
4、adb shell dumpsys activity
用于打印模拟器或手机中activity的相关信息。
adb shell dumpsys activity -h
来获取具体参数的作用和使用方法。
adb shell dumpsys activity top
。例如本例中我们将设置页面置于前台,然后输入命令查看实际的结果:
我们可以看到这样的字样TASK com.android.settings id=415,顾名思义这就是设置app的包名,与我们预期的结果一致。
合理的使用dumpsys系列的命令,能够有效的获取当前系统或app的信息, 在性能测试中使用的尤为多,想要学好移动端的性能测试,掌握这个命令是必不可少的。
该命令用于查看和跟踪系统日志,一般在调试中经常用到,病尝尝与过滤命令grep
一起调用。
1、常用的Android Log方法
Log.v
:这里的v是verbose的缩写,有啰嗦的意思,所以这个命令是任何信息都会输出Log.d
:这里的d是debug的缩写,可以通过使用DDMS和Logcat进行过滤Log.i
:这里的i是information的缩写,指的是一般提示性的消息Log.w
:这里的w是waring的缩写,当有这样警告的信息出现时,我们需要注意进行代码的优化,因为这些警告很可能成为潜在的bugLog.e
:这里的e是error的缩写,出现错误的警告时,意味着我们的代码包含错误或者配置错误,必须进行修改2、使用adb logcat查看log信息
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
logInfo = (Button)findViewById(R.id.startLog);
logInfo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ADB", "HelloADB");
}
});
}
adb logcat | grepi -i helloadb
来进行监测, 同时在app中点击按钮。可以看到,这里显示出了了我们记录的log信息HelloADB。
在实际中,常常使用grep
对返回的结果进行过滤。grep命令这里就不进行赘述了。
3、logcat的日志格式控制
这里举一个使用的例子,如果我们想查看对应进程的pid,我们可以使用命令adb logcat -v brief | grep -i helloadb
。
adb logcat -v [parameter]
。下表就是parameter的定义:
| 参数 | 作用 | | ------------- |:-------------:| | long | 显示所有的元数据字段并且用空行分隔消息内容 | | time | 显示日期,调用时间,优先级/标记,PID| | raw | 显示原始的日志信息,没有其他的元数据字段 | | thread | 仅显示进程:线程和优先级/标记 | | tag | 仅显示优先级/标记 | | process | 仅显示进程PID | | brief | 显示优先级/标记和原始进程的PID |
合理运用logcat能够帮助我们在调试过程中尽快定位问题,事半功倍。
该组命令是日常中使用比较频繁的命令,其中push用于将本地的文件推送到模拟器或手机中,而pull用于将模拟器或手机中的文件拉取到本地。
1、adb pull
/sdcard/
。
adb pull /sdcard/testFile
来将testFile文件拉取到本地。
我们也可以在pull的过程中修改文件名,格式为adb pull sourceFile newName
,如:
2、adb push
adb push sourceFile /sdcard/
。
adb push sourceFile path/newName
。
以上就是pull/push的使用方法,我们常常使用这组命令获取程序运行时产生的log文件。
该命令用于展示目前已经连接到adb server的设备列表。
1、使用命令adb devices
获取设备列表
2、当有多个设备连接到adb server时,我们的任何adb命令都需要添加参数-s deviceID
才可以进行操作。所以必须先通过adb devices
获取设备id。
在实际中,我们通常使用该命令来查看设备当前的状态,以及获取设备的ID来进行操作。如果通过USB Hub实现多个手机的连接,分发不同手机进行自动化测试的时候,该命令尤其重要。
该组命令用于启动和停止adb server。在修改adb的配置后,需要重启adb server。这组命令会派上用场。
1、查看adb server进程并重启
2、这里举一个需要重启adb server的例子,在开启USB调试功能后,仍旧存在一部分手机adb不识别的情况。我们需要获取该设备的Vendor ID,之后将该id写入当前用户根目录下的adb_usb.ini文件中。
system_profiler SPUSBDataType
来查看连接电脑的硬件的设备信息。
/Users/YourName/.android
下编辑文件adb_usb.ini(如果没有该文件,则需要手动创建),将上一个步骤获得的Vendor ID写入到该文件中。
adb kill-server
后执行命令adb start-server
来实现重新启动adb server。之后我们通过adb devices
可以查看到刚刚无法识别的设备。以上的例子展示了如何使用重启adb server的使用方法。
该命令用于对手机或模拟器当前屏幕进行截图。
1、使用命令adb shell screencap /sdcard/Test.png
进行截屏,并使用pull命令进行拉取。
2、打开图片后,可以看到正是使用命令进行截屏时的界面。
该命令用于对手机或模拟器当前的屏幕进行录制。
1、使用命令adb shell screenrecord /sdcard/Test.mp4
进行录制,使用ctrl+c
结束录制,使用pull命令进行拉取。
以上就是在实际测试中常用的ADB命令,熟练掌握ADB命令能够令测试事半功倍。自动化测试中也可以和ADB命令进行结合,实现特殊数据的获取或者应用的跳转等,这里就不一一介绍了。
---------------------END---------------------