ADB操作命令

下载ADB位置:https://download.csdn.net/download/qq_42095701/16078245


Python脚本利用adb进行手机控制的方法

这篇文章主要介绍了Python脚本利用adb进行手机控制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一.  adb 相关命令:

  1. 关闭adb服务:adb kill-server
  2. 启动adb服务  adb start-server
  3. 查询当前运行的所有设备  adb devices
  4. 可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行  -s 虚拟设备名称
  5. 重启设备 adb reboot  --指定虚拟设备   adb -s 设备名称 reboot
  6. 查看日志  adb logcat  清除日志 adb logcat -c
  7. 进入linux shell下  adb shell 其中常用的linux命令  cd  cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了
   8. 传入文件到设备中 adb push 本地文件 远程目录  

  9. 从设备中拷贝文件到本地  adb -s emulator-5556 pull /data/config.ini d:/

  10. 显示当前运行的全部模拟器:
      adb devices

  1 安装应用程序:
      adb install -r 123.apk

  12. 获取模拟器中的文件:
      adb pull <remote> <local>

  13. 向模拟器中写文件:
      adb push <local> <remote>

  14. 进入模拟器的shell模式:
      adb shell

  15. 卸载apk包:
        adb shell
        cd data/app
        rm 123.apk
       exit
        adb uninstall 123.apk
        adb install -r 123.apk

  16. 查看adb命令帮助信息:
        adb help
  17. 删除系统应用:
        adb remount (重新挂载系统分区,使系统分区重新可写)。
        adb shell
        cd system/app
        rm 123.apk

  18. 获取管理员权限:
        adb root

  19、复制文件:
       复制一个文件或目录到设备:
       adb push <source> <destination></destination></source>
        如:adb push update.zip /sdcard/
       从设备上复制一个文件或目录:
       adb pull <source> <destination></destination></source>
       如:adb pull /sdcard/update.zip.

  20、取得当前运行设备的实例的列表及每个实例的状态:
      adb devices

  21:adb shell input tap
      这条命令模拟Android手机在屏幕坐标(X,Y)处进行了点击操作。

   22:adb shell input swipe 

       这条命令模拟Android手机从屏幕坐标(X1,Y1)滑动到坐标(X2,Y2)的操作。

  23、uiautomator dump   dump: creates an XML dump of current UI hierarchy 这个命令是用来成成当前界面的UI层次,并用XML格式进行展示 。这样就可以获取各个组件的位置了

   注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s

  例如:adb -s 13b6e4c4 shell input tap 400 400

  表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置进行模拟的点击事件。

  24.   能看到设备信息就代表设备已经连接成功了,接下来的命令就是adb install 路径+包名.apk

例如我的安装包放在桌面,那么命令就是adb install C:\Users\hyh\Desktop\XXX.apk

*** adb shell uiautomator dump /mnt/sdcard/window_dump.xml 获得手机当前界面的UI信息,生成window_dump.xml
*** adb shell input text “123” 输入text

举例:

     1、打开cmd,进入到当前文件夹中,输入命令 adb devices 查看当前与电脑连接的设备(前提是,手机打开usb调试模式),可以查看已连接成功的手机。

    2、 若手机成功连接,输入命令 adb shell input tap 100 100 , 表示点击屏幕上坐标为(100,100)的点,如果不知道需要点击的点的具体位置的话可以在手机开发者模式中设置。

管理设备

1

2

3

4

5

6

7

8

9

10

11

12

注:android手机、模拟器统一称为“设备”

adb devices  // 显示连接到计算机的设备

adb get-serialno // 获取设备的ID和序列号serialNumber

------------------重启----------------------------------------------

adb reboot  // 重启设备

adb reboot bootloader  // 重启到bootloader,即刷机模式

adb reboot recovery  // 重启到recovery,即恢复模式

------------------发送命令到设备--------------------------------------

adb [-d|-e|-s <serialNumber>] <command>

-d 发送命令给usb连接的设备

-e 发送命令到模拟器设备

-s <serialNumber> 发送命令到指定设备

 

adb相关

1

2

3

4

adb kill-server // 终止adb服务进程

adb start-server // 重启adb服务进程

adb root // 已root权限重启adb服务

adb wait-for-device // 在模拟器/设备连接之前把命令转载在adb的命令器中

 

获取设备硬件信息

1

2

adb shell  cat /sys/class/net/wlan0/address  // 获取mac地址

adb shell cat /proc/cpuinfo  // 获取cpu序列号

 

管理设备app

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

aapt d badging <apkfile> // 获取apk的packagename 和 classname

------------------安装----------------------------------------------

adb install <apkfile>  // 安装apk

adb install -r <apkfile> // 保留数据和缓存文件,重新安装apk,

adb install -s <apkfile>  // 安装apk到sd卡

------------------卸载----------------------------------------------

adb uninstall <package>  // 卸载app

adb uninstall -k <package>  // 卸载app但保留数据和缓存文件

------------------启动app-------------------------------------------

adb shell am start -n <package_name>/.<activity_class_name> // 启动应用

------------------查看内存占用----------------------------------------

adb shell top  // 查看设备cpu和内存占用情况

adb shell top -m 6 // 查看占用内存前6的app

adb shell top -n 1 // 刷新一次内存信息,然后返回

adb shell procrank // 查询各进程内存使用情况

adb shell kill [pid] // 杀死一个进程

adb shell ps // 查看进程列表

adb shell ps -x [PID] // 查看指定进程状态

adb shell service list // 查看后台services信息

adb shell cat /proc/meminfo // 查看当前内存占用

adb shell cat /proc/iomem // 查看IO内存分区

 

文件操作

//android中,sdcard代表内置存储,不同系统中tf卡的设备名可能不同,使用查看adb shell ls mnt查看所有存储设备名。

1

2

3

4

5

6

7

8

9

10

11

12

adb remount  // 将system分区重新挂载为可读写分区

adb push <local> <remote> // 从本地复制文件到设备

adb pull <remote>  <local> // 从设备复制文件到本地

adb shell ls // 列出目录下的文件和文件夹,等同于dos中的dir命令

adb shell cd <folder> // 进入文件夹,等同于dos中的cd 命令

adb shell rename path/oldfilename path/newfilename // 重命名文件

adb shell rm /system/avi.apk  // 删除system/avi.apk

adb shell rm -r <folder> // 删除文件夹及其下面所有文件

adb shell mv path/file newpath/file // 移动文件

adb shell chmod 777 /system/fonts/DroidSansFallback.ttf // 设置文件权限

adb shell mkdir path/foldelname // 新建文件夹

adb shell cat <file> // 查看文件内容

简记版

获取序列号:

adb get-serialno

查看连接计算机的设备:

adb devices

重启机器:

adb reboot

重启到bootloader,即刷机模式:

adb reboot bootloader

重启到recovery,即恢复模式:

adb reboot recovery

查看log:

adb logcat

终止adb服务进程:

adb kill-server

重启adb服务进程:

adb start-server

获取机器MAC地址:

adb shell  cat /sys/class/net/wlan0/address

获取CPU序列号:

adb shell cat /proc/cpuinfo

安装APK:

adb install <apkfile> //比如:adb install baidu.apk

保留数据和缓存文件,重新安装apk:

adb install -r <apkfile> //比如:adb install -r baidu.apk

安装apk到sd卡:

adb install -s <apkfile> // 比如:adb install -s baidu.apk

卸载APK:

adb uninstall <package> //比如:adb uninstall com.baidu.search

卸载app但保留数据和缓存文件:

adb uninstall -k <package> //比如:adb uninstall -k com.baidu.search

启动应用:

adb shell am start -n <package_name>/.<activity_class_name>

查看设备cpu和内存占用情况:

adb shell top

查看占用内存前6的app:

adb shell top -m 6

刷新一次内存信息,然后返回:

adb shell top -n 1

查询各进程内存使用情况:

adb shell procrank

杀死一个进程:

adb shell kill [pid]

查看进程列表:

adb shell ps

查看指定进程状态:

adb shell ps -x [PID]

查看后台services信息:

adb shell service list

查看当前内存占用:

adb shell cat /proc/meminfo

查看IO内存分区:

adb shell cat /proc/iomem

将system分区重新挂载为可读写分区:

adb remount

从本地复制文件到设备:

adb push <local> <remote>

从设备复制文件到本地:

adb pull <remote>  <local>

列出目录下的文件和文件夹,等同于dos中的dir命令:

adb shell ls

进入文件夹,等同于dos中的cd 命令:

adb shell cd <folder>

重命名文件:

adb shell rename path/oldfilename path/newfilename

删除system/avi.apk:

adb shell rm /system/avi.apk

删除文件夹及其下面所有文件:

adb shell rm -r <folder>

移动文件:

adb shell mv path/file newpath/file

设置文件权限:

adb shell chmod 777 /system/fonts/DroidSansFallback.ttf

新建文件夹:

adb shell mkdir path/foldelname

查看文件内容:

adb shell cat <file>

查看wifi密码:

adb shell cat /data/misc/wifi/*.conf

清除log缓存:

adb logcat -c

查看bug报告:

adb bugreport

获取设备名称:

adb shell cat /system/build.prop

查看ADB帮助:

adb help

跑monkey:

adb shell monkey -v -p your.package.name 500

二. adb 模拟按键:

1. 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:

 

keycode含义
3HOME 键
4返回键
5打开拨号应用
6挂断电话
24增加音量
25降低音量
26电源键
27拍照(需要在相机应用里)
64打开浏览器
82菜单键
85播放/暂停
86停止播放
87播放下一首
88播放上一首
122移动光标到行首或列表顶部
123移动光标到行末或列表底部
126恢复播放
127暂停播放
164静音
176打开系统设置
187切换应用
207打开联系人
208打开日历
209打开音乐
210打开计算器
220降低屏幕亮度
221提高屏幕亮度
223系统休眠
224点亮屏幕
231打开语音助手
276如果没有 wakelock 则让系统休眠

2. input 命令的一些用法举例

 电源键

 命令:

adb shell input keyevent 26

执行效果相当于按电源键。

 菜单键

 命令:

adb shell input keyevent 82

 HOME 键
 命令:

adb shell input keyevent 3

返回键
命令:

adb shell input keyevent 4

音量控制
增加音量:

adb shell input keyevent 24

降低音量:

adb shell input keyevent 25

静音:

adb shell input keyevent 164

媒体控制

播放/暂停:

adb shell input keyevent 85

停止播放:

adb shell input keyevent 86

播放下一首:

adb shell input keyevent 87

播放上一首:

adb shell input keyevent 88

恢复播放:

adb shell input keyevent 126

暂停播放:

adb shell input keyevent 127

点亮/熄灭屏幕

可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。

点亮屏幕:

adb shell input keyevent 224

熄灭屏幕:

adb shell input keyevent 223

三、使用python脚本自动运行cmd 命令

 在adb文件夹下建立一个python文件

import os
os.system('adb shell input tap 100 100');

运行脚本,发现与在命令行输入相同语句有同样的效果。

2、也可以使用subprocess.Popen,最简单使用方式如下,设置shell=True,就不会弹出cmd框

process = subprocess.Popen('adb shell input tap 14 1402',shell=True)

程序实例: 

#coding:utf-8
#程序功能:可以实现抖音个人页面视频的自动点击,从而自动增加访问量
#思路:抖音主页中两个视频切换点击,可以实现访问量的增加
#使用ADB程序,视频的屏幕坐标可以使用adb shell uiautomator dump命令,获取该页面xml源码后查得
#下述是小米MIX2抖音主页第一个视频和第二个视频的坐标位置
#缺点:运行时不能移动屏幕,后续可以采用获取模块ID号的方式去点击相应的位置
import time
import subprocess
i = 0
#每次操作的间隔时间取决于手机配置,配置越高时间越短
sleep_time = 0.5 
while 1:
  #用popen设置shell=True不会弹出cmd框
  process = subprocess.Popen('adb shell input tap 14 1402',shell=True)
  time.sleep(sleep_time)
  process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True)
  time.sleep(sleep_time)
  process = subprocess.Popen('adb shell input tap 375 1402', shell=True)
  time.sleep(sleep_time)
  process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True)
  time.sleep(sleep_time)
  #os.system('adb shell input tap 14 1402')
  #os.system('adb shell input keyevent KEYCODE_BACK')
  #os.system('adb shell input tap 375 1402')
  i+=1
  print str(i) + 'clicks have been completed' 


 adb shell svc wifi enable   启动无线
 adb shell svc wifi disable  关闭无线
 
 adb shell svc data enable   启动移动网络
 adb shell svc data disable	 关闭移动网络

********************************************************************************************************************************* ********************************************************************************************************************************* ********************************************************************************************************************************* *********************************************************************************************************************************

强大的查询功能

使用命令adb shell getprop +下面的属性,即可获取相应的属性

 

属性名  //含义

ro.build.version.sdk SDK                            //版本

ro.build.version.release Android               //系统版本

ro.product.model                                         //型号

ro.product.brand                                         //品牌

ro.product.name                                         //设备名

 

 

查看内存消息指令

1   adb shell dumpsys meminfo                   # 查看整个设备的内存信息

2   adb shell dumpsys meminfo pid               # 查看指定进程的内存信息

3  adb shell dumpsys meminfo com.package.name  # 查看指定应用的内存信息

4  bash:bash shell

5  dalvik:是指dalvik所使用的内存。 native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。 VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

6  VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

7  RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)

8  PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

9  USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

10一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

 

dumpsys 获取系统数据

获取当前运行的 activity

adb shell dumpsys activity | findstr Run

 

获取apk版本号、权限等信息的方法

adb shell dumpsys package com.xxx.xxx(包名)

   举例:  以查询微信版本为例

adb shell dumpsys package com.tencent.mm

 

获取apk版本号、权限等信息的方法

adb shell dumpsys package com.xxx.xxx(包名)

举例:  以查询微信版本为例

adb shell dumpsys package com.tencent.mm > /home/jiatai/Android/dumpsys/weixin

权限分两段:

第一段(看起来都是自定义权限)

Permissions:

  Permission [com.tencent.mm.matrix.strategynotify] (6ef054e):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{fb7366f com.tencent.mm.matrix.strategynotify}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.permission.MM_MESSAGE] (cfe3005):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{3ba285a com.tencent.mm.permission.MM_MESSAGE}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.plugin.permission.READ] (e2aca8b):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{470c768 com.tencent.mm.plugin.permission.READ}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.wear.message] (336c781):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{de27026 com.tencent.mm.wear.message}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.ext.permission.SPORT] (af98467):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=normal

    perm=Permission{13ef214 com.tencent.mm.ext.permission.SPORT}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.ext.permission.WRITE] (5075abd):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature|privileged

    perm=Permission{cf568b2 com.tencent.mm.ext.permission.WRITE}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.permission.C2D_MESSAGE] (6100003):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{a231b80 com.tencent.mm.permission.C2D_MESSAGE}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.plugin.permission.WRITE] (853e5b9):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature

    perm=Permission{1cd5dfe com.tencent.mm.plugin.permission.WRITE}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

  Permission [com.tencent.mm.ext.permission.READ] (788995f):

    sourcePackage=com.tencent.mm

    uid=10138 gids=null type=0 prot=signature|privileged

    perm=Permission{25e6fac com.tencent.mm.ext.permission.READ}

    packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

 

第二段(很全的权限列表了):

declared permissions:

      com.tencent.mm.plugin.permission.WRITE: prot=signature, INSTALLED

      com.tencent.mm.plugin.permission.READ: prot=signature, INSTALLED

      com.tencent.mm.permission.MM_MESSAGE: prot=signature, INSTALLED

      com.tencent.mm.ext.permission.READ: prot=signature|privileged, INSTALLED

      com.tencent.mm.ext.permission.WRITE: prot=signature|privileged, INSTALLED

      com.tencent.mm.ext.permission.SPORT: prot=normal, INSTALLED

      com.tencent.mm.wear.message: prot=signature, INSTALLED

      com.tencent.mm.permission.C2D_MESSAGE: prot=signature, INSTALLED

      com.tencent.mm.matrix.strategynotify: prot=signature, INSTALLED

    requested permissions:

      android.permission.CHANGE_WIFI_MULTICAST_STATE

      com.tencent.mm.plugin.permission.READ

      com.tencent.mm.plugin.permission.WRITE

      com.tencent.mm.permission.MM_MESSAGE

      com.huawei.authentication.HW_ACCESS_AUTH_SERVICE

      android.permission.ACCESS_NETWORK_STATE

      android.permission.ACCESS_COARSE_LOCATION

      android.permission.ACCESS_FINE_LOCATION

      android.permission.CAMERA

      android.permission.GET_TASKS

      android.permission.INTERNET

      android.permission.MODIFY_AUDIO_SETTINGS

      android.permission.RECEIVE_BOOT_COMPLETED

      android.permission.RECORD_AUDIO

      android.permission.READ_CONTACTS

      android.permission.READ_SMS

      android.permission.VIBRATE

      android.permission.WAKE_LOCK

      android.permission.WRITE_EXTERNAL_STORAGE

      android.permission.WRITE_CONTACTS

      android.permission.WRITE_SETTINGS

      com.android.launcher.permission.INSTALL_SHORTCUT

      com.android.launcher.permission.UNINSTALL_SHORTCUT

      com.android.launcher.permission.READ_SETTINGS

      com.tencent.mm.location.permission.SEND_VIEW

      android.permission.BLUETOOTH

      android.permission.BLUETOOTH_ADMIN

      android.permission.BROADCAST_STICKY

      android.permission.SYSTEM_ALERT_WINDOW

      android.permission.CHANGE_WIFI_STATE

      android.permission.GET_PACKAGE_SIZE

      android.permission.DOWNLOAD_WITHOUT_NOTIFICATION

      android.permission.NFC

      com.huawei.android.launcher.permission.CHANGE_BADGE

      android.permission.WRITE_APP_BADGE

      android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

      android.permission.READ_PHONE_STATE

      android.permission.READ_EXTERNAL_STORAGE

      com.tencent.mm.ext.permission.READ

      com.tencent.mm.ext.permission.WRITE

      android.permission.ACCESS_WIFI_STATE

      com.tencent.mm.wear.message

      android.permission.BODY_SENSORS

      com.google.android.c2dm.permission.RECEIVE

      android.permission.GET_ACCOUNTS

      com.tencent.mm.permission.C2D_MESSAGE

      com.android.vending.BILLING

      android.permission.MANAGE_ACCOUNTS

      android.permission.AUTHENTICATE_ACCOUNTS

      android.permission.READ_SYNC_SETTINGS

      android.permission.WRITE_SYNC_SETTINGS

      android.permission.READ_PROFILE

      android.permission.USE_FINGERPRINT

      com.tencent.mm.matrix.strategynotify

    install permissions:

      android.permission.DOWNLOAD_WITHOUT_NOTIFICATION: granted=true

      android.permission.MODIFY_AUDIO_SETTINGS: granted=true

      android.permission.MANAGE_ACCOUNTS: granted=true

      com.tencent.mm.matrix.strategynotify: granted=true

      android.permission.NFC: granted=true

      android.permission.WRITE_SYNC_SETTINGS: granted=true

      android.permission.RECEIVE_BOOT_COMPLETED: granted=true

      com.tencent.mm.permission.MM_MESSAGE: granted=true

      com.android.launcher.permission.UNINSTALL_SHORTCUT: granted=true

      android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS: granted=true

      android.permission.READ_PROFILE: granted=true

      android.permission.BLUETOOTH: granted=true

      android.permission.CHANGE_WIFI_MULTICAST_STATE: granted=true

android.permission.GET_TASKS: granted=true

      android.permission.AUTHENTICATE_ACCOUNTS: granted=true

      android.permission.INTERNET: granted=true

      android.permission.BLUETOOTH_ADMIN: granted=true

      android.permission.GET_PACKAGE_SIZE: granted=true

      com.tencent.mm.plugin.permission.READ: granted=true

      com.tencent.mm.wear.message: granted=true

      com.tencent.mm.ext.permission.WRITE: granted=true

      com.android.launcher.permission.READ_SETTINGS: granted=true

      android.permission.BROADCAST_STICKY: granted=true

      android.permission.CHANGE_WIFI_STATE: granted=true

      android.permission.ACCESS_NETWORK_STATE: granted=true

      com.tencent.mm.permission.C2D_MESSAGE: granted=true

      android.permission.USE_FINGERPRINT: granted=true

      android.permission.READ_SYNC_SETTINGS: granted=true

      com.tencent.mm.plugin.permission.WRITE: granted=true

      android.permission.VIBRATE: granted=true

      android.permission.ACCESS_WIFI_STATE: granted=true

      com.android.launcher.permission.INSTALL_SHORTCUT: granted=true

      android.permission.WAKE_LOCK: granted=true

      com.tencent.mm.ext.permission.READ: granted=true

    User 0: ceDataInode=1425553 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false

      gids=[3002, 3003, 3001]

      runtime permissions:

        android.permission.ACCESS_FINE_LOCATION: granted=true

        android.permission.BODY_SENSORS: granted=true

        android.permission.READ_EXTERNAL_STORAGE: granted=true

        android.permission.ACCESS_COARSE_LOCATION: granted=true

        android.permission.READ_PHONE_STATE: granted=true

        android.permission.WRITE_CONTACTS: granted=true

        android.permission.CAMERA: granted=true

        android.permission.GET_ACCOUNTS: granted=true

        android.permission.WRITE_EXTERNAL_STORAGE: granted=true

        android.permission.RECORD_AUDIO: granted=true

        android.permission.READ_CONTACTS: granted=true

      disabledComponents:

        com.tencent.mm.plugin.nfc_open.ui.NfcWebViewUI

 

权限概念

从上面dumpsys package 微信的结果来看我们可以抽象出下面四个权限概念:

declared permissions :自定义权限

requested permissions :请求权限

install permissions :安装权限

runtime permissions  : 运行时权限

 

declared permissions

自定义权限作用:与其他应用分享自己的资源和功能

 

(By defining custom permissions, an app can share its resources and capabilities with other apps. )

 

为了创建自定义权限,你需要在你应用的AndroidManifest.xml里用一个或多个<permission>来声明。

比如说,一个应用想控制启动它的activity对象,那么可以像下面一个声明一个自定义权限:

<manifest

  xmlns:android="http://schemas.android.com/apk/res/android"

  package="com.example.myapp" >

    

    <permission

      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"

      android:label="@string/permlab_deadlyActivity"

      android:description="@string/permdesc_deadlyActivity"

      android:permissionGroup="android.permission-group.COST_MONEY"

      android:protectionLevel="dangerous" />

    ...

</manifest>

注意: 系统不允许许多应用声明相同的自定义权限,除非这些应用有相同的签名。如果一个包声明了一个权限,那么系统不允许用户安装其他声明该权限的应用,除非其他应用和第一个应用有相同的签名。为了避免命名冲突,我们推荐使用reverse-domain-style命名规则,

比如说

com.example.myapp.ENGAGE_HYPERSPACE。

 

protectionLevel:这个属性是必须的,告知系统如何提醒用户需要该权限的应用,或者谁允许来持有该权限。

permissionGroup:这个属性是可选的,只被用来帮助系统呈现权限给用户。在大多数情况,你应该将其设置为一个标准的系统权限组(在android.Manifest.permission_group中列出的),虽然你可以自己定义一个权限组,但是我们更建议使用存在的权限组,因为可以简化呈现给用户的UI。

label和description:你需要为自定义权限提供label和description。这些都是用户可以看到的字符串资源,label对应于标签,description对应于权限细节。label建议写的短一些,而description建议为几句话描述一下权限允许持有者可以做什么。我们推荐两段式描述,第一句描述一下权限,第二句描述一下如果应用获取了对应权限会有什么风险。

 

下面是一个CALL_PHONE的例子:

<string name="permlab_callPhone">directly call phone numbers</string>

<string name="permdesc_callPhone">Allows the app to call

    phone numbers without your intervention. Malicious apps may

    cause unexpected calls on your phone bill. Note that this does not

    allow the app to call emergency numbers.</string>

 

应用可以通过使用<uses-permission>来定义自定义权限和请求其他应用定义的权限。但是,你最好仔细评估是否需要这么做。

 

如果你这在设置一套暴露功能给其他应用的应用。如果这些应用没有相同的签名,那么每个权限仅会也仅能被定义一次。及时应用都具有相同的签名,我们也建议每个权限仅被定义一次。

 

如果功能只对具有相同签名的apps开放,那么你应用通过签名检查来避免自定义权限。当其中一个app请求你的其他app的时候,第二个app在应答请求之前可以校验一下两个app是否具有同样的签名。

如果你正在开发只在你自己设备上的app,你应该为你的apps开发并安装一个管理权限的包。这个包不需要提供任何服务,它仅仅声明所有的权限,并且其他应用使用<uses-permission>请求这些权限。

 

requested permissions

看起来是应用所需权限的集合,

包含其他权限成分,即

declared permissions :自定义权限

install permissions :安装权限

runtime permissions :运行时权限

 

install permissions 和 runtime permissions

我是这么理解的,Android 6.0之前的manifest里包含的所有权限声明都可以当做install permissions,Android 6.0即以后manifest里除了dangerous permissions即runtime permissions外则属于install permissions。

 

总结 

简单看起来权限分为三大块,自定义权限、正常权限和危险权限(或者说运行时权限),运行时权限比较特殊,在Android 6.0 以后应用需要在使用时弹框请求。

 

 

 

查看手机的进程 process

使用 top 命令查看系统进程

adb shell top

 

使用 ps 命令查看系统进程

adb shell ps

 

结合 findstr 命令过滤多余的信息,

以微信为例

adb shell ps | findstr mm

以手机qq为例

adb shell ps | findstr qq

 

输入法相关

获取已安装所有输入法

adb shell ime list -s

获取当前设备输入法

adb shell settings get secure default_input_method

设置输入法

 adb shell ime set com.android/input

 # 或者

 adb shell settings put secure default_input_method com.android/input

 

电量管理相关命令

模拟拔下设备电源

adb shell dumpsys battery unplug

低电量条件下的行为

adb shell settings put global low_power 1

恢复电源修改

adb shell dumpsys battery reset

 

使用 adb 命令进入 recovery 模式

进入Recovery 模式可以使用组合键,

也可以使用adb 命令 adb 命令进入recovery 模式如下

adb reboot recovery

 

启动、跳过 Google 开机向导:

跳过

1 adb shell pm disable com.google.android.setupwizard

2 adb shell settings put global device_provisioned 1

3 adb shell settings put secure user_setup_complete 1

启动

adb shell am start  com.google.android.setupwizard/.user.WelcomeActivity

 

看CPU信息

# 登陆到设备环境

adb shell

# 查看cpu信息

cat /proc/cpuinfo

 

可能看到以下的cpu版本:

arm32位

ARMv7

ARMv7s

arm64位

AArch64

ARMv8

ARMv9

x86

Intel

AMD

 

指定按键事件触发  (按下指定按键)

adb shell input keyevent <KEY_CODE> 

其中<KEY_CODE>填以下内容

 

电话键

NAME INFO CODE

KEYCODE_CALL 拨号键 5

KEYCODE_ENDCALL 挂机键 6

KEYCODE_HOME 按键Home 3

KEYCODE_MENU 菜单键 82

KEYCODE_BACK 返回键 4

KEYCODE_SEARCH 搜索键 84

KEYCODE_CAMERA 拍照键 27

KEYCODE_FOCUS 拍照对焦键 80

KEYCODE_POWER 电源键 26

KEYCODE_NOTIFICATION 通知键 83

KEYCODE_MUTE 话筒静音键 91

KEYCODE_VOLUME_MUTE 扬声器静音键 164

KEYCODE_VOLUME_UP 音量增加键 24

KEYCODE_VOLUME_DOWN 音量减小键 25

 

控制键

NAME INFO CODE

KEYCODE_ENTER 回车键 66

KEYCODE_ESCAPE ESC键 111

KEYCODE_DPAD_CENTER 导航键 确定键 23

KEYCODE_DPAD_UP 导航键 向上 19

KEYCODE_DPAD_DOWN 导航键 向下 20

KEYCODE_DPAD_LEFT 导航键 向左 21

KEYCODE_DPAD_RIGHT 导航键 向右 22

KEYCODE_MOVE_HOME 光标移动到开始键 122

KEYCODE_MOVE_END 光标移动到末尾键 123

KEYCODE_PAGE_UP 向上翻页键 92

KEYCODE_PAGE_DOWN 向下翻页键 93

KEYCODE_DEL 退格键 67

KEYCODE_FORWARD_DEL 删除键 112

KEYCODE_INSERT 插入键 124

KEYCODE_TAB Tab键 61

KEYCODE_NUM_LOCK 小键盘锁 143

KEYCODE_CAPS_LOCK 大写锁定键 115

KEYCODE_BREAK Break/Pause键 121

KEYCODE_SCROLL_LOCK 滚动锁定键 116

KEYCODE_ZOOM_IN 放大键 168

KEYCODE_ZOOM_OUT 缩小键 169

 

组合键

NAME INFO CODE

KEYCODE_ALT_LEFT Alt+Left

KEYCODE_ALT_RIGHT Alt+Right

KEYCODE_CTRL_LEFT Control+Left

KEYCODE_CTRL_RIGHT Control+Right

KEYCODE_SHIFT_LEFT Shift+Left

KEYCODE_SHIFT_RIGHT Shift+Right

 

基本

NAME INFO CODE

KEYCODE_0 按键’0’ 7

KEYCODE_1 按键’1’ 8

KEYCODE_2 按键’2’ 9

KEYCODE_3 按键’3’ 10

KEYCODE_4 按键’4’ 11

KEYCODE_5 按键’5’ 12

KEYCODE_6 按键’6’ 13

KEYCODE_7 按键’7’ 14

KEYCODE_8 按键’8’ 15

KEYCODE_9 按键’9’ 16

KEYCODE_A 按键’A’ 29

KEYCODE_B 按键’B’ 30

KEYCODE_C 按键’C’ 31

KEYCODE_D 按键’D’ 32

KEYCODE_E 按键’E’ 33

KEYCODE_F 按键’F’ 34

KEYCODE_G 按键’G’ 35

KEYCODE_H 按键’H’ 36

KEYCODE_I 按键’I’ 37

KEYCODE_J 按键’J’ 38

KEYCODE_K 按键’K’ 39

KEYCODE_L 按键’L’ 40

KEYCODE_M 按键’M’ 41

KEYCODE_N 按键’N’ 42

KEYCODE_O 按键’O’ 43

KEYCODE_P 按键’P’ 44

KEYCODE_Q 按键’Q’ 45

KEYCODE_R 按键’R’ 46

KEYCODE_S 按键’S’ 47

KEYCODE_T 按键’T’ 48

KEYCODE_U 按键’U’ 49

KEYCODE_V 按键’V’ 50

KEYCODE_W 按键’W’ 51

KEYCODE_X 按键’X’ 52

KEYCODE_Y 按键’Y’ 53

KEYCODE_Z 按键’Z’ 54

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值