summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java65
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceUtils.java17
2 files changed, 60 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index d41727fc781f..2a90f4f203de 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -89,6 +89,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.comparePackageSig
import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures;
import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists;
import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride;
+import static com.android.server.pm.PackageManagerServiceUtils.extractAppMetadataFromApk;
import static com.android.server.pm.PackageManagerServiceUtils.isInstalledByAdb;
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive;
@@ -500,6 +501,36 @@ final class InstallPackageHelper {
mPm.setUpCustomResolverActivity(pkg, pkgSetting);
}
+ // When upgrading a package, pkgSetting is copied from oldPkgSetting. Clear the app
+ // metadata file path for the new package.
+ if (oldPkgSetting != null) {
+ pkgSetting.setAppMetadataFilePath(null);
+ }
+ // If the app metadata file path is not null then this is a system app with a preloaded app
+ // metadata file on the system image. Do not reset the path and source if this is the
+ // case.
+ if (pkgSetting.getAppMetadataFilePath() == null) {
+ File dir = new File(pkg.getPath());
+ if (pkgSetting.isSystem()) {
+ dir = new File(Environment.getDataDirectory(),
+ "app-metadata/" + pkg.getPackageName());
+ }
+ File appMetadataFile = new File(dir, APP_METADATA_FILE_NAME);
+ if (appMetadataFile.exists()) {
+ pkgSetting.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
+ if (Flags.aslInApkAppMetadataSource()) {
+ pkgSetting.setAppMetadataSource(APP_METADATA_SOURCE_INSTALLER);
+ }
+ } else if (Flags.aslInApkAppMetadataSource()) {
+ Map<String, PackageManager.Property> properties = pkg.getProperties();
+ if (properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
+ // ASL file extraction is done in post-install
+ pkgSetting.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
+ pkgSetting.setAppMetadataSource(APP_METADATA_SOURCE_APK);
+ }
+ }
+ }
+
if (pkg.getPackageName().equals("android")) {
mPm.setPlatformPackage(pkg, pkgSetting);
}
@@ -2215,24 +2246,6 @@ final class InstallPackageHelper {
installRequest.setNewUsers(
ps.queryInstalledUsers(allUsers, true));
ps.setUpdateAvailable(false /*updateAvailable*/);
-
- File appMetadataFile = new File(ps.getPath(), APP_METADATA_FILE_NAME);
- if (appMetadataFile.exists()) {
- ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
- if (Flags.aslInApkAppMetadataSource()) {
- ps.setAppMetadataSource(APP_METADATA_SOURCE_INSTALLER);
- }
- } else {
- Map<String, PackageManager.Property> properties = parsedPackage.getProperties();
- if (Flags.aslInApkAppMetadataSource()
- && properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
- // ASL file extraction is done in post-install
- ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
- ps.setAppMetadataSource(APP_METADATA_SOURCE_APK);
- } else {
- ps.setAppMetadataFilePath(null);
- }
- }
}
if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
// If this is an archival installation then we'll initialize the archive status,
@@ -2829,8 +2842,8 @@ final class InstallPackageHelper {
if (succeeded) {
if (Flags.aslInApkAppMetadataSource()
&& pkgSetting.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
- if (!PackageManagerServiceUtils.extractAppMetadataFromApk(request.getPkg(),
- pkgSetting.getAppMetadataFilePath())) {
+ if (!extractAppMetadataFromApk(request.getPkg(),
+ pkgSetting.getAppMetadataFilePath(), pkgSetting.isSystem())) {
synchronized (mPm.mLock) {
PackageSetting setting = mPm.mSettings.getPackageLPr(packageName);
if (setting != null) {
@@ -3815,6 +3828,18 @@ final class InstallPackageHelper {
new IncrementalProgressListener(parsedPackage.getPackageName(), mPm));
}
}
+
+ if (Flags.aslInApkAppMetadataSource()
+ && scanResult.mPkgSetting.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
+ if (!extractAppMetadataFromApk(parsedPackage,
+ scanResult.mPkgSetting.getAppMetadataFilePath(),
+ scanResult.mPkgSetting.isSystem())) {
+ synchronized (mPm.mLock) {
+ scanResult.mPkgSetting.setAppMetadataFilePath(null)
+ .setAppMetadataSource(APP_METADATA_SOURCE_UNKNOWN);
+ }
+ }
+ }
return scanResult.mPkgSetting.getPkg();
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 9484d0d7b52b..35af3a9a2dd9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -1571,11 +1571,23 @@ public class PackageManagerServiceUtils {
* Extract the app.metadata file from apk.
*/
public static boolean extractAppMetadataFromApk(AndroidPackage pkg,
- String appMetadataFilePath) {
+ String appMetadataFilePath, boolean isSystem) {
if (appMetadataFilePath == null) {
return false;
}
File appMetadataFile = new File(appMetadataFilePath);
+ if (appMetadataFile.exists()) {
+ return true;
+ }
+ if (isSystem) {
+ try {
+ makeDirRecursive(new File(appMetadataFilePath).getParentFile(), 0700);
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to create app metadata dir for package "
+ + pkg.getPackageName() + ": " + e.getMessage());
+ return false;
+ }
+ }
Map<String, Property> properties = pkg.getProperties();
if (!properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
return false;
@@ -1589,7 +1601,8 @@ public class PackageManagerServiceUtils {
for (int i = 0; i < splits.size(); i++) {
try (ZipFile zipFile = new ZipFile(splits.get(i).getPath())) {
ZipEntry zipEntry = zipFile.getEntry(fileInApkPath);
- if (zipEntry != null && zipEntry.getSize() <= getAppMetadataSizeLimit()) {
+ if (zipEntry != null
+ && (isSystem || zipEntry.getSize() <= getAppMetadataSizeLimit())) {
try (InputStream in = zipFile.getInputStream(zipEntry)) {
try (FileOutputStream out = new FileOutputStream(appMetadataFile)) {
FileUtils.copy(in, out);