Android|Android 7.0 & 9.0 修改源码去掉动态权限 & 权限白名单设置

最近公司集成很多第三方APP,有很多的APP并没有进行动态权限申请,导致很多低版本的应用在大于6.0的系统上不能进行运行的问题,为此公司做出了让步,决定去到弹窗,只要是应用在AndroidManifest.xml进行申请的权限都可以使用.
预装的第三方app有两种:一种是adb push 到 pri-app下的
另一种是直接把代码放在package下编译出来的app。
我们是要所有app都不弹出确认框。
具体修改如下:
文章中每处修改的地方都可以通过判断 包名是否在白名单中而决定给予什么样的权限.
Android 7.0修改文件路径如下

framework/base/services/core/java/com/android/server/pm/PackageManagerService.java

在PackageManagerService.java 中有如下四种权限
/** Permission grant: not grant the permission. */ private static final int GRANT_DENIED = 1; 不授予权限/** Permission grant: grant the permission as an install permission. */ private static final int GRANT_INSTALL = 2; 授予权限作为安装权限/** Permission grant: grant the permission as a runtime one. */ private static final int GRANT_RUNTIME = 3; 授予运行运行时的权限/** Permission grant: grant as runtime a permission that was granted as an install time one. */ private static final int GRANT_UPGRADE = 4; 授予作为运行时一个被授予的权限,作为一个安装时间

具体修改的方法如下 只需要 将GRANT_DENIED ,GRANT_RUNTIME 替换成 GRANT_INSTALL即可
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace, String packageOfInterest) { ...........省略代码........... switch (level) { ...........省略代码........... case PermissionInfo.PROTECTION_DANGEROUS: {if (!appSupportsRuntimePermissions && !mPermissionReviewRequired && !Build.PERMISSIONS_REVIEW_REQUIRED) { ...........省略代码........... } else { // For modern apps keep runtime permissions unchanged. ------- 将 GRANT_RUNTIME 修改成 GRANT_INSTALL ------- 此处可以判断应用是不是在白名单内//grant = GRANT_RUNTIME; grant = GRANT_INSTALL; } } break; }if (grant != GRANT_DENIED) { if (!isSystemApp(ps) && ps.installPermissionsFixed) { if (!allowedSig && !origPermissions.hasInstallPermission(perm)) { if (!isNewPlatformPermissionForPackage(perm, pkg)) { //grant = GRANT_DENIED; ------- 将 GRANT_DENIED 修改成 GRANT_INSTALL ------- grant = GRANT_INSTALL; } } } ...........省略代码........... }


Android 9.0与7.0 路径相同 只是 具体的代码有差异
frameworks\base\services\core\java\com\android\server\pm\permission\PermissionManagerService.java

需要修改的方法名称: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; //设置权限值为普通权限,会默认通过 }

修改系统源码后,进行编译,烧录,启动的系统中,
请求危险权限就不会弹出对话框确认,直接可以获取到权限了
切记 此方法需要AndroidManifest.xml 中添加权限.
【Android|Android 7.0 & 9.0 修改源码去掉动态权限 & 权限白名单设置】

    推荐阅读