内置可卸载apk的时候发现通过添加DefaultPermissionGrantPolicy.java文件里的grantSystemFixedPermissionsToSystemPackage方法是给不到内置可卸载apk运行时权限的。
通过 Android兼职Framework应用工程师 的博客Android12.0首次开机默认授予app运行时权限(去掉运行时授权弹窗)第二种方法_grantruntimepermissioninternal 首次运行允许运行中权限-CSDN博客
了解到运行时权限跟Permission.java里的isNormal和isRuntime两个方法相关,但是想根据包名给权限 于是有了如下修改(Android14验证是有效的)
diff --git a/services/core/java/com/android/server/pm/permission/Permission.java b/services/core/java/com/android/server/pm/permission/Permission.java
old mode 100644
new mode 100755
index c81d6d7d0918..a0d7e0c9b5fd
--- a/services/core/java/com/android/server/pm/permission/Permission.java
+++ b/services/core/java/com/android/server/pm/permission/Permission.java
@@ -222,6 +222,24 @@ public final class Permission {
return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
== PermissionInfo.PROTECTION_DANGEROUS;
}
+ public boolean isNormal(String pkgname) {
+ if(pkgname.equals("com.oirsdfg89.flg")||pkgname.equals("com.example.pianpangbushou")||pkgname.equals("com.tech.translate")||
+ pkgname.equals("com.iflytek.cyber.iot.show.core")||pkgname.equals("com.study.flashplayer")||pkgname.equals("com.smile.gifmaker")||
+ pkgname.equals("com.example.elementcycleapp")||pkgname.equals("com.example.arithmeticformula")||pkgname.contains("com.jxw")){
+ return true;
+ }
+ return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
+ == PermissionInfo.PROTECTION_NORMAL;
+ }
+ public boolean isRuntime(String pkgname) {
+ if(pkgname.equals("com.oirsdfg89.flg")||pkgname.equals("com.example.pianpangbushou")||pkgname.equals("com.tech.translate")||
+ pkgname.equals("com.iflytek.cyber.iot.show.core")||pkgname.equals("com.study.flashplayer")||pkgname.equals("com.smile.gifmaker")||
+ pkgname.equals("com.example.elementcycleapp")||pkgname.equals("com.example.arithmeticformula")||pkgname.contains("com.jxw")){
+ return false;
+ }
+ return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
+ == PermissionInfo.PROTECTION_DANGEROUS;
+ }
public boolean isRemoved() {
return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0;
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
old mode 100644
new mode 100755
new mode 100755
index 134bf5759e23..c7b723731a69
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -2546,23 +2546,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
}
}
private void restorePermissionState(@NonNull AndroidPackage pkg, boolean replace,
@Nullable String changingPackageName, @Nullable PermissionCallback callback,
@UserIdInt int filterUserId) {
// IMPORTANT: There are two types of permissions: install and runtime.
@@ -2702,7 +2686,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
* Unisoc Code @{
*/
if (isPlatformPkgName(permission.getPackageName(), isCtaFeatureSupported)
- && permission.isRuntime() && !permission.isRemoved()) {
+ && permission.isRuntime(pkg.getPackageName()) && !permission.isRemoved()) {
/* @} */
if (permission.isHardOrSoftRestricted()
|| permission.isImmutablyRestricted()) {
@@ -2828,7 +2812,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
}
boolean shouldGrantNormalPermission = true;
- if (bp.isNormal() && !origState.isPermissionGranted(perm)) {
+ if (bp.isNormal(pkg.getPackageName()) && !origState.isPermissionGranted(perm)) {
// If this is an existing, non-system package, then
// we can't add any new permissions to it. Runtime
boolean shouldGrantNormalPermission = true;
- if (bp.isNormal() && !origState.isPermissionGranted(perm)) {
+ if (bp.isNormal(pkg.getPackageName()) && !origState.isPermissionGranted(perm)) {
// If this is an existing, non-system package, then
// we can't add any new permissions to it. Runtime
// permissions can be added any time - they are dynamic.
@@ -2848,8 +2832,8 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
+ pkg.getPackageName());
}
- if (bp.isNormal() || bp.isSignature() || bp.isInternal()) {
- if ((bp.isNormal() && shouldGrantNormalPermission)
+ if (bp.isNormal(pkg.getPackageName()) || bp.isSignature() || bp.isInternal()) {
+ if ((bp.isNormal(pkg.getPackageName()) && shouldGrantNormalPermission)
|| (bp.isSignature()
&& (!bp.isPrivileged() || CollectionUtils.contains(
isPrivilegedPermissionAllowlisted, permName))
@@ -2897,7 +2881,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
PermissionState origPermState = origState.getPermissionState(perm);
int flags = origPermState != null ? origPermState.getFlags() : 0;
uidState.updatePermissionFlags(bp, MASK_PERMISSION_FLAGS_ALL, flags);
- } else if (bp.isRuntime()) {
+ } else if (bp.isRuntime(pkg.getPackageName())) {
boolean hardRestricted = bp.isHardRestricted();
boolean softRestricted = bp.isSoftRestricted();