/** Permission grant: not grant the permission. */
private static final int GRANT_DENIED = 1; 不授予权限
/** Permission grant: grant the permission as an install permission. */
private static final int GRANT_INSTALL = 2; 授予权限作为安装权限
/** Permission grant: grant the permission as a runtime one. */
private static final int GRANT_RUNTIME = 3; 授予运行运行时的权限
/** Permission grant: grant as runtime a permission that was granted as an install time one. */
private static final int GRANT_UPGRADE = 4; 授予作为运行时一个被授予的权限,作为一个安装时间
// IMPORTANT: There are two types of permissions: install and runtime.(系统权限分为普通install权限和危险runtime权限)
final int N = pkg.requestedPermissions.size();//获取AndroidManifest中请求的权限个数
for (int i = 0; i < N; i++) { //分别对里面的每个权限进行遍历,判断
*********************
int grant = GRANT_DENIED; //默认权限值为拒绝
if (bp.isNormal()) {
此处可以判断应用是不是在白名单内
grant = GRANT_INSTALL; //权限值为普通权限,会默认通过
} else if (bp.isRuntime()) { //当权限为危险权限
//grant = GRANT_DENIED;//系统中默认设置为危险权限
此处可以判断应用是不是在白名单内
grant = GRANT_INSTALL; //设置权限值为普通权限,会默认通过
}
Android 9实际代码:
private void grantPermissions(PackageParser.Package pkg, boolean replace,
String packageOfInterest, PermissionCallback callback) {
..........................
synchronized (mLock) {
final int N = pkg.requestedPermissions.size();
/// M: CTA requirement - permission control
boolean pkgReviewRequired = isPackageNeedsReview(pkg, ps.getSharedUser());
for (int i = 0; i < N; i++) {
final String permName = pkg.requestedPermissions.get(i);
final BasePermission bp = mSettings.getPermissionLocked(permName);
...............
final String perm = bp.getName();
boolean allowedSig = false;
int grant = GRANT_DENIED;
..............................
if (bp.isNormal()) {
// For all apps normal permissions are install time ones.
grant = GRANT_INSTALL;
} else if (bp.isRuntime()) {
............................
} else {
// For modern apps keep runtime permissions unchanged.
grant = GRANT_RUNTIME;
}
/// 加入黑名单控制
if (pkg.packageName.contains("com.koushikdutta.xxx1")
|| pkg.packageName.contains("com.sigma_rt.xxx2") ) {
Slog.d(TAG," bp.isRuntime change ");
grant = GRANT_INSTALL;
}
} else if (bp.isSignature()) {
........................ }
if (DEBUG_PERMISSIONS) {
Slog.i(TAG, "Granting permission " + perm + " to package " + pkg.packageName);
}
网上的这种说法都不正确,亲测。实际代码也可以解释
if(null != bp && permissionsState.grantInstallPermission(bp) != PermissionsState.PERMISSION_OPERATION_FAILURE) {
Slog.d(TAG, "zrx--- grant permission " + name + " to package " + pkg.packageName);
changedInstallPermission = true;
}
grantInstallPermission 明显不符合需求, 所以无效
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java:
Settings.Secure.DISPLAY_DENSITY_FORCED
kernel-4.4/drivers/misc/mediatek/video/mt6763/videox/primary_display.c: dispif_info->density = DISP_GetDensity();
plcm->params->physical_width plcm->params->width; plcm->params->density;
参考他人文档