Android11 Framework定制之如何在设备出厂时赋予指定APK的动态权限?

1 动态权限的配置文件位置: ./misc_de/0/apexdata/com.android.permission/runtime-permissions.xml
里面保存了系统所有apk的动态权限申请情况,用户是否已经拥有这些权限。

2 系统使用以下代码来读取上面的权限配置文件:

   import com.android.permission.persistence.RuntimePermissionsPersistence;
  private final RuntimePermissionsPersistence mPersistence =
                RuntimePermissionsPersistence.createInstance();
                
  RuntimePermissionsState runtimePermissions = mPersistence.readForUser(UserHandle.of(userId));

我们只要想办法修改上面代码返回的结果即可,比如下面的:

 Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions =
                    runtimePermissions.getPackagePermissions();
            int packagesSize = mPackages.size();
            for (int i = 0; i < packagesSize; i++) {
                String packageName = mPackages.keyAt(i);
                PackageSetting packageSetting = mPackages.valueAt(i);

                List<RuntimePermissionsState.PermissionState> permissions =
                        packagePermissions.get(packageName);
						
			    if(packageName.equals("com.example.test")){
					 List<RuntimePermissionsState.PermissionState> newList =new ArrayList<>();
							for(RuntimePermissionsState.PermissionState permission : permissions){
								 String name = permission.getName();
								newList.add(new RuntimePermissionsState.PermissionState(name,true,permission.getFlags()));
															
							}
							permissions.clear();
							permissions.addAll(newList);
						}
		}

以上实现了将包 com.example.test的所有动态权限全部赋予。

具体修改是在frameworks/base/services/core/java/com/android/server/pm/Settings.java
里面的 readStateForUserSyncLPr 方法里面 。

但这个方法有几个缺点:
1 用户可以在设置里面看到并且用户可以主动回收其权限。
2 如使用 adb shell cmd package reset-permissions 之后,在关闭之前继续使用此app,会弹框正常请求这些动态权限 。

后面有时间完善。

另外一种方法是:

在com.android.server.pm.permission.DefaultPermissionGrantPolicy 增加以下方法:

private void grantRuntimePermissions2(PackageManagerWrapper pm,
                                                     int userId, PackageInfo pkg) {
    Set<String> permissions = new ArraySet<>();
    for (String permission : pkg.requestedPermissions) {
        final PermissionInfo perm = pm.getPermissionInfo(permission);
        if (perm == null) {
            continue;
        }
        if (perm.isRuntime()) {
            permissions.add(permission);
        }
    }
    if (!permissions.isEmpty()) {
        grantRuntimePermissions(pm, pkg, permissions, false /*systemFixed*/, userId);
    }
}

然后在 com.android.server.pm.permission.DefaultPermissionGrantPolicy#grantPermissionsToSysComponentsAndPrivApps 方法中 按照如下调用即可:

 PackageInfo my = pm.getPackageInfo("com.example.test2") ;
        if(my != null){
            grantRuntimePermissions2(pm, userId, my);
        }

将 com.example.test2 替换为你的包名即可。

欢迎留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值