前言   

转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/11176162.html】谢谢。

Android的adb提供了很多命令,功能很强大,可以为开发和调试带来很大的便利。当然本文并不是介绍各种命令的文章,而是用于记录在平时工作中需要经常使用的命令,方便平时工作时使用,所以以后会持续新增一些常用而且很有用的命令。也希望这些命令能给读者带来一定的帮助。

当前已经记录的命令主要涉及到如下功能:

 一、常用的与Permission相关的adb命令

       二、通过Wifi连接手机

       三、通过adb命令操作四大组件

       四、实现一个操作多条adb命令的脚本

       五、用adb dump一些信息

       六、adb与进程

       七、adb命令模拟输入事件

       八、adb截屏&录屏

 九、通过adb打开特定开关或者取得系统相关属性值

十、通过adb打印log

一、常用的与Permission相关的adb命令

Android工具adb提供了一些命令,可以方便查看、授权、取消应用的权限,可以为调试程序带来不少的方便,下面简单介绍几个常见的命令。

1、查看指定app中权限申请情况

命令:adb shell dumpsys package [包名]

用途:该命令用于获取该app的package信息,Permission信息只是其中的一部分。

命令使用示例:

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 <权限名>

用途:该命令可以查看指定权限是谁声明的,有哪些应用申请了该权限。

命令使用示例:

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 的相机权限):

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会显示对这些权限的用途说明。

参考:【Viewing an app's permissions:https://developer.android.google.cn/guide/topics/permissions/overview#viewing

下面截图分别展示了命令不加-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 tcpip 5555 来设置。默认填5555就可以了,我试过其他的,没成功。

(3)连接手机

命令:adb connect [ip地址]

实例:

如果出现如下信息:

在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)

使用案例:

这句命令的作用就相当于执行了如下代码:

1 Intent intent = new Intent(“com.songwei.broadcast.demo”);
2 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 1
adb reboot
pause

五、用adb dump一些信息

1、查看内存信息

命令:adb shell dumpsys meminfo [进程名]

2、查看当前显示的界面信息

命令:adb shell dumpsys window | findstr mCurrentFocus

在命令窗口输入adb shell dumpsys命令可以打印出很多可以dump的条目。dump window/activity/input/SurfaceFliner平时可以留意一下。

六、adb与进程

1、查看进程

adb shell

ps -ef|grep [keyword] 关键字不用加引号,如下图所示:

2、杀死进程

adb shell

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启动了该功能。

七、adb命令模拟输入事件

adb提供了一些用adb模拟事件输入的命令,通过adb的帮助文档可以看到如下信息,这几简单介绍一下常用的手机相关的事件:

1、text

该命令用于向获得焦点的EditText控件输入内容。

2、keyevent

该命令用于向系统发送一个按键指令,实现模拟用户在键盘上的按键动作

Number 功能
3 按Home键
4 按Back键
24 增加音量
25 降低音量
26 电源
82 多任务

3、tap

该命令是用于向设备发送一个点击操作的指令,参数是<x> <y>坐标。

4、swipe

向设备发送一个滑动指令,并且可以选择设置滑动时长。

八、adb截屏&录屏

有时候在测试的时候,一些突发偶现事件,需要截图或者录屏时,可能因为触摸屏幕导致现象消失。此时通过命令来截屏或录屏就能很好地避免破坏现场。

1、截屏

命令:adb shell screencap -p path/fileName.png

说明:截屏的图片存储路径为path,文件名为fileName.png.

示例:

2、录屏

命令:adb shell screenrecord path/fileName.mp4

说明:录屏文件存储路径为path,文件名为fileName.mp4

示例:

九、通过adb打开特定开关或者取得系统相关属性值

1、通过Settings设置的相关值

命令:adb shell settings put keyName value 设置值

adb shell settings get keyName 获取值

2、通过SystemProperties设置的相关值

命令:adb shell setprop keyName value 设置系统属性keyName的属性值

adb shell getprop keyName 获取系统属性keyName的属性值

如下示例是用于设置/获取屏幕亮度相关的一个属性值

另外,在我的另外一篇文章【【朝花夕拾】Android Log篇】中第四点第(4)节“使用Log.isLoggable(tagName, level)”中,就用到了这个方法来控制Log的开关。

十、通过adb打印log

logcat | grep -i keyword显示包含 keyword的log -i表示忽略大小写
       logcat -s  tagName 显示tag为tagName的log
       logcat -t 10 打印最近的10条log
       logcat -b events/system/main 输出events/system/main log
       logcat -c 清空缓冲区日志

【烂笔头】常用adb命令记录的更多相关文章

  1. 【烂笔头】adb命令篇

    1.一个自动安装SystemUI.apk的脚本文件push-SystemUI.bat: adb rootadb remountadb push ./SystemUI.apk system/priv-a ...

  2. 分享一个常用Adb命令

    分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...

  3. Android 常用 adb 命令

    查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...

  4. Android 常用 adb 命令总结

    Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命 ...

  5. adb环境配置+常用adb命令+Logcat命令的用法+手动进行文件比对的方法+批量挪bug

    1. adb环境配置:下载adb环境变量包:打开计算机属性-高级系统设置-环境变量:新建变量adb,值为刚才的环境变量包路径:编辑path值,在最后面加上;%adb%;确定就妥了 2. 常用adb命令 ...

  6. 常用adb命令总结

    前言 很早就想整理一下自己平时常用的一些adb命令,不仅为了便于以后查找,而且整理的过程自己又重新复习了一遍,但是当我开始在度娘一搜的时候,发现很多人已经写的非常详细了,尤其是当我发现了这篇adb概括 ...

  7. [原创]Android 常用adb命令总结

    [原创]Android 常用adb命令总结 1 adb介绍 1.1 adb官方网站及下载 官方网站下载安装:http://adbshell.com/downloads 1.2 adb安装是否成功检查? ...

  8. 『与善仁』Appium基础 — 4、常用ADB命令(一)

    目录 1.启动和关闭ADB服务 2.查看ADB版本 3.指定adb server的网络端口 4.查询已连接设备/模拟器 5.获取安卓系统版本 6.为命令指定目标设备 7.发送文件到手机 8.从手机拉取 ...

  9. Android的常用adb命令

    第一部分:1. ubuntu下配置环境anroid变量:在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#setandroid environment2. 运行E ...

随机推荐

  1. PostgreSQL模式匹配的方法 LIKE等

    PostgreSQL 提供了三种实现模式匹配的方法:传统 SQL 的 LIKE 操作符.SQL99 新增的 SIMILAR TO 操作符. POSIX 风格的正则表达式.另外还有一个模式匹配函数 su ...

  2. DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版原创发布

    关于 DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  3. Spring Web Flow 的优缺点

    # 前言 Spring Web Flow = SWF 最近学习了<Spring实战>的第八章,Spring Web Flow.感觉是个不错的东西.无奈发现网上的资料少之又少.后来发现根本没 ...

  4. 2017-01-11&2017-01-12

    江门警情协作需求. 连续两天搞到超过十点半,所以今天来一并写一下这两天的记录吧. 1.11号明显的进展算是把通讯调通了,还有重新把协作请求的界面按一开始的设想嵌到主界面中. 2.今天12号貌似进展要大 ...

  5. block-chain java source

    source:github.com/enderlu/Swiftglobal ide:idea ,要安装Lombok plugin 配置: -Dspring.config.location=file:D ...

  6. Win8Metro(C#)数字图像处理--2.13Roberts边缘检测

    原文:Win8Metro(C#)数字图像处理--2.13Roberts边缘检测  [函数名称] 图像Roberts边缘检测函数RobertEdgeProcess(WriteableBitmap s ...

  7. GIS基础软件及操作(七)

    原文 GIS基础软件及操作(七) 练习七.地形分析 地形分析:TIN及DEM的生成及应用 加深对TIN建立过程的原理.方法的认识: 熟练掌握ArcGIS中建立DEM.TIN的技术方法: 结合实际,掌握 ...

  8. 核心思想:许多公司都没有认识到云储存的革命性(类似QQ把它搞成了用户的家、再也离不开了)

    在云储存刚刚兴起的时候,也就是dropbox刚刚进入大家视野的时候.许多人都是简单的认为这只是一个提供在线存储的服务而已,许多公司都没有认识到云储存的革命性. 对于这些大公司贸然进入一些新的领域是需要 ...

  9. Dynamic linking is coming to iOS, tvOS, and watchOS ports of Qt in the 5.9 release

    http://blog.qt.io/blog/2017/01/23/qt-5-8-released/ Dynamic linking is coming to iOS, tvOS, and watch ...

  10. 使用VS2010开发Qt程序的4点经验(QT4到QT5的升级,更改sln文件,切换工程使用的Qt库,在VS的Solution Explorer视图中建立文件夹)

    导读 相比于Qt Creator,我更喜欢用VS2010来进行开发.虽然启动时间相对较慢,但是VS下强大的快捷键和丰富的插件,以及使用多年的经验,都让我觉得在开发过程中得心应手.其中最重要的一点是,有 ...