From 430d5fb8172fd9ad0fc5794ee1b29036967c06d3 Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Mon, 20 Apr 2020 16:25:27 +0100 Subject: Extend isModule check for apk-in-apex If an apk inside an apex is the failing package in a rollback, we do not retrieve the logging parent of that apk since it is not considered a module by PackageManager. Instead, extend the logic to retrieve the logging parent of a package that is an apk-in-apex. This is done by querying the existing ApexManager mapping. Test: Manual. Test logging flow on com.google.android.providers.media.module before and after patch Bug: 154360162 Change-Id: I264bcd1beff89c966b5733f6be713166d066fc46 --- .../server/rollback/RollbackPackageHealthObserver.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java index 801d75b90a54..f6d46e24246c 100644 --- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.VersionedPackage; import android.content.rollback.PackageRollbackInfo; import android.content.rollback.RollbackInfo; @@ -41,10 +42,13 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.FrameworkStatsLog; +import com.android.server.LocalServices; import com.android.server.PackageWatchdog; import com.android.server.PackageWatchdog.FailureReasons; import com.android.server.PackageWatchdog.PackageHealthObserver; import com.android.server.PackageWatchdog.PackageHealthObserverImpact; +import com.android.server.pm.ApexManager; +import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.BufferedReader; import java.io.File; @@ -71,6 +75,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve private final Context mContext; private final Handler mHandler; + private final ApexManager mApexManager; private final File mLastStagedRollbackIdsFile; // Staged rollback ids that have been committed but their session is not yet ready @GuardedBy("mPendingStagedRollbackIds") @@ -85,6 +90,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve dataDir.mkdirs(); mLastStagedRollbackIdsFile = new File(dataDir, "last-staged-rollback-ids"); PackageWatchdog.getInstance(mContext).registerHealthObserver(this); + mApexManager = ApexManager.getInstance(); } @Override @@ -302,6 +308,18 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve * Returns true if the package name is the name of a module. */ private boolean isModule(String packageName) { + // Check if the package is an APK inside an APEX. If it is, use the parent APEX package when + // querying PackageManager. + PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); + AndroidPackage apkPackage = pmi.getPackage(packageName); + if (apkPackage != null) { + String apexPackageName = mApexManager.getActiveApexPackageNameContainingPackage( + apkPackage); + if (apexPackageName != null) { + packageName = apexPackageName; + } + } + PackageManager pm = mContext.getPackageManager(); try { return pm.getModuleInfo(packageName, 0) != null; -- cgit v1.2.3-59-g8ed1b