当前已经记录的命令主要涉及到如下功能:
二、通过Wifi连接手机
三、通过adb命令操作四大组件
四、实现一个操作多条adb命令的脚本
五、用adbdump一些信息
六、adb与进程
七、adb命令模拟输入事件
八、adb截屏&录屏
十、通过adb打印log
1、查看指定app中权限申请情况
命令:adbshelldumpsyspackage[包名]
用途:该命令用于获取该app的package信息,Permission信息只是其中的一部分。
命令使用示例:
adbshelldumpsyspackagecn.aaa.bbb如下下截图为该命令中关于权限的部分信息:
该图显示了4部分权限:
(2)requestedpermissions。这里列出的是AndroidManifest.xml文件中所有request的权限,可以看出这里面包含了动态申请的权限和安装时申请的权限。(3)installpermissions:安装的时候就赋予的权限。可以和requestedpermissions对比一下,这里面少了一"android.permission.CAMERA"权限,该权限为动态申请权限。该列表中还展示了权限对应的授予情况,如granted所示,true表示已经被授予了权限。
(4)runtimepermissions。这里显示的是运行时才需要申请的权限,即dangerouspermission。
命令:adbshelldumpsyspackagepermission<权限名>
adbshelldumpsyspackagepermissioncn.aaa.bbb.TEST_PERMISSION如下节选了该权限的定义信息和其中一个使用该权限的应用的关键信息:
命令:adbshellpmrevoke[packageName][permissionName]
用途:移除packageName应用的permissionName权限(可以同时移除多项权限)。
命令使用示例(如下为删除包名为cn.aaa.bbb的相机权限):
adbshellpmrevokecn.aaa.bbbandroid.permission.CAMERA执行完该命令后,用前文提到的命令“adbshelldumpsyspackagecn.aaa.bbb”查看该权限的信息如下:
通过实验发现,该命令对runtimepermissions有效,却对installpermissions无效,如以下异常信息所示:
4、授予指定权限
命令:adbshellpmgrant[packageName][permissionName]
用途:为packageName应用授予permissionName权限(可以同时授予多项权限)。该命令和上一条移除命令相对应。
参照上一条命令的实例,实验结果如下:
5、查看系统定义的所有权限
命令:adbshellpmlistpermissions-s[option]不加-s会显系统中定义的所有权限名列表,加了-s会显示对这些权限的用途说明。
下面截图分别展示了命令不加-s和加了-s后的显示结果(重定向到文本中查看),其中不加-s的截图中,一共显示了571条权限,这里截取了一部分,其中可以看到不少自定义的权限。
6、按组查看权限
命令:adbshellpmlistpermissions-d-g
用途:查看权限的分组情况。这部分是上面一条命令的补充,参数可以根据自己的需要选择。
下列截图为结果的一部分。
7、授予所有权限
命令:adbshellinstall-gMyApp.apk
用途:当安装MyApp.apk到模拟器或测试机上时,如果加上-g,可以自动授予所有权限。这一点笔者没有实验过,读者可以自行测试。
参考:该处和第4点一样参考官网说明。
二、通过Wifi连接连接手机
有时候由于数据线异常等原因,导致电脑上连接不上手机,有时候会让人很抓狂。还有一种情况,当通过USB连接手机时,会干扰手机界面,影响分析问题,比如手机上会显示充电界面等。此时可以通过Wifi来连接手机,彻底摆脱数据线的困扰,从而放飞自我。这里简单介绍一下具体操作步骤,前提条件是Wifi需要和电脑在同一个局域网。
(1)连接wifi,查看手机的ip地址
大多数人都知道电脑有IP地址,却很少有人留意手机的IP地址。这提供两种查看手机IP的方式,当然前提条件是先连接上Wifi。
1)在WIFI详情中查看
依次进入设置》WLAN,可以看到如下界面,依次进入到所选wifi的详情,便可查看到IP地址。
2)在手机信息中查看
依次按照路径设置》关于手机》状态信息》IP地址,便可在如下界面找到IP地址。
(2)给手机设置端口号
这一步需要先通过USB连接电脑(所以还是不能完全脱离数据线),通过命令adbtcpip5555来设置。默认填5555就可以了,我试过其他的,没成功。
(3)连接手机
命令:adbconnect[ip地址]
实例:
如果出现如下信息:
在IP地址后面加上端口号即可:
查看连接的设备,就能看到通过WIFI连接的手机了。
在AndroidStudio上就可以选择该手机了,各种操作和用USB连接时都是一样的。
(4)断开连接
使用完后最好断开连接,断开命令为:adbdisconnect[ip地址]
1、adb启动activitry
命令:adbshellamstart-npkgname/activityPath(可以是全路径,也可以是相对路径)
如果成功,会看到界面被打开;如果失败,会在命令行处显示错误信息。
启动activity和service还有一种action方式打开,暂时没有实验成功,暂不记录。
2、adb启动service
命令:adbshellamstartservice-npkgname/servicepath(可以是全路径,也可以是相对路径)
3、adb停止service
命令:adbshellamstopservice-npkgname/servicepath
4、adb发送广播
命令:adbshellambroadcast-aactionName--esEXTRA_KEYEXTRA_KEY_VALUE
说明:-a表示action,-es表示附件的键值对参数,且参数值为string(-ei对应int,-ez对应boolean)
使用案例:
这句命令的作用就相当于执行了如下代码:
1Intentintent=newIntent(“com.songwei.broadcast.demo”);2intent.putExtra(“pkgname”,“com.example.demos”);广播接收到的信息为:
有些固定操作需要执行多条adb命令,如果每次都手动输入,会比较麻烦。如果写一个脚本来自动执行,会方便很多。如下实现一个自动pushSystemUI.apk的脚本:
adbrootadbremountadbpush./SystemUI.apksystem/priv-app/SystemUIadbshellsleep1adbrebootpause
1、查看内存信息
命令:adbshelldumpsysmeminfo[进程名]
2、查看当前显示的界面信息
命令:adbshelldumpsyswindow|findstrmCurrentFocus
在命令窗口输入adbshelldumpsys命令可以打印出很多可以dump的条目。dumpwindow/activity/input/SurfaceFliner平时可以留意一下。
1、查看进程
adbshell
ps-ef|grep[keyword]关键字不用加引号,如下图所示:
2、杀死进程
kill-s-9[pid]示例如下所示:
3、一个查看ps来找到某个功能所在进程的案例
需求:需要找到华为手机人脸解锁功能所在的进程。
难点:使用人脸解锁时,没有对应的界面,判断是一个service在执行该功能,所以无法dump出window信息。
分析:对于没有界面的功能,可以通过logcat,根据关键字段推断所在进程号,然后通过进程号,结合ps命令可以查到对应的进程名,进而推断所在模块。例如:在华为机器上判断人脸解锁在哪个模块,先获取一份Log记录,如下所示:
通过tag名称,可以判断FaceRecognizeService一行为该功能所输出的log,这样就找到了PID为1859。再结合ps命令,在命令行获取进程名
这样就推断出该功能所在的进程名为com.huawei.systemserver,为框架模块。从前面log中的“package=com.android.systemui”,也可以推断是SystemUI启动了该功能。
1、text
该命令用于向获得焦点的EditText控件输入内容。
2、keyevent
该命令用于向系统发送一个按键指令,实现模拟用户在键盘上的按键动作
3、tap
该命令是用于向设备发送一个点击操作的指令,参数是
4、swipe
向设备发送一个滑动指令,并且可以选择设置滑动时长。
有时候在测试的时候,一些突发偶现事件,需要截图或者录屏时,可能因为触摸屏幕导致现象消失。此时通过命令来截屏或录屏就能很好地避免破坏现场。
1、截屏
命令:adbshellscreencap-ppath/fileName.png
说明:截屏的图片存储路径为path,文件名为fileName.png.
示例:
2、录屏
命令:adbshellscreenrecordpath/fileName.mp4
说明:录屏文件存储路径为path,文件名为fileName.mp4
命令:adbshellsettingsputkeyNamevalue设置值
adbshellsettingsgetkeyName获取值
命令:adbshellsetpropkeyNamevalue设置系统属性keyName的属性值
adbshellgetpropkeyName获取系统属性keyName的属性值
logcat|grep-ikeyword显示包含keyword的log-i表示忽略大小写logcat-stagName显示tag为tagName的loglogcat-t10打印最近的10条loglogcat-bevents/system/main输出events/system/mainloglogcat-c清空缓冲区日志