简短而简单的问题:
rooted devices可以在运行时授予应用程序额外的权限(使用adb的“grant permission”命令,我记得)。这方面的一个示例是能够读取系统日志,该日志从API16开始成为非用户权限(链接here)。
是否有此类权限的列表?
答案 0 :(得分:14)
您可能会想到的命令是pm grant PACKAGE PERMISSION
,可以使用adb shell pm grant PACKAGE PERMISSION
将其发送到adb连接的设备。
但是,只能以这种方式授予或撤消可选权限。如果您尝试在应用程序的清单中授予未请求的权限,则您将获得Operation not allowed: java.lang.SecurityException: Package PACKAGE has not requested permission PERMISSION
。同样,如果您尝试撤销不被视为可选的权限,则您将获得Operation not allowed: java.lang.SecurityException: Can't change PERMISSION. It is required by the application
。即使对于有根设备或模拟器也是如此。
现在,就被认为是可选的'以及获取此类权限的列表而言,这有点不清楚。但是,根据一些实验,我认为这些至少包括分配给权限组android.permission-group.DEVELOPMENT_TOOLS
的权限集。您可以使用pm list permissions -g
查看正在运行的设备上的这些内容。在我的API 19仿真器以及运行AOSP 4.4.4的Nexus 7上,这些是:
group:android.permission-group.DEVELOPMENT_TOOLS
permission:android.permission.ACCESS_ALL_EXTERNAL_STORAGE
permission:android.permission.SIGNAL_PERSISTENT_PROCESSES
permission:android.permission.READ_LOGS
permission:android.permission.SET_ALWAYS_FINISH
permission:android.permission.WRITE_SECURE_SETTINGS
permission:android.permission.SET_PROCESS_LIMIT
permission:android.permission.CHANGE_CONFIGURATION
permission:android.permission.DUMP
permission:android.permission.SET_DEBUG_AP
如果(且仅当)在清单中声明了这些,则可以使用上述命令授予/撤销它们。请注意,安装时不会自动授予它们;您必须发出pm grant
命令。我能够通过使用“设置”应用观察并确认这一点,并在我授予和撤消它们时看到报告的权限发生变化。
可能还有其他权限,但我还没有找到它们。像android.permission.INTERNET
这样的普通权限无法以这种方式授予或撤销。
附录:关于pm set-permission-enforced PERMISSION
的评论部分中的每个附加问题:据我所知,目前唯一支持的权限是android.permission.READ_EXTERNAL_STORAGE
。我在阅读source code时基于此陈述,这与我使用该命令的经验一致。此权限的选择性强制设置的目的是允许在API {19}之前和之后的条件下测试应用程序{。{3}}。