针对手动下载的第三方应用停止运行情况(例如华数TV等),解决该问题的方案如下:

  1. 首先进入目录\frameworks\base\services\core\java\com\android\server\pm
  2. 修改第一步中进入的目录下的PackageManagerService.java文件(代码已修改在如下函数中)
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,            String packageOfInterest) {        // IMPORTANT: There are two types of permissions: install and runtime.        // Install time permissions are granted when the app is installed to        // all device users and users added in the future. Runtime permissions        // are granted at runtime explicitly to specific users. Normal and signature        // protected permissions are install time permissions. Dangerous permissions        // are install permissions if the app's target SDK is Lollipop MR1 or older,        // otherwise they are runtime permissions. This function does not manage        // runtime permissions except for the case an app targeting Lollipop MR1        // being upgraded to target a newer SDK, in which case dangerous permissions        // are transformed from install time to runtime ones.        final PackageSetting ps = (PackageSetting) pkg.mExtras;        if (ps == null) {            return;        }        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "grantPermissions");        PermissionsState permissionsState = ps.getPermissionsState();        PermissionsState origPermissions = permissionsState;        final int[] currentUserIds = UserManagerService.getInstance().getUserIds();        boolean runtimePermissionsRevoked = false;        int[] changedRuntimePermissionUserIds = EMPTY_INT_ARRAY;        boolean changedInstallPermission = false;        if (replace) {            ps.installPermissionsFixed = false;            if (!ps.isSharedUser()) {                origPermissions = new PermissionsState(permissionsState);                permissionsState.reset();            } else {                // We need to know only about runtime permission changes since the                // calling code always writes the install permissions state but                // the runtime ones are written only if changed. The only cases of                // changed runtime permissions here are promotion of an install to                // runtime and revocation of a runtime from a shared user.                changedRuntimePermissionUserIds = revokeUnusedSharedUserPermissionsLPw(                        ps.sharedUser, UserManagerService.getInstance().getUserIds());                if (!ArrayUtils.isEmpty(changedRuntimePermissionUserIds)) {                    runtimePermissionsRevoked = true;                }            }        }        permissionsState.setGlobalGids(mGlobalGids);        final int N = pkg.requestedPermissions.size();        for (int i=0; i pkgs = mAppOpPermissionPackages.get(bp.name);                if (pkgs == null) {                    pkgs = new ArraySet<>();                    mAppOpPermissionPackages.put(bp.name, pkgs);                }                pkgs.add(pkg.packageName);            }            final int level = bp.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;            final boolean appSupportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion                    >= Build.VERSION_CODES.M;            switch (level) {                case PermissionInfo.PROTECTION_NORMAL: {                    // For all apps normal permissions are install time ones.                    grant = GRANT_INSTALL;                } break;                case PermissionInfo.PROTECTION_DANGEROUS: {                    // If a permission review is required for legacy apps we represent                    // their permissions as always granted runtime ones since we need                    // to keep the review required permission flag per user while an                    // install permission's state is shared across all users.                    if (!appSupportsRuntimePermissions && !mPermissionReviewRequired                            && !Build.PERMISSIONS_REVIEW_REQUIRED) {                        // For legacy apps dangerous permissions are install time ones.                        grant = GRANT_INSTALL;                    } else if (origPermissions.hasInstallPermission(bp.name)) {                        // For legacy apps that became modern, install becomes runtime.                        grant = GRANT_UPGRADE;                    } else if (mPromoteSystemApps                            && isSystemApp(ps)                            && mExistingSystemPackages.contains(ps.name)) {                        // For legacy system apps, install becomes runtime.                        // We cannot check hasInstallPermission() for system apps since those                        // permissions were granted implicitly and not persisted pre-M.                        grant = GRANT_UPGRADE;                    } else {                        // For modern apps keep runtime permissions unchanged.                        grant = GRANT_RUNTIME;                    }                } break;                case PermissionInfo.PROTECTION_SIGNATURE: {                    // For all apps signature permissions are install time ones.                    allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);                    if (allowedSig) {                        grant = GRANT_INSTALL;                    }                } break;            }            if (DEBUG_INSTALL) {                Log.i(TAG, "Package " + pkg.packageName + " granting " + perm);            }            if (grant != GRANT_DENIED) {                if (!isSystemApp(ps) && ps.installPermissionsFixed) {                    // If this is an existing, non-system package, then                    // we can't add any new permissions to it.                    if (!allowedSig && !origPermissions.hasInstallPermission(perm)) {                        // Except...  if this is a permission that was added                        // to the platform (note: need to only do this when                        // updating the platform).                        if (!isNewPlatformPermissionForPackage(perm, pkg)) {                            grant = GRANT_DENIED;                        }                    }                }                switch (grant) {                    case GRANT_INSTALL: {                        // Revoke this as runtime permission to handle the case of                        // a runtime permission being downgraded to an install one.                        // Also in permission review mode we keep dangerous permissions                        // for legacy apps                        for (int userId : UserManagerService.getInstance().getUserIds()) {                            if (origPermissions.getRuntimePermissionState(                                    bp.name, userId) != null) {                                // Revoke the runtime permission and clear the flags.                                origPermissions.revokeRuntimePermission(bp, userId);                                origPermissions.updatePermissionFlags(bp, userId,                                      PackageManager.MASK_PERMISSION_FLAGS, 0);                                // If we revoked a permission permission, we have to write.                                changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                        changedRuntimePermissionUserIds, userId);                            }                        }                        // Grant an install permission.                        if (permissionsState.grantInstallPermission(bp) !=                                PermissionsState.PERMISSION_OPERATION_FAILURE) {                            changedInstallPermission = true;                        }                    } break;                    case GRANT_RUNTIME: {                        // Grant previously granted runtime permissions.                        for (int userId : UserManagerService.getInstance().getUserIds()) {                            PermissionState permissionState = origPermissions                                    .getRuntimePermissionState(bp.name, userId);                            int flags = permissionState != null                                    ? permissionState.getFlags() : 0;                            if (origPermissions.hasRuntimePermission(bp.name, userId)) {                                // Don't propagate the permission in a permission review mode if                                // the former was revoked, i.e. marked to not propagate on upgrade.                                // Note that in a permission review mode install permissions are                                // represented as constantly granted runtime ones since we need to                                // keep a per user state associated with the permission. Also the                                // revoke on upgrade flag is no longer applicable and is reset.                                final boolean revokeOnUpgrade = (flags & PackageManager                                        .FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0;                                if (revokeOnUpgrade) {                                    flags &= ~PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE;                                    // Since we changed the flags, we have to write.                                    changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                            changedRuntimePermissionUserIds, userId);                                }                                if (!mPermissionReviewRequired || !revokeOnUpgrade) {                                    if (permissionsState.grantRuntimePermission(bp, userId) ==                                            PermissionsState.PERMISSION_OPERATION_FAILURE) {                                        // If we cannot put the permission as it was,                                        // we have to write.                                        changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                                changedRuntimePermissionUserIds, userId);                                    }                                }                                // If the app supports runtime permissions no need for a review.                                if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED)                                        && appSupportsRuntimePermissions                                        && (flags & PackageManager                                                .FLAG_PERMISSION_REVIEW_REQUIRED) != 0) {                                    flags &= ~PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;                                    // Since we changed the flags, we have to write.                                    changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                            changedRuntimePermissionUserIds, userId);                                }                            } else if ((mPermissionReviewRequired                                        || Build.PERMISSIONS_REVIEW_REQUIRED)                                    && !appSupportsRuntimePermissions) {                                // For legacy apps that need a permission review, every new                                // runtime permission is granted but it is pending a review.                                // We also need to review only platform defined runtime                                // permissions as these are the only ones the platform knows                                // how to disable the API to simulate revocation as legacy                                // apps don't expect to run with revoked permissions.                                if (PLATFORM_PACKAGE_NAME.equals(bp.sourcePackage)) {                                    if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) == 0) {                                        flags |= FLAG_PERMISSION_REVIEW_REQUIRED;                                        // We changed the flags, hence have to write.                                        changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                                changedRuntimePermissionUserIds, userId);                                    }                                }                                if (permissionsState.grantRuntimePermission(bp, userId)                                        != PermissionsState.PERMISSION_OPERATION_FAILURE) {                                    // We changed the permission, hence have to write.                                    changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                            changedRuntimePermissionUserIds, userId);                                }                            }                            // Propagate the permission flags.                            permissionsState.updatePermissionFlags(bp, userId, flags, flags);                        }                    } break;                    case GRANT_UPGRADE: {                        // Grant runtime permissions for a previously held install permission.                        PermissionState permissionState = origPermissions                                .getInstallPermissionState(bp.name);                        final int flags = permissionState != null ? permissionState.getFlags() : 0;                        if (origPermissions.revokeInstallPermission(bp)                                != PermissionsState.PERMISSION_OPERATION_FAILURE) {                            // We will be transferring the permission flags, so clear them.                            origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL,                                    PackageManager.MASK_PERMISSION_FLAGS, 0);                            changedInstallPermission = true;                        }                        // If the permission is not to be promoted to runtime we ignore it and                        // also its other flags as they are not applicable to install permissions.                        if ((flags & PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE) == 0) {                            for (int userId : currentUserIds) {                                if (permissionsState.grantRuntimePermission(bp, userId) !=                                        PermissionsState.PERMISSION_OPERATION_FAILURE) {                                    // Transfer the permission flags.                                    permissionsState.updatePermissionFlags(bp, userId,                                            flags, flags);                                    // If we granted the permission, we have to write.                                    changedRuntimePermissionUserIds = ArrayUtils.appendInt(                                            changedRuntimePermissionUserIds, userId);                                }                            }                        }                    } break;                    default: {                        if (packageOfInterest == null                                || packageOfInterest.equals(pkg.packageName)) {                            Slog.w(TAG, "Not granting permission " + perm                                    + " to package " + pkg.packageName                                    + " because it was previously installed without");                        }                    } break;                }            } else {                if (permissionsState.revokeInstallPermission(bp) !=                        PermissionsState.PERMISSION_OPERATION_FAILURE) {                    // Also drop the permission flags.                    permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,                            PackageManager.MASK_PERMISSION_FLAGS, 0);                    changedInstallPermission = true;                    Slog.i(TAG, "Un-granting permission " + perm                            + " from package " + pkg.packageName                            + " (protectionLevel=" + bp.protectionLevel                            + " flags=0x" + Integer.toHexString(pkg.applicationInfo.flags)                            + ")");                } else if ((bp.protectionLevel&PermissionInfo.PROTECTION_FLAG_APPOP) == 0) {                    // Don't print warning for app op permissions, since it is fine for them                    // not to be granted, there is a UI for the user to decide.                    if (packageOfInterest == null || packageOfInterest.equals(pkg.packageName)) {                        Slog.w(TAG, "Not granting permission " + perm                                + " to package " + pkg.packageName                                + " (protectionLevel=" + bp.protectionLevel                                + " flags=0x" + Integer.toHexString(pkg.applicationInfo.flags)                                + ")");                    }                }            }        }        /*------     modify  below     -------*/        if(pkg.packageName.contains("cn.com.wasu.main")) {          final int permsSize = pkg.requestedPermissions.size();          for (int i=0; i

相关链接:https://blog.csdn.net/zengrunxiu/article/details/82871608

有关Android给系统应用开启默认权限 的链接:https://blog.csdn.net/wangjicong_215/article/details/52484694

更多相关文章

  1. Android基于XMPP Smack openfire 开发的聊天室(六) 【加入房间、权
  2. Android 判断应用是否开启了通知权限
  3. 【Android】1.6版本所有权限
  4. Android 危险权限与所有权限大全
  5. android apk 获取system权限
  6. Android检查手机是否Root以及应用是否获取Root权限
  7. Android如何获得系统(system)权限 !!!
  8. Android 抽象回调函数以及接口回调更新UI

随机推荐

  1. Android(安卓)ZXing 超简单的实现二维码
  2. Android(安卓)学习 之 Intent 调用大全
  3. debug.keystore文件不存在解决办法
  4. android studio 3.3.2 NDK编译C++(C) JNI
  5. Android(安卓)7.1 从底层到上层分析 Led
  6. JPush 推送消息给 Android
  7. 初识android自定义UI
  8. android之通知的使用
  9. Android底部菜单栏(RadioGroup+Fragment)美
  10. Android(安卓)Studio TCP IP 服务器和客