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 替换为你的包名即可。
欢迎留言。