当前位置:   article > 正文

(三十六) 从dumpsys package看Android权限

dumpsys package

前言:dumpsys package 这个命令还是很强大的,前段时间权限相关遇到比较多,趁周末好好研究下。


参考链接:

1.Define a Custom App Permission

2.https://developer.android.com/guide/topics/security/permissions#normal-dangerous


1. dumpsys  package 微信

使用命令:

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

权限分两段:

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

  1. Permissions:
  2. Permission [com.tencent.mm.matrix.strategynotify] (6ef054e):
  3. sourcePackage=com.tencent.mm
  4. uid=10138 gids=null type=0 prot=signature
  5. perm=Permission{fb7366f com.tencent.mm.matrix.strategynotify}
  6. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  7. Permission [com.tencent.mm.permission.MM_MESSAGE] (cfe3005):
  8. sourcePackage=com.tencent.mm
  9. uid=10138 gids=null type=0 prot=signature
  10. perm=Permission{3ba285a com.tencent.mm.permission.MM_MESSAGE}
  11. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  12. Permission [com.tencent.mm.plugin.permission.READ] (e2aca8b):
  13. sourcePackage=com.tencent.mm
  14. uid=10138 gids=null type=0 prot=signature
  15. perm=Permission{470c768 com.tencent.mm.plugin.permission.READ}
  16. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  17. Permission [com.tencent.mm.wear.message] (336c781):
  18. sourcePackage=com.tencent.mm
  19. uid=10138 gids=null type=0 prot=signature
  20. perm=Permission{de27026 com.tencent.mm.wear.message}
  21. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  22. Permission [com.tencent.mm.ext.permission.SPORT] (af98467):
  23. sourcePackage=com.tencent.mm
  24. uid=10138 gids=null type=0 prot=normal
  25. perm=Permission{13ef214 com.tencent.mm.ext.permission.SPORT}
  26. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  27. Permission [com.tencent.mm.ext.permission.WRITE] (5075abd):
  28. sourcePackage=com.tencent.mm
  29. uid=10138 gids=null type=0 prot=signature|privileged
  30. perm=Permission{cf568b2 com.tencent.mm.ext.permission.WRITE}
  31. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  32. Permission [com.tencent.mm.permission.C2D_MESSAGE] (6100003):
  33. sourcePackage=com.tencent.mm
  34. uid=10138 gids=null type=0 prot=signature
  35. perm=Permission{a231b80 com.tencent.mm.permission.C2D_MESSAGE}
  36. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  37. Permission [com.tencent.mm.plugin.permission.WRITE] (853e5b9):
  38. sourcePackage=com.tencent.mm
  39. uid=10138 gids=null type=0 prot=signature
  40. perm=Permission{1cd5dfe com.tencent.mm.plugin.permission.WRITE}
  41. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}
  42. Permission [com.tencent.mm.ext.permission.READ] (788995f):
  43. sourcePackage=com.tencent.mm
  44. uid=10138 gids=null type=0 prot=signature|privileged
  45. perm=Permission{25e6fac com.tencent.mm.ext.permission.READ}
  46. packageSetting=PackageSetting{c722f7c com.tencent.mm/10138}

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

  1. declared permissions:
  2. com.tencent.mm.plugin.permission.WRITE: prot=signature, INSTALLED
  3. com.tencent.mm.plugin.permission.READ: prot=signature, INSTALLED
  4. com.tencent.mm.permission.MM_MESSAGE: prot=signature, INSTALLED
  5. com.tencent.mm.ext.permission.READ: prot=signature|privileged, INSTALLED
  6. com.tencent.mm.ext.permission.WRITE: prot=signature|privileged, INSTALLED
  7. com.tencent.mm.ext.permission.SPORT: prot=normal, INSTALLED
  8. com.tencent.mm.wear.message: prot=signature, INSTALLED
  9. com.tencent.mm.permission.C2D_MESSAGE: prot=signature, INSTALLED
  10. com.tencent.mm.matrix.strategynotify: prot=signature, INSTALLED
  11. requested permissions:
  12. android.permission.CHANGE_WIFI_MULTICAST_STATE
  13. com.tencent.mm.plugin.permission.READ
  14. com.tencent.mm.plugin.permission.WRITE
  15. com.tencent.mm.permission.MM_MESSAGE
  16. com.huawei.authentication.HW_ACCESS_AUTH_SERVICE
  17. android.permission.ACCESS_NETWORK_STATE
  18. android.permission.ACCESS_COARSE_LOCATION
  19. android.permission.ACCESS_FINE_LOCATION
  20. android.permission.CAMERA
  21. android.permission.GET_TASKS
  22. android.permission.INTERNET
  23. android.permission.MODIFY_AUDIO_SETTINGS
  24. android.permission.RECEIVE_BOOT_COMPLETED
  25. android.permission.RECORD_AUDIO
  26. android.permission.READ_CONTACTS
  27. android.permission.READ_SMS
  28. android.permission.VIBRATE
  29. android.permission.WAKE_LOCK
  30. android.permission.WRITE_EXTERNAL_STORAGE
  31. android.permission.WRITE_CONTACTS
  32. android.permission.WRITE_SETTINGS
  33. com.android.launcher.permission.INSTALL_SHORTCUT
  34. com.android.launcher.permission.UNINSTALL_SHORTCUT
  35. com.android.launcher.permission.READ_SETTINGS
  36. com.tencent.mm.location.permission.SEND_VIEW
  37. android.permission.BLUETOOTH
  38. android.permission.BLUETOOTH_ADMIN
  39. android.permission.BROADCAST_STICKY
  40. android.permission.SYSTEM_ALERT_WINDOW
  41. android.permission.CHANGE_WIFI_STATE
  42. android.permission.GET_PACKAGE_SIZE
  43. android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
  44. android.permission.NFC
  45. com.huawei.android.launcher.permission.CHANGE_BADGE
  46. android.permission.WRITE_APP_BADGE
  47. android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  48. android.permission.READ_PHONE_STATE
  49. android.permission.READ_EXTERNAL_STORAGE
  50. com.tencent.mm.ext.permission.READ
  51. com.tencent.mm.ext.permission.WRITE
  52. android.permission.ACCESS_WIFI_STATE
  53. com.tencent.mm.wear.message
  54. android.permission.BODY_SENSORS
  55. com.google.android.c2dm.permission.RECEIVE
  56. android.permission.GET_ACCOUNTS
  57. com.tencent.mm.permission.C2D_MESSAGE
  58. com.android.vending.BILLING
  59. android.permission.MANAGE_ACCOUNTS
  60. android.permission.AUTHENTICATE_ACCOUNTS
  61. android.permission.READ_SYNC_SETTINGS
  62. android.permission.WRITE_SYNC_SETTINGS
  63. android.permission.READ_PROFILE
  64. android.permission.USE_FINGERPRINT
  65. com.tencent.mm.matrix.strategynotify
  66. install permissions:
  67. android.permission.DOWNLOAD_WITHOUT_NOTIFICATION: granted=true
  68. android.permission.MODIFY_AUDIO_SETTINGS: granted=true
  69. android.permission.MANAGE_ACCOUNTS: granted=true
  70. com.tencent.mm.matrix.strategynotify: granted=true
  71. android.permission.NFC: granted=true
  72. android.permission.WRITE_SYNC_SETTINGS: granted=true
  73. android.permission.RECEIVE_BOOT_COMPLETED: granted=true
  74. com.tencent.mm.permission.MM_MESSAGE: granted=true
  75. com.android.launcher.permission.UNINSTALL_SHORTCUT: granted=true
  76. android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS: granted=true
  77. android.permission.READ_PROFILE: granted=true
  78. android.permission.BLUETOOTH: granted=true
  79. android.permission.CHANGE_WIFI_MULTICAST_STATE: granted=true
  80. android.permission.GET_TASKS: granted=true
  81. android.permission.AUTHENTICATE_ACCOUNTS: granted=true
  82. android.permission.INTERNET: granted=true
  83. android.permission.BLUETOOTH_ADMIN: granted=true
  84. android.permission.GET_PACKAGE_SIZE: granted=true
  85. com.tencent.mm.plugin.permission.READ: granted=true
  86. com.tencent.mm.wear.message: granted=true
  87. com.tencent.mm.ext.permission.WRITE: granted=true
  88. com.android.launcher.permission.READ_SETTINGS: granted=true
  89. android.permission.BROADCAST_STICKY: granted=true
  90. android.permission.CHANGE_WIFI_STATE: granted=true
  91. android.permission.ACCESS_NETWORK_STATE: granted=true
  92. com.tencent.mm.permission.C2D_MESSAGE: granted=true
  93. android.permission.USE_FINGERPRINT: granted=true
  94. android.permission.READ_SYNC_SETTINGS: granted=true
  95. com.tencent.mm.plugin.permission.WRITE: granted=true
  96. android.permission.VIBRATE: granted=true
  97. android.permission.ACCESS_WIFI_STATE: granted=true
  98. com.android.launcher.permission.INSTALL_SHORTCUT: granted=true
  99. android.permission.WAKE_LOCK: granted=true
  100. com.tencent.mm.ext.permission.READ: granted=true
  101. User 0: ceDataInode=1425553 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false
  102. gids=[3002, 3003, 3001]
  103. runtime permissions:
  104. android.permission.ACCESS_FINE_LOCATION: granted=true
  105. android.permission.BODY_SENSORS: granted=true
  106. android.permission.READ_EXTERNAL_STORAGE: granted=true
  107. android.permission.ACCESS_COARSE_LOCATION: granted=true
  108. android.permission.READ_PHONE_STATE: granted=true
  109. android.permission.WRITE_CONTACTS: granted=true
  110. android.permission.CAMERA: granted=true
  111. android.permission.GET_ACCOUNTS: granted=true
  112. android.permission.WRITE_EXTERNAL_STORAGE: granted=true
  113. android.permission.RECORD_AUDIO: granted=true
  114. android.permission.READ_CONTACTS: granted=true
  115. disabledComponents:
  116. com.tencent.mm.plugin.nfc_open.ui.NfcWebViewUI


2. 权限概念

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

declared permissions :自定义权限

requested permissions :请求权限

install permissions :安装权限

runtime permissions  : 运行时权限


2.1 declared permissions

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

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

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

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

  1. <manifest
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.myapp" >
  4. <permission
  5. android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
  6. android:label="@string/permlab_deadlyActivity"
  7. android:description="@string/permdesc_deadlyActivity"
  8. android:permissionGroup="android.permission-group.COST_MONEY"
  9. android:protectionLevel="dangerous" />
  10. ...
  11. </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的例子:

  1. <string name="permlab_callPhone">directly call phone numbers</string>
  2. <string name="permdesc_callPhone">Allows the app to call
  3. phone numbers without your intervention. Malicious apps may
  4. cause unexpected calls on your phone bill. Note that this does not
  5. allow the app to call emergency numbers.</string>

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

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

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

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


2.2 requested permissions

看起来是应用所需权限的集合,包含其他权限成分,即

declared permissions :自定义权限

install permissions :安装权限

runtime permissions :运行时权限


2.3 install permissions 和 runtime permissions

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


正如在(三十五) 默认授予预制应用运行时权限方法 所说

“Android 6.0 及更高版本中的 Android 应用权限模式旨在使权限更易于用户理解、更实用、更安全。该模式将需要危险权限(请参阅受影响的权限)的 Android 应用从安装时权限模式转移至运行时权限模式:


安装时权限(Android 5.1 及更低版本):用户在安装或更新应用时,向应用授予危险权限。OEM/运营商可以在不通知用户的情况下,预先安装具有预授权的应用。
运行时权限(Android 6.0 及更高版本):用户在应用运行时向应用授予危险权限。应用决定何时申请权限(例如,在应用启动或用户访问特定功能时申请权限),但必须允许用户授予/拒绝授予应用访问特定权限组的权限。 OEM/运营商可以预安装应用,但不得预先授予权限(请参阅创建例外情况)
运行时权限可以为用户提供应用正在寻求或已被授予的权限的额外上下文和可视性。运行时模式还鼓励开发者帮助用户了解应用请求权限的原因,并向用户透明展示授予或拒绝权限的好处和危害。

用户可使用“设置”中的“应用”菜单撤消应用权限。”

正常权限和危险权限
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:

正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
特殊权限
有许多权限其行为方式与正常权限及危险权限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细管理屏幕,以响应该 intent。

如需了解有关如何请求这些权限的详情,请参阅 SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 参考条目。

权限组
所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的 targetSdkVersion 是 23 或更高版本,则当用户请求危险权限时系统会发生以下行为:

如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求 READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。
任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。

如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。


3. 总结

简单看起来权限分为三大块,自定义权限、正常权限和危险权限(或者说运行时权限),运行时权限比较特殊,在Android 6.0 以后应用需要在使用时弹框请求。自定义权限只接触了概念,下周写个demo玩一玩。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/261301
推荐阅读
相关标签
  

闽ICP备14008679号