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 中添加权限.

发布了25 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ChaoLi_Chen/article/details/103704703