diff options
| author | 2015-05-13 18:02:46 -0700 | |
|---|---|---|
| committer | 2015-05-13 18:54:57 -0700 | |
| commit | d9653703987f0ba194df6383d766173f65bf758e (patch) | |
| tree | 5f0dff4f005a869ac5f853b4edfb40a88d25b346 | |
| parent | 90c66e3ded4a91613b0c1760ab2ef15e0d118a36 (diff) | |
Do not allow opting out from the new permission model.
bug:20525775
Change-Id: I84cd4587db5adb96f6f29148adb242905f53f2dc
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 15 |
3 files changed, 27 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 832895cc1c5b..1c91e9bad1c2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -9670,6 +9670,7 @@ package android.content.pm { field public static final int INSTALL_FAILED_NO_SHARED_USER = -6; // 0xfffffffa field public static final int INSTALL_FAILED_OLDER_SDK = -12; // 0xfffffff4 field public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; // 0xffffffe9 + field public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26; // 0xffffffe6 field public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; // 0xfffffff6 field public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; // 0xfffffff8 field public static final int INSTALL_FAILED_TEST_ONLY = -15; // 0xfffffff1 diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 202a8a7ae231..2ca030635ef5 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -653,6 +653,16 @@ public abstract class PackageManager { public static final int INSTALL_FAILED_VERSION_DOWNGRADE = -25; /** + * Installation return code: this is passed to the {@link IPackageInstallObserver} by + * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} if + * the old package has target SDK high enough to support runtime permission and + * the new package has target SDK low enough to not support runtime permissions. + * @hide + */ + @SystemApi + public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26; + + /** * Installation parse return code: this is passed to the {@link IPackageInstallObserver} by * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} * if the parser was given a path that is not a file, or does not end with the expected @@ -4512,6 +4522,7 @@ public abstract class PackageManager { case INSTALL_FAILED_PACKAGE_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_FAILED_UID_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_FAILED_VERSION_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID; + case INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_NOT_APK: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_BAD_MANIFEST: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: return PackageInstaller.STATUS_FAILURE_INVALID; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6f4820946257..4065a6063a7e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11458,6 +11458,21 @@ public class PackageManagerService extends IPackageManager.Stub { replace = true; if (DEBUG_INSTALL) Slog.d(TAG, "Replace existing pacakge: " + pkgName); } + + // Prevent apps opting out from runtime permissions + if (replace) { + PackageParser.Package oldPackage = mPackages.get(pkgName); + final int oldTargetSdk = oldPackage.applicationInfo.targetSdkVersion; + final int newTargetSdk = pkg.applicationInfo.targetSdkVersion; + if (oldTargetSdk > Build.VERSION_CODES.LOLLIPOP_MR1 + && newTargetSdk <= Build.VERSION_CODES.LOLLIPOP_MR1) { + res.setError(PackageManager.INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE, + "Package " + pkg.packageName + " new target SDK " + newTargetSdk + + " doesn't support runtime permissions but the old" + + " target SDK " + oldTargetSdk + " does."); + return; + } + } } PackageSetting ps = mSettings.mPackages.get(pkgName); |