From 68d6ab7815fff610201e3d89d5dc3126241aa1ba Mon Sep 17 00:00:00 2001 From: JW Wang Date: Tue, 14 Apr 2020 18:14:00 +0800 Subject: [PATCH] Allow app to specify the rollback data policy in the manifest (1/n) See b/148098864#comment1. It makes more sense for an app to declare the data policy in their manifest, rather than leaving this decision to the installer. The attribute will be read by RollbackManager during install to decide which data policy to adopt when committing a rollback. Also migrate to ApkLiteParseUtils per https://googleplex-android-review.git.corp.google.com/c/platform/frameworks/base/+/11069722/1/core/java/android/content/pm/PackageParser.java#1660. Bug: 148098864 Test: m Change-Id: Ie6635249ea0dfbd21b0e56080fb492b9949841ec --- api/current.txt | 1 + core/java/android/content/pm/PackageParser.java | 11 +++++++++-- .../android/content/pm/parsing/ApkLiteParseUtils.java | 6 +++++- core/res/res/values/attrs_manifest.xml | 10 ++++++++++ core/res/res/values/public.xml | 1 + .../server/rollback/RollbackManagerServiceImpl.java | 8 +++++--- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/api/current.txt b/api/current.txt index da26c95ff45bb..2181f8af3658c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1165,6 +1165,7 @@ package android { field public static final int right = 16843183; // 0x10101af field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093 field public static final int ringtoneType = 16843257; // 0x10101f9 + field public static final int rollbackDataPolicy = 16844314; // 0x101061a field public static final int rotation = 16843558; // 0x1010326 field public static final int rotationAnimation = 16844090; // 0x101053a field public static final int rotationX = 16843559; // 0x1010327 diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 8a57f826ad2ea..09367902d8177 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -473,6 +473,7 @@ public class PackageParser { public final String targetPackageName; public final boolean overlayIsStatic; public final int overlayPriority; + public final int rollbackDataPolicy; public ApkLite(String codePath, String packageName, String splitName, boolean isFeatureSplit, @@ -483,7 +484,7 @@ public class PackageParser { boolean debuggable, boolean multiArch, boolean use32bitAbi, boolean useEmbeddedDex, boolean extractNativeLibs, boolean isolatedSplits, String targetPackageName, boolean overlayIsStatic, int overlayPriority, - int minSdkVersion, int targetSdkVersion) { + int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy) { this.codePath = codePath; this.packageName = packageName; this.splitName = splitName; @@ -509,6 +510,7 @@ public class PackageParser { this.overlayPriority = overlayPriority; this.minSdkVersion = minSdkVersion; this.targetSdkVersion = targetSdkVersion; + this.rollbackDataPolicy = rollbackDataPolicy; } public long getLongVersionCode() { @@ -1586,6 +1588,7 @@ public class PackageParser { String targetPackage = null; boolean overlayIsStatic = false; int overlayPriority = 0; + int rollbackDataPolicy = 0; String requiredSystemPropertyName = null; String requiredSystemPropertyValue = null; @@ -1652,6 +1655,9 @@ public class PackageParser { if ("useEmbeddedDex".equals(attr)) { useEmbeddedDex = attrs.getAttributeBooleanValue(i, false); } + if (attr.equals("rollbackDataPolicy")) { + rollbackDataPolicy = attrs.getAttributeIntValue(i, 0); + } } } else if (PackageParser.TAG_OVERLAY.equals(parser.getName())) { for (int i = 0; i < attrs.getAttributeCount(); ++i) { @@ -1709,7 +1715,8 @@ public class PackageParser { configForSplit, usesSplitName, isSplitRequired, versionCode, versionCodeMajor, revisionCode, installLocation, verifiers, signingDetails, coreApp, debuggable, multiArch, use32bitAbi, useEmbeddedDex, extractNativeLibs, isolatedSplits, - targetPackage, overlayIsStatic, overlayPriority, minSdkVersion, targetSdkVersion); + targetPackage, overlayIsStatic, overlayPriority, minSdkVersion, targetSdkVersion, + rollbackDataPolicy); } /** diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index 2f416a2538bae..80d14c6c98d72 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -292,6 +292,7 @@ public class ApkLiteParseUtils { String targetPackage = null; boolean overlayIsStatic = false; int overlayPriority = 0; + int rollbackDataPolicy = 0; String requiredSystemPropertyName = null; String requiredSystemPropertyValue = null; @@ -369,6 +370,9 @@ public class ApkLiteParseUtils { case "useEmbeddedDex": useEmbeddedDex = attrs.getAttributeBooleanValue(i, false); break; + case "rollbackDataPolicy": + rollbackDataPolicy = attrs.getAttributeIntValue(i, 0); + break; } } } else if (PackageParser.TAG_OVERLAY.equals(parser.getName())) { @@ -428,7 +432,7 @@ public class ApkLiteParseUtils { versionCodeMajor, revisionCode, installLocation, verifiers, signingDetails, coreApp, debuggable, multiArch, use32bitAbi, useEmbeddedDex, extractNativeLibs, isolatedSplits, targetPackage, overlayIsStatic, overlayPriority, minSdkVersion, - targetSdkVersion); + targetSdkVersion, rollbackDataPolicy); } public static VerifierInfo parseVerifier(AttributeSet attrs) { diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 2a2da6a458577..5914265f7e13f 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1835,6 +1835,16 @@ + + + + + + + + + + + diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index ac96838022364..6d0db477b3bd2 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -37,6 +37,7 @@ import android.content.pm.PackageParser; import android.content.pm.ParceledListSlice; import android.content.pm.UserInfo; import android.content.pm.VersionedPackage; +import android.content.pm.parsing.ApkLiteParseUtils; import android.content.rollback.IRollbackManager; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; @@ -835,9 +836,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } // Get information about the package to be installed. - PackageParser.PackageLite newPackage; + PackageParser.ApkLite newPackage; try { - newPackage = PackageParser.parsePackageLite(new File(session.resolvedBaseCodePath), 0); + newPackage = ApkLiteParseUtils.parseApkLite(new File(session.resolvedBaseCodePath), 0); } catch (PackageParser.PackageParserException e) { Slog.e(TAG, "Unable to parse new package", e); return false; @@ -845,7 +846,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { String packageName = newPackage.packageName; Slog.i(TAG, "Enabling rollback for install of " + packageName - + ", session:" + session.sessionId); + + ", session:" + session.sessionId + + ", rollbackDataPolicy=" + newPackage.rollbackDataPolicy); String installerPackageName = session.getInstallerPackageName(); if (!enableRollbackAllowed(installerPackageName, packageName)) {