adb命令篇
前言
Android的adb提供了很多命令,功能很强大,可以为开发和调试带来很大的便利。当然本文并不是介绍各种命令的文章,而是用于记录在平时工作中需要经常使用的命令,方便平时工作时使用,所以以后会持续新增一些常用而且很有用的命令。也希望这些命令能给读者带来一定的帮助。
当前已经记录的命令主要涉及到如下功能:
一、常用的与Permission相关的adb命令
二、通过Wifi连接连接手机
三、adb操作四大组件
四、实现一个操作多条adb命令的脚本
五、用adb dump一些信息
六、adb与进程
一、常用的与Permission相关的adb命令
Android工具adb提供了一些命令,可以方便查看、授权、取消应用的权限,可以为调试程序带来不少的方便,下面简单介绍几个常见的命令。
1、查看指定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。
2、查看权限的声明者和使用者
命令: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 ......


3、移除指定权限
命令: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无效,如以下异常信息所示:

4、授予指定权限
命令:adb shell pm grant [packageName] [permissionName]
用途:为packageName应用授予permissionName权限(可以同时授予多项权限)。该命令和上一条移除命令相对应。
参照上一条命令的实例,实验结果如下:

5、查看系统定义的所有权限
命令:adb shell pm list permissions -s[option] 不加-s会显系统中定义的所有权限名列表,加了-s会显示对这些权限的用途说明。
下面截图分别展示了命令不加-s和加了-s后的显示结果(重定向到文本中查看),其中不加-s的截图中,一共显示了571条权限,这里截取了一部分,其中可以看到不少自定义的权限。


6、按组查看权限
命令:adb shell pm list permissions -d -g
用途:查看权限的分组情况。这部分是上面一条命令的补充,参数可以根据自己的需要选择。
参考:【https://developer.android.google.cn/training/permissions/usage-notes#testing】
下列截图为结果的一部分。

7、授予所有权限
命令:adb shell install -g MyApp.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连接电脑(所以还是不能完全脱离数据线),通过命令 adb tcp ip 5555 来设置。默认填5555就可以了,我试过其他的,没成功。

(3)连接手机
命令:adb connect [ip地址]
实例:

查看连接的设备,就能看到通过WIFI连接的手机了。

在AndroidStudio上就可以选择该手机了,各种操作和用USB连接时都是一样的。

(4)断开连接
使用完后最好断开连接,断开命令为:adb disconnect [ip地址]

三、adb操作四大组件
1、adb 启动activitry
命令:adb shell am start -n pkgname/activityPath(可以是全路径,也可以是相对路径)

如果成功,会看到界面被打开;如果失败,会在命令行处显示错误信息。
启动activity和service还有一种action方式打开,暂时没有实验成功,暂不记录。
2、adb 启动service
命令:adb shell am startservice -n pkgname/servicepath(可以是全路径,也可以是相对路径)


3、adb 停止service
命令:adb shell am stopservice -n pkgname/servicepath


4、adb发送广播
命令:adb shell am broadcast -a actionName --es EXTRA_KEY EXTRA_KEY_VALUE
说明: -a 表示action,-es表示附件的键值对参数,且参数值为string(-ei对应int,-ez对应boolean)
使用案例:

这句命令的作用就相当于执行了如下代码:
Intent intent = new Intent(“com.songwei.broadcast.demo”);
intent.putExtra(“pkgname”,“com.example.demos”);
广播接收到的信息为:

四、实现一个操作多条adb命令的脚本
有些固定操作需要执行多条adb命令,如果每次都手动输入,会比较麻烦。如果写一个脚本来自动执行,会方便很多。如下实现一个自动push SystemUI.apk的脚本:
adb root
adb remount
adb push ./SystemUI.apk system/priv-app/SystemUI
adb shell sleep
adb reboot
pause
五、用adb dump一些信息
1、查看内存信息
命令:adb shell dumpsys meminfo [进程名]

2、查看当前显示的界面信息
命令:adb shell dumpsys window | findstr mCurrentFocus

六、adb与进程
1、查看进程
adb shell
ps -ef|grep [keyword] 关键字不用加引号,如下图所示:

2、杀死进程
adb shell
kill -s -9 [pid] 示例如下所示:

3、一个查看ps来找到某个service的案例
需求:需要找到华为手机人脸解锁功能所在的进程。
难点:使用人脸解锁时,没有对应的界面,判断是一个service在执行该功能,所以无法dump出window信息。
分析:对于没有界面的功能,可以通过logcat,根据关键字段推断所在进程号,然后通过进程号,结合ps命令可以查到对应的进程名,进而推断所在模块。例如:在华为机器上判断人脸解锁在哪个模块,先获取一份Log记录,如下所示:
通过tag名称,可以判断 FaceRecognizeService一行为该功能所输出的log,这样就找到了PID为1859。再结合ps命令,在命令行获取进程名
这样就推断出该功能所在的进程名为com.huawei.systemserver,为框架模块。从前面log中的“package = com.android.systemui”,也可以推断是SystemUI启动了该功能。
出处:https://www.cnblogs.com/andy-songwei/p/9773379.html
adb命令篇的更多相关文章
- 工作中代码笔记 -- adb命令篇
1.抓log方法 (bat文件) mkdir D:\logcatset /p miaoshu=请描述操作:adb logcat -v threadtime > D:\logcat\%miaosh ...
- adb命令篇 (转载)
转自:https://www.cnblogs.com/ailiailan/p/7896534.html 1.抓log方法 (bat文件) mkdir D:\logcat set /p miaosh ...
- 工作笔记--adb命令篇
1.抓log方法 (bat文件) mkdir D:\logcatset /p miaoshu=请描述操作:adb logcat -v threadtime > D:\logcat\%miaosh ...
- 【烂笔头】adb命令篇
1.一个自动安装SystemUI.apk的脚本文件push-SystemUI.bat: adb rootadb remountadb push ./SystemUI.apk system/priv-a ...
- [adb 学习篇] python将adb命令集合到一个工具上
https://testerhome.com/topics/6938 qzhi的更全面,不过意思是一样的,另外补充一个开源的https://github.com/264768502/adb_wrapp ...
- [adb 学习篇] adb常用命令
https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...
- [adb 命令学习篇] adb 命令总结
https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...
- (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
Mac系统下利用ADB命令连接android手机并进行文件操作 标签: Mac adb android 2016-03-14 10:09 5470人阅读 评论(1) 收藏 举报 分类: Androi ...
- 【烂笔头】常用adb命令记录
前言 Android的adb提供了很多命令,功能很强大,可以为开发和调试带来很大的便利.当然本文并不是介绍各种命令的文章,而是用于记录在平时工作中需要经常使用的命令,方便平时工作时使用,所以以后 ...
随机推荐
- 使用dozer将DTO转化为DO
DTO,就是Data Transfer Object,数据传输对象,可以简单理解成请求中的对象. PO,就是Persistant Object,持久化对象,它跟持久层(通常是关系型数据库)的数据结构形 ...
- C# IE浏览器操作类
using System; using System.Collections.Generic; using System.Drawing; using System.Runtime.InteropSe ...
- Java程序特性
1.1.简单性 Java的语法比C++简单,第二,JAVA类库比较小,可以跑在嵌入式上面. 1.2面向对象 Java与C++的不同在于,Java是接口继承,而C++是多继承. 1.3网络技能 Java ...
- Tensorflow2 快速简单安装命令
使用如下命令 pip3 install numpy pandas matplotlib sklearn tensorflow==2.0.0-alpha0 -i https://pypi.doubani ...
- 源码编译安装使用glusterfs+heketi安装使用
注:使用源码安装的原因主要是使用yum安装glusterfs服务端时出现一些依赖库问题 准备3台glusterfs服务器(官方也建议至少3台,防止发生脑裂),并在各个服务器的/etc/hosts下面添 ...
- 中级java面试经历
2018年已经远去,2019年悄然而至.跳槽不仅是为了涨薪,更是为了锻炼自己,提高自己的能力.树挪死,人挪活.在一个公司呆的时间越长,就越老油条,从而失去不断前进的动力.现在下面就主要讲述我这一个月面 ...
- FusionInsight大数据开发---MapReduce与YARN应用开发
MapReduce MapReduce的基本定义及过程 搭建开发环境 代码实例及运行程序 MapReduce开发接口介绍 1. MapReduce的基本定义及过程 MapReduce是面向大数据并行处 ...
- Linux中常用命令cat
cat可谓是随处可用,全名:concatenate and print files.用于连接和打印文件,按序读取文件内容,然后输出到标准输出.如果文件是单个破折号-或者缺乏文件,cat将读取标准输入. ...
- 使用docker部署titpetric/netdata
netdata 是常用的Linux系统性能实时监控面板 官方docker netdata/netdata部署 docker run -d --name=netdata \ -p 19999:19999 ...
- 史上最全HashMap红黑树解析
HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...