最近公司集成很多第三方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 修改源码去掉动态权限 & 权限白名单设置】