{"record":{"id":"754e407353b0fe13","repo":"MuntashirAkon/AppManager","slug":"unknown-permission-permissionname","errorCode":null,"errorMessage":"Unknown permission ${permissionName}","messagePattern":"Unknown permission (.+?)","errorType":"exception","errorClass":"PermissionException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/permission/PermissionResolver.java","lineNumber":33,"sourceCode":"\n/**\n * Builds the permission model from current platform state.\n */\nfinal class PermissionResolver {\n    private PermissionResolver() {\n    }\n\n    @NonNull\n    static Permission resolve(@NonNull PackageManagerPermissionPlatform platform,\n                              @NonNull PackageInfo packageInfo,\n                              @NonNull String permissionName,\n                              @UserIdInt int userId,\n                              boolean appOpAllowed) throws PermissionException {\n        try {\n            PermissionInfo permissionInfo = platform.getPermissionInfo(permissionName,\n                    packageInfo.packageName);\n            if (permissionInfo == null) {\n                throw new PermissionException(\"Unknown permission \" + permissionName);\n            }\n            boolean granted = platform.checkPermission(permissionName, packageInfo.packageName,\n                    userId) == PERMISSION_GRANTED;\n            int flags = platform.getPermissionFlags(permissionName, packageInfo.packageName, userId);\n            int appOp = AppOpsManagerCompat.permissionToOpCode(permissionName);\n            int protection = PermissionInfoCompat.getProtection(permissionInfo);\n            int protectionFlags = PermissionInfoCompat.getProtectionFlags(permissionInfo);\n            if (protection == PermissionInfo.PROTECTION_DANGEROUS\n                    && PermUtils.systemSupportsRuntimePermissions()) {\n                return new RuntimePermission(permissionName, granted, appOp, appOpAllowed, flags);\n            }\n            if ((protectionFlags & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {\n                return new DevelopmentPermission(permissionName, granted, appOp, appOpAllowed,\n                        flags);\n            }\n            return new ReadOnlyPermission(permissionName, granted, appOp, appOpAllowed, flags);\n        } catch (PermissionException e) {\n            throw e;","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/permission/PermissionResolver.java#L15-L51","documentation":"PermissionResolver.resolve looks up a permission's PermissionInfo through the platform. If the platform returns null for the requested permission name, the resolver cannot determine protection level or flags and throws PermissionException('Unknown permission ...').","triggerScenarios":"Calling resolve() with a permissionName that the platform's getPermissionInfo() does not know: a typo, a permission declared only in an uninstalled app, or a vendor permission absent on this ROM.","commonSituations":"Applying permission rules exported from a different device/ROM where a vendor-defined permission existed; renamed permissions across Android versions; custom ROMs (e.g. LineageOS) lacking OEM permissions.","solutions":["Verify the permission name exists on this device (adb shell pm list permissions | grep <name>) before resolving","Filter out permissions unknown to the current platform when importing rules from another device","Catch PermissionException and skip that permission entry instead of aborting the whole batch","Update the rules export to include only permissions declared by installed packages"],"exampleFix":"// before\nPermission perm = resolver.resolve(packageInfo, \"vendor.foo.CUSTOM_PERM\", userId, false);\n// after\ntry {\n    Permission perm = resolver.resolve(packageInfo, \"vendor.foo.CUSTOM_PERM\", userId, false);\n} catch (PermissionException e) {\n    Log.w(TAG, \"Skipping unknown permission\", e);\n}","handlingStrategy":"try-catch","validationCode":"Set<String> known = platform.getAllPermissions(); // or pm list permissions\nif (!known.contains(permissionName)) {\n    Log.w(TAG, \"Skipping unknown permission \" + permissionName);\n    return;\n}","typeGuard":"boolean isKnownPermission(String name) {\n    try {\n        return platform.getPermissionInfo(name, null) != null;\n    } catch (Exception e) {\n        return false;\n    }\n}","tryCatchPattern":"try {\n    Permission p = resolver.resolve(packageInfo, name, userId, appOpAllowed);\n} catch (PermissionException e) {\n    if (e.getMessage().startsWith(\"Unknown permission\")) {\n        skippedPermissions.add(name);\n    } else throw e;\n}","preventionTips":["Only import rules exported from the same device/ROM","Filter rule files against the current device's permission list before resolving","Treat per-permission failures as skippable, not fatal"],"tags":["android","permissions","resolver","platform"],"backgroundTag":"resource-not-found","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}