前言 html
Android的adb提供了不少命令,功能很强大,能够为开发和调试带来很大的便利。固然本文并非介绍各类命令的文章,而是用于记录在平时工做中须要常用的命令,方便平时工做时使用,因此之后会持续新增一些经常使用并且颇有用的命令。也但愿这些命令能给读者带来必定的帮助。android
当前已经记录的命令主要涉及到以下功能:shell
1、经常使用的与Permission相关的adb命令app
2、经过Wifi链接链接手机框架
3、adb操做四大组件tcp
4、实现一个操做多条adb命令的脚本ide
5、用adb dump一些信息工具
6、adb与进程post
1、经常使用的与Permission相关的adb命令测试
Android工具adb提供了一些命令,能够方便查看、受权、取消应用的权限,能够为调试程序带来很多的方便,下面简单介绍几个常见的命令。
一、查看指定app中权限申请状况
命令:adb shell dumpsys package [包名]
用途:该命令用于获取该app的package信息,Permission信息只是其中的一部分。
命令使用示例:
1 adb shell dumpsys package cn.aaa.bbb
以下下截图为该命令中关于权限的部分信息:
该图显示了4部分权限:
(1)declared permissions。该应用本身声明(即自定义)的权限,这里显示了权限名,权限等级,以及在何时获取该权限(INSTALLED 表示安装的时候就会授予该权限)。
(2)requested permissions。这里列出的是AndroidManifest.xml文件中全部request的权限,能够看出这里面包含了动态申请的权限和安装时申请的权限。
(3)install permissions:安装的时候就赋予的权限。能够和requested permissions对比一下,这里面少了一"android.permission.CAMERA"权限,该权限为动态申请权限。该列表中还展现了权限对应的授予状况,如granted所示,true表示已经被授予了权限。
(4)runtime permissions。这里显示的是运行时才须要申请的权限,即dangerous permission。
二、查看权限的声明者和使用者
命令:adb shell dumpsys package permission <权限名>
用途:该命令能够查看指定权限是谁声明的,有哪些应用申请了该权限。
命令使用示例:
1 adb shell dumpsys package permission cn.aaa.bbb.TEST_PERMISSION
以下节选了该权限的定义信息和其中一个使用该权限的应用的关键信息:
1 Permissions: 2 Permission [cn.aaa.bbb.TEST_PERMISSION] (d4d8316): 3 sourcePackage=cn.aaa.bbb 4 uid=10078 gids=null type=0 prot=signature|privileged 5 perm=Permission{f5b497 cn.aaa.bbb.TEST_PERMISSION} 6 packageSetting=PackageSetting{96e1684 cn.aaa.bbb/10078} 7 8 Packages: 9 Package [cn.xxx.xxx] (5d0f51b): 10 ...... 11 declared permissions: 12 requested permissions: 13 install permissions: 14 cn.aaa.bbb.TEST_PERMISSION: granted=true 15 16 ......
三、移除指定权限
命令:adb shell pm revoke [packageName] [permissionName]
用途:移除packageName应用的permissionName权限(能够同时移除多项权限)。
命令使用示例(以下为删除包名为cn.aaa.bbb 的相机权限):
1 adb shell pm revoke cn.aaa.bbb android.permission.CAMERA
执行完该命令后,用前文提到的命令“adb shell dumpsys package cn.aaa.bbb”查看该权限的信息以下:
经过实验发现,该命令对runtime permissions有效,却对install permissions无效,如如下异常信息所示:
四、授予指定权限
命令:adb shell pm grant [packageName] [permissionName]
用途:为packageName应用授予permissionName权限(能够同时授予多项权限)。该命令和上一条移除命令相对应。
参照上一条命令的实例,实验结果以下:
五、查看系统定义的全部权限
命令:adb shell pm list permissions -s[option] 不加-s会显系统中定义的全部权限名列表,加了-s会显示对这些权限的用途说明。
下面截图分别展现了命令不加-s和加了-s后的显示结果(重定向到文本中查看),其中不加-s的截图中,一共显示了571条权限,这里截取了一部分,其中能够看到很多自定义的权限。
六、按组查看权限
命令:adb shell pm list permissions -d -g
用途:查看权限的分组状况。这部分是上面一条命令的补充,参数能够根据本身的须要选择。
参考:【https://developer.android.google.cn/training/permissions/usage-notes#testing】
下列截图为结果的一部分。
七、授予全部权限
命令:adb shell install -g MyApp.apk
用途:当安装MyApp.apk到模拟器或测试机上时,若是加上-g,能够自动授予全部权限。这一点笔者没有实验过,读者能够自行测试。
参考:该处和第4点同样参考官网说明。
2、经过Wifi链接链接手机
有时候因为数据线异常等缘由,致使电脑上链接不上手机,有时候会让人很抓狂。还有一种状况,当经过USB链接手机时,会干扰手机界面,影响分析问题,好比手机上会显示充电界面等。此时能够经过Wifi来链接手机,完全摆脱数据线的困扰,从而放飞自我。这里简单介绍一下具体操做步骤,前提条件是Wifi须要和电脑在同一个局域网。
(1)链接wifi,查看手机的ip地址
大多数人都知道电脑有IP地址,却不多有人留意手机的IP地址。这提供两种查看手机IP的方式,固然前提条件是先链接上Wifi。
1)在WIFI详情中查看
依次进入 设置 》 WLAN,能够看到以下界面,依次进入到所选wifi的详情,即可查看到IP地址。
2)在手机信息中查看
依次按照路径 设置 》 关于手机 》 状态信息 》 IP地址,即可在以下界面找到IP地址。
(2)给手机设置端口号
这一步须要先经过USB链接电脑(因此仍是不能彻底脱离数据线),经过命令 adb tcp ip 5555 来设置。默认填5555就能够了,我试过其余的,没成功。
(3)链接手机
命令:adb connect [ip地址]
实例:
查看链接的设备,就能看到经过WIFI链接的手机了。
在AndroidStudio上就能够选择该手机了,各类操做和用USB链接时都是同样的。
(4)断开链接
使用完后最好断开链接,断开命令为:adb disconnect [ip地址]
3、adb操做四大组件
一、adb 启动activitry
命令:adb shell am start -n pkgname/activityPath(能够是全路径,也能够是相对路径)
若是成功,会看到界面被打开;若是失败,会在命令行处显示错误信息。
启动activity和service还有一种action方式打开,暂时没有实验成功,暂不记录。
二、adb 启动service
命令:adb shell am startservice -n pkgname/servicepath(能够是全路径,也能够是相对路径)
三、adb 中止service
命令:adb shell am stopservice -n pkgname/servicepath
四、adb发送广播
命令:adb shell am broadcast -a actionName --es EXTRA_KEY EXTRA_KEY_VALUE
说明: -a 表示action,-es表示附件的键值对参数,且参数值为string(-ei对应int,-ez对应boolean)
使用案例:
这句命令的做用就至关于执行了以下代码:
1 Intent intent = new Intent(“com.songwei.broadcast.demo”); 2 intent.putExtra(“pkgname”,“com.example.demos”);
广播接收到的信息为:
4、实现一个操做多条adb命令的脚本
有些固定操做须要执行多条adb命令,若是每次都手动输入,会比较麻烦。若是写一个脚原本自动执行,会方便不少。以下实现一个自动push SystemUI.apk的脚本:
adb root adb remount adb push ./SystemUI.apk system/priv-app/SystemUI adb shell sleep 1 adb reboot pause
5、用adb dump一些信息
一、查看内存信息
命令:adb shell dumpsys meminfo [进程名]
二、查看当前显示的界面信息
命令:adb shell dumpsys window | findstr mCurrentFocus
6、adb与进程
一、查看进程
adb shell
ps -ef|grep [keyword] 关键字不用加引号,以下图所示:
二、杀死进程
adb shell
kill -s -9 [pid] 示例以下所示:
三、一个查看ps来找到某个service的案例
需求:须要找到华为手机人脸解锁功能所在的进程。
难点:使用人脸解锁时,没有对应的界面,判断是一个service在执行该功能,因此没法dump出window信息。
分析:对于没有界面的功能,能够经过logcat,根据关键字段推断所在进程号,而后经过进程号,结合ps命令能够查到对应的进程名,进而推断所在模块。例如:在华为机器上判断人脸解锁在哪一个模块,先获取一份Log记录,以下所示:
经过tag名称,能够判断 FaceRecognizeService一行为该功能所输出的log,这样就找到了PID为1859。再结合ps命令,在命令行获取进程名
这样就推断出该功能所在的进程名为com.huawei.systemserver,为框架模块。从前面log中的“package = com.android.systemui”,也能够推断是SystemUI启动了该功能。