使用命令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
获取当前运行的 activity
adb shell dumpsys activity | findstr Run
获取apk版本号、权限等信息的方法
举例: 以查询微信版本为例
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 : 运行时权限
自定义权限作用:与其他应用分享自己的资源和功能
(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>请求这些权限。
看起来是应用所需权限的集合,
包含其他权限成分,即
declared permissions :自定义权限
install permissions :安装权限
runtime permissions :运行时权限
我是这么理解的,Android 6.0之前的manifest里包含的所有权限声明都可以当做install permissions,Android 6.0即以后manifest里除了dangerous permissions即runtime permissions外则属于install permissions。
总结
简单看起来权限分为三大块,自定义权限、正常权限和危险权限(或者说运行时权限),运行时权限比较特殊,在Android 6.0 以后应用需要在使用时弹框请求。
使用 命令查看系统进程
使用 命令查看系统进程
结合 命令过滤多余的信息,
以微信为例
以手机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
进入Recovery 模式可以使用组合键,
也可以使用adb 命令 adb 命令进入recovery 模式如下
跳过
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
# 登陆到设备环境
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