#修改源码实现Android危险权限直接通过
在Android系统做6.0以后需要通过危险权限,
比如读写,录音,相机等,在都是需要动态申请才能获取到权限。
但是在系统开发中有时需要设置把危险权限设置和普通权限一样,
在AndroidManifest中申请就能通过,这就需要修改Android源代码来实现了。
网上看到几个方法,基本都不是很靠谱。
比如网上的这个方法:
如果不需要弹出此对话框来手动授予权限,而是默认授权,
可修改frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java文件下面的内容
doHandleMessage()下的case POST_INSTALL下
把final boolean grantPermissions = (args.installFlags& PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
改为final boolean grantPermissions = true;即可
其实上面这个方法是可以实现的普通安装的app实现不弹出窗口就可以获取到权限。
但是对于预装的app无效,这类app还是会弹框显示危险权限的确认。
预装的app有两种:一种是adb push 到 pri-app下的
另一种是直接把代码放在package下编译出来的app。
显然上面的修改是不完全符合我们需求的,我们是要所有app都不弹出确认框。
下面做一下实现这个功能简单介绍。
修改源码的主要类是:PermissionManagerService.java
这个类是Google Android系统就有的,
它的路径在\frameworks\base\services\core\java\com\android\server\pm\permission\下
需要修改的方法名称:grantPermissions //这里grant是同意或授予的意思
这个grantPermissions方法有参数:PackageParser.Package pkg,
通过pkg可以获取到包名,当前app需要申请的所有权限等等信息。
方法里面的部分过程解析:
// IMPORTANT: There are two types of permissions: install and runtime.(系统权限分为普通install权限和危险runtime权限)
final int N = pkg.requestedPermissions.size();//获取AndroidManifest中请求的权限个数
for (int i = 0; i < N; i++) { //分别对里面的每个权限进行遍历,判断
。。。
int grant = GRANT_DENIED; //默认权限值为拒绝
if (bp.isNormal()) {
grant = GRANT_INSTALL; //权限值为普通权限,会默认通过
} else if (bp.isRuntime()) { //当权限为危险权限
//grant = GRANT_DENIED;//系统中默认设置为危险权限
grant = GRANT_INSTALL; //设置权限值为普通权限,会默认通过
}
修改系统源码后,进行编译,烧录,启动的系统中,
请求危险权限就不会弹出对话框确认,直接可以获取到权限了!
本文的代码是在源码中的,只有系统开发者才能看到,普通开发者或用户是看不到的。
这里举例子的源码也是Android9.0中的源码,可能跟其他版本的源码不一样,
一般是控制权限的文件名不一样,方法名很少会改的。
其实通过系统云空间的搜索命令就可以搜到关键位置:
//搜索.java后缀的文件并且包含grantPermissions关键字的文件。
find . -name "*.java" | xargs grep -w "grantPermissions"
在源码中修改功能,很多时候都是靠搜索关键字来获取到关键位置的。
因为在不同版本的源码中,很多文件的位置或者命名会改变,但是方法名或关键字一般不会改变太大。
#共勉:没伞的孩子,必须努力奔跑。