Android 为所有app开放 系统app才能申请的权限(SD卡写权限 等。。)

在Android中有些权限只能有系统签名的app才能申请,第三方app不能申请。
如果要开放某个权限给第三方,我们只能修改系统源码。
android.permission.WRITE_MEDIA_STORAGE 是SD卡写权限,只有系统签名的app才可以申请。
第三方app如果要写SD卡 只能用 SAF,但是SAF对用户来说操作不方便。
我的思路很简单,把 android.permission.WRITE_MEDIA_STORAGE 开放给第三方应用。

如何查看每个app已经申请的权限,可以查看 data/system/packages.xml

要想分析 第三方应用为什么不能申请 android.permission.WRITE_MEDIA_STORAGE

分析过程比较麻烦
直接给出修改结果(以Android 6.0 为例)

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

private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,
            String packageOfInterest) {
………………………………………………
…………………………………………
switch (level) {
                case PermissionInfo.PROTECTION_NORMAL: {
                    // For all apps normal permissions are install time ones.
                    grant = GRANT_INSTALL;
                } break;

                case PermissionInfo.PROTECTION_DANGEROUS: {
                    if (pkg.applicationInfo.targetSdkVersion
                            <= Build.VERSION_CODES.LOLLIPOP_MR1) {
                        // For legacy apps dangerous permissions are install time ones.
                        grant = GRANT_INSTALL_LEGACY;
                    } else if (origPermissions.hasInstallPermission(bp.name)) {
                        // For legacy apps that became modern, install becomes runtime.
                        grant = GRANT_UPGRADE;
                    } else if (mPromoteSystemApps
                        && isSystemApp(ps)
                        && mExistingSystemPackages.contains(ps.name)) {
                        // For legacy system apps, install becomes runtime.
                        // We cannot check hasInstallPermission() for system apps since those
                        // permissions were granted implicitly and not persisted pre-M.
                        grant = GRANT_UPGRADE;
                    } else {
                        // For modern apps keep runtime permissions unchanged.
                        grant = GRANT_RUNTIME;
                    }
                } break;

                case PermissionInfo.PROTECTION_SIGNATURE: {
                    // For all apps signature permissions are install time ones.
                    allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
                    if (allowedSig || perm.equals("android.permission.WRITE_MEDIA_STORAGE") ) {
                        //subingxi open WRITE_MEDIA_STORAGE for all app
                        grant = GRANT_INSTALL;
                    }
                } break;
            }

上面的代码是我已经修改过的。
在 grantPermissionsLPw 方法的 case PermissionInfo.PROTECTION_SIGNATURE 中
if (allowedSig )
修改为
if (allowedSig || perm.equals(“android.permission.WRITE_MEDIA_STORAGE”) )

这个if 为true 是关键,如果你想某个app可以申请全部权限
if (allowedSig || pkg.packageName.equals(你APP包名))
这样就可以了。

你可能感兴趣的:(Android)