From c87545bf7d2ebb22cdb689b4a0540236b085d98b Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Thu, 29 Sep 2022 17:28:47 +0000 Subject: [PATCH] Add CPU ABI fallback directly into PackageState To simplify the external API, the raw package ABI won't be exposed, only the overridden/device configured value available through the PackageState object. However, changing the default fallback behavior would also change the value that existing callers get within system server. It's difficult to audit whether or not each caller needs the fallback or not, so the behavior was maintained with separate getPrimaryCpuAbiLegacy and getSecondaryCpuAbiLegacy methods. These should gradually be removed as the callers' needs can be identified. Bug: 225395398 Test: atest PackageManagerSettingsTests Test: atest ScanTests Change-Id: Ibdf49d700ab6f21afa5a61c66f47dc2844b6cd45 --- .../com/android/server/pm/AppDataHelper.java | 3 +- .../com/android/server/pm/ComputerEngine.java | 4 +- .../server/pm/DeletePackageHelper.java | 2 +- .../com/android/server/pm/DexOptHelper.java | 5 +-- .../server/pm/InstallPackageHelper.java | 16 ++++---- .../android/server/pm/OtaDexoptService.java | 4 +- .../android/server/pm/PackageAbiHelper.java | 6 --- .../server/pm/PackageAbiHelperImpl.java | 6 +-- .../server/pm/PackageDexOptimizer.java | 9 ++--- .../com/android/server/pm/PackageSetting.java | 40 ++++++++++++++----- .../android/server/pm/ScanPackageUtils.java | 18 ++++----- .../java/com/android/server/pm/Settings.java | 24 +++++------ .../com/android/server/pm/dex/ArtUtils.java | 5 +-- .../server/pm/parsing/PackageInfoUtils.java | 12 ++++-- .../pm/parsing/pkg/AndroidPackageUtils.java | 26 ++---------- .../android/server/pm/pkg/PackageState.java | 2 +- .../server/pm/pkg/PackageStateInternal.java | 20 ++++++++++ .../pm/PackageManagerSettingsTests.java | 32 +++++++-------- .../src/com/android/server/pm/ScanTests.java | 4 +- 19 files changed, 127 insertions(+), 111 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index 0f5d8fd6fefa7..b8e1e9ae18329 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -298,7 +298,8 @@ final class AppDataHelper { // Create a native library symlink only if we have native libraries // and if the native libraries are 32 bit libraries. We do not provide // this symlink for 64 bit libraries. - String primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting); + String primaryCpuAbi = pkgSetting == null + ? AndroidPackageUtils.getRawPrimaryCpuAbi(pkg) : pkgSetting.getPrimaryCpuAbi(); if (primaryCpuAbi != null && !VMRuntime.is64BitAbi(primaryCpuAbi)) { final String nativeLibPath = pkg.getNativeLibraryDir(); if (!(new File(nativeLibPath).exists())) { diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index da6f042ca4626..ed846dbbfc1cd 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -1674,8 +1674,8 @@ public class ComputerEngine implements Computer { ApplicationInfo ai = new ApplicationInfo(); ai.packageName = ps.getPackageName(); ai.uid = UserHandle.getUid(userId, ps.getAppId()); - ai.primaryCpuAbi = ps.getPrimaryCpuAbi(); - ai.secondaryCpuAbi = ps.getSecondaryCpuAbi(); + ai.primaryCpuAbi = ps.getPrimaryCpuAbiLegacy(); + ai.secondaryCpuAbi = ps.getSecondaryCpuAbiLegacy(); ai.setVersionCode(ps.getVersionCode()); ai.flags = ps.getFlags(); ai.privateFlags = ps.getPrivateFlags(); diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 7ff91f827db1c..6d31121cea441 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -573,7 +573,7 @@ final class DeletePackageHelper { if (deleteCodeAndResources && (outInfo != null)) { outInfo.mArgs = new InstallArgs( ps.getPathString(), getAppDexInstructionSets( - ps.getPrimaryCpuAbi(), ps.getSecondaryCpuAbi())); + ps.getPrimaryCpuAbiLegacy(), ps.getSecondaryCpuAbiLegacy())); if (DEBUG_SD_INSTALL) Slog.i(TAG, "args=" + outInfo.mArgs); } } diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index cd074c0d4a5d7..3f04264714e4a 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -58,7 +58,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; -import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; @@ -470,8 +469,8 @@ final class DexOptHelper { // others will see that the compiled code for the library is up to date. Collection deps = SharedLibraryUtils.findSharedLibraries(pkgSetting); final String[] instructionSets = getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(p, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(p, pkgSetting)); + pkgSetting.getPrimaryCpuAbi(), + pkgSetting.getSecondaryCpuAbi()); if (!deps.isEmpty()) { DexoptOptions libraryOptions = new DexoptOptions(options.getPackageName(), options.getCompilationReason(), options.getCompilerFilter(), diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 81d47a0f0a9ce..30ecc1cb4e8fc 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1377,8 +1377,8 @@ final class InstallPackageHelper { // We moved the entire application as-is, so bring over the // previously derived ABI information. - parsedPackage.setPrimaryCpuAbi(ps.getPrimaryCpuAbi()) - .setSecondaryCpuAbi(ps.getSecondaryCpuAbi()); + parsedPackage.setPrimaryCpuAbi(ps.getPrimaryCpuAbiLegacy()) + .setSecondaryCpuAbi(ps.getSecondaryCpuAbiLegacy()); } } else { @@ -1932,10 +1932,8 @@ final class InstallPackageHelper { installRequest.getRemovedInfo().mArgs = new InstallArgs( oldPackage.getPath(), getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(oldPackage, - deletedPkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(oldPackage, - deletedPkgSetting))); + deletedPkgSetting.getPrimaryCpuAbi(), + deletedPkgSetting.getSecondaryCpuAbi())); } else { installRequest.getRemovedInfo().mArgs = null; } @@ -3944,8 +3942,8 @@ final class InstallPackageHelper { mRemovePackageHelper.cleanUpResources( new File(pkgSetting.getPathString()), - getAppDexInstructionSets(pkgSetting.getPrimaryCpuAbi(), - pkgSetting.getSecondaryCpuAbi())); + getAppDexInstructionSets(pkgSetting.getPrimaryCpuAbiLegacy(), + pkgSetting.getSecondaryCpuAbiLegacy())); synchronized (mPm.mLock) { mPm.mSettings.enableSystemPackageLPw(pkgSetting.getPackageName()); } @@ -4029,7 +4027,7 @@ final class InstallPackageHelper { + parsedPackage.getPath()); mRemovePackageHelper.cleanUpResources(new File(pkgSetting.getPathString()), getAppDexInstructionSets( - pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi())); + pkgSetting.getPrimaryCpuAbiLegacy(), pkgSetting.getSecondaryCpuAbiLegacy())); } else { // The application on /system is older than the application on /data. Hide // the application on /system and the version on /data will be scanned later diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index 5507b447fe7f4..56f24939c4e03 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -409,8 +409,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub { } final String[] instructionSets = getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(pkg, packageState), - AndroidPackageUtils.getSecondaryCpuAbi(pkg, packageState)); + packageState.getPrimaryCpuAbi(), + packageState.getSecondaryCpuAbi()); final List paths = AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg); final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java index 9bea599fa36a4..d839b147511fb 100644 --- a/services/core/java/com/android/server/pm/PackageAbiHelper.java +++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java @@ -22,7 +22,6 @@ import android.util.ArraySet; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; @@ -119,11 +118,6 @@ public interface PackageAbiHelper { this.secondary = secondary; } - Abis(AndroidPackage pkg, PackageSetting pkgSetting) { - this(AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting)); - } - public void applyTo(ParsedPackage pkg) { pkg.setPrimaryCpuAbi(primary) .setSecondaryCpuAbi(secondary); diff --git a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java index 75f5f93b12377..249de3ce45a38 100644 --- a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java +++ b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java @@ -517,12 +517,12 @@ final class PackageAbiHelperImpl implements PackageAbiHelper { ps.getPackageName())) { continue; } - if (ps.getPrimaryCpuAbi() == null) { + if (ps.getPrimaryCpuAbiLegacy() == null) { continue; } final String instructionSet = - VMRuntime.getInstructionSet(ps.getPrimaryCpuAbi()); + VMRuntime.getInstructionSet(ps.getPrimaryCpuAbiLegacy()); if (requiredInstructionSet != null && !requiredInstructionSet.equals(instructionSet)) { // We have a mismatch between instruction sets (say arm vs arm64) warn about // this but there's not much we can do. @@ -548,7 +548,7 @@ final class PackageAbiHelperImpl implements PackageAbiHelper { // scannedPackage did not require an ABI, in which case we have to adjust // scannedPackage to match the ABI of the set (which is the same as // requirer's ABI) - adjustedAbi = requirer.getPrimaryCpuAbi(); + adjustedAbi = requirer.getPrimaryCpuAbiLegacy(); } else { // requirer == null implies that we're updating all ABIs in the set to // match scannedPackage. diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 178d0ea594b1c..d25bca76245bf 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -265,8 +265,8 @@ public class PackageDexOptimizer { .getNonNativeUsesLibraryInfos(); final String[] instructionSets = targetInstructionSets != null ? targetInstructionSets : getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting)); + pkgSetting.getPrimaryCpuAbi(), + pkgSetting.getSecondaryCpuAbi()); final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); final List paths = AndroidPackageUtils.getAllCodePaths(pkg); @@ -736,9 +736,8 @@ public class PackageDexOptimizer { */ void dumpDexoptState(IndentingPrintWriter pw, AndroidPackage pkg, PackageStateInternal pkgSetting, PackageDexUsage.PackageUseInfo useInfo) { - final String[] instructionSets = getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting)); + final String[] instructionSets = getAppDexInstructionSets(pkgSetting.getPrimaryCpuAbi(), + pkgSetting.getSecondaryCpuAbi()); final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); final List paths = AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg); diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 9050722ec561c..8d6abe05db0e0 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -33,6 +33,7 @@ import android.content.pm.UserInfo; import android.content.pm.overlay.OverlayPaths; import android.os.UserHandle; import android.service.pm.PackageProto; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseArray; @@ -42,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DataClass; import com.android.server.pm.parsing.pkg.AndroidPackageInternal; +import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.permission.LegacyPermissionDataProvider; import com.android.server.pm.permission.LegacyPermissionState; import com.android.server.pm.pkg.AndroidPackage; @@ -1335,6 +1337,34 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return userState == null ? PackageUserState.DEFAULT : userState; } + @Nullable + public String getPrimaryCpuAbi() { + if (TextUtils.isEmpty(mPrimaryCpuAbi) && pkg != null) { + return AndroidPackageUtils.getRawPrimaryCpuAbi(pkg); + } + + return mPrimaryCpuAbi; + } + + @Nullable + public String getSecondaryCpuAbi() { + if (TextUtils.isEmpty(mSecondaryCpuAbi) && pkg != null) { + return AndroidPackageUtils.getRawSecondaryCpuAbi(pkg); + } + + return mSecondaryCpuAbi; + } + + @Nullable + public String getPrimaryCpuAbiLegacy() { + return mPrimaryCpuAbi; + } + + @Nullable + public String getSecondaryCpuAbiLegacy() { + return mSecondaryCpuAbi; + } + // Code below generated by codegen v1.0.23. @@ -1411,16 +1441,6 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return mLoadingProgress; } - @DataClass.Generated.Member - public @Nullable String getPrimaryCpuAbi() { - return mPrimaryCpuAbi; - } - - @DataClass.Generated.Member - public @Nullable String getSecondaryCpuAbi() { - return mSecondaryCpuAbi; - } - @DataClass.Generated.Member public @Nullable String getCpuAbiOverride() { return mCpuAbiOverride; diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java index bce6834b8b1bf..bd3c7dd0a4b48 100644 --- a/services/core/java/com/android/server/pm/ScanPackageUtils.java +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -157,8 +157,8 @@ final class ScanPackageUtils { if (pkgSetting.getPkg() != null && pkgSetting.getPkg().isStub()) { needToDeriveAbi = true; } else { - primaryCpuAbiFromSettings = pkgSetting.getPrimaryCpuAbi(); - secondaryCpuAbiFromSettings = pkgSetting.getSecondaryCpuAbi(); + primaryCpuAbiFromSettings = pkgSetting.getPrimaryCpuAbiLegacy(); + secondaryCpuAbiFromSettings = pkgSetting.getSecondaryCpuAbiLegacy(); } } else { // Re-scanning a system package after uninstalling updates; need to derive ABI @@ -229,8 +229,8 @@ final class ScanPackageUtils { // to null here, only to reset them at a later point. Settings.updatePackageSetting(pkgSetting, disabledPkgSetting, oldSharedUserSetting, sharedUserSetting, destCodeFile, parsedPackage.getNativeLibraryDir(), - AndroidPackageUtils.getPrimaryCpuAbi(parsedPackage, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(parsedPackage, pkgSetting), + pkgSetting.getPrimaryCpuAbi(), + pkgSetting.getSecondaryCpuAbi(), PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting), PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting), UserManagerService.getInstance(), @@ -327,8 +327,8 @@ final class ScanPackageUtils { // We haven't run dex-opt for this move (since we've moved the compiled output too) // but we already have this packages package info in the PackageSetting. We just // use that and derive the native library path based on the new code path. - parsedPackage.setPrimaryCpuAbi(pkgSetting.getPrimaryCpuAbi()) - .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbi()); + parsedPackage.setPrimaryCpuAbi(pkgSetting.getPrimaryCpuAbiLegacy()) + .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbiLegacy()); } // Set native library paths again. For moves, the path will be updated based on the @@ -378,8 +378,8 @@ final class ScanPackageUtils { if (DEBUG_ABI_SELECTION) { Log.d(TAG, "Abis for package[" + parsedPackage.getPackageName() + "] are" - + " primary=" + pkgSetting.getPrimaryCpuAbi() - + " secondary=" + pkgSetting.getSecondaryCpuAbi() + + " primary=" + pkgSetting.getPrimaryCpuAbiLegacy() + + " secondary=" + pkgSetting.getSecondaryCpuAbiLegacy() + " abiOverride=" + pkgSetting.getCpuAbiOverride()); } @@ -901,7 +901,7 @@ final class ScanPackageUtils { PackageSetting ps = sharedUserPackageSettings.valueAt(i); if (scannedPackage == null || !scannedPackage.getPackageName().equals(ps.getPackageName())) { - if (ps.getPrimaryCpuAbi() != null) { + if (ps.getPrimaryCpuAbiLegacy() != null) { continue; } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 0558fbdb63617..f2a7651b4daf5 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -837,8 +837,8 @@ public final class Settings implements Watchable, Snappable { } p.getPkgState().setUpdatedSystemApp(false); PackageSetting ret = addPackageLPw(name, p.getRealName(), p.getPath(), - p.getLegacyNativeLibraryPath(), p.getPrimaryCpuAbi(), - p.getSecondaryCpuAbi(), p.getCpuAbiOverride(), + p.getLegacyNativeLibraryPath(), p.getPrimaryCpuAbiLegacy(), + p.getSecondaryCpuAbiLegacy(), p.getCpuAbiOverride(), p.getAppId(), p.getVersionCode(), p.getFlags(), p.getPrivateFlags(), p.getUsesSdkLibraries(), p.getUsesSdkLibrariesVersionsMajor(), p.getUsesStaticLibraries(), p.getUsesStaticLibrariesVersions(), p.getMimeGroups(), @@ -2796,11 +2796,11 @@ public final class Settings implements Watchable, Snappable { if (pkg.getLegacyNativeLibraryPath() != null) { serializer.attribute(null, "nativeLibraryPath", pkg.getLegacyNativeLibraryPath()); } - if (pkg.getPrimaryCpuAbi() != null) { - serializer.attribute(null, "primaryCpuAbi", pkg.getPrimaryCpuAbi()); + if (pkg.getPrimaryCpuAbiLegacy() != null) { + serializer.attribute(null, "primaryCpuAbi", pkg.getPrimaryCpuAbiLegacy()); } - if (pkg.getSecondaryCpuAbi() != null) { - serializer.attribute(null, "secondaryCpuAbi", pkg.getSecondaryCpuAbi()); + if (pkg.getSecondaryCpuAbiLegacy() != null) { + serializer.attribute(null, "secondaryCpuAbi", pkg.getSecondaryCpuAbiLegacy()); } if (pkg.getCpuAbiOverride() != null) { serializer.attribute(null, "cpuAbiOverride", pkg.getCpuAbiOverride()); @@ -2834,11 +2834,11 @@ public final class Settings implements Watchable, Snappable { if (pkg.getLegacyNativeLibraryPath() != null) { serializer.attribute(null, "nativeLibraryPath", pkg.getLegacyNativeLibraryPath()); } - if (pkg.getPrimaryCpuAbi() != null) { - serializer.attribute(null, "primaryCpuAbi", pkg.getPrimaryCpuAbi()); + if (pkg.getPrimaryCpuAbiLegacy() != null) { + serializer.attribute(null, "primaryCpuAbi", pkg.getPrimaryCpuAbiLegacy()); } - if (pkg.getSecondaryCpuAbi() != null) { - serializer.attribute(null, "secondaryCpuAbi", pkg.getSecondaryCpuAbi()); + if (pkg.getSecondaryCpuAbiLegacy() != null) { + serializer.attribute(null, "secondaryCpuAbi", pkg.getSecondaryCpuAbiLegacy()); } if (pkg.getCpuAbiOverride() != null) { serializer.attribute(null, "cpuAbiOverride", pkg.getCpuAbiOverride()); @@ -4561,8 +4561,8 @@ public final class Settings implements Watchable, Snappable { pw.print(prefix); pw.print(" extractNativeLibs="); pw.println((ps.getFlags() & ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS) != 0 ? "true" : "false"); - pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.getPrimaryCpuAbi()); - pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.getSecondaryCpuAbi()); + pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.getPrimaryCpuAbiLegacy()); + pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.getSecondaryCpuAbiLegacy()); pw.print(prefix); pw.print(" cpuAbiOverride="); pw.println(ps.getCpuAbiOverride()); } pw.print(prefix); pw.print(" versionCode="); pw.print(ps.getVersionCode()); diff --git a/services/core/java/com/android/server/pm/dex/ArtUtils.java b/services/core/java/com/android/server/pm/dex/ArtUtils.java index 77aefc5cf910f..160add6fc79c9 100644 --- a/services/core/java/com/android/server/pm/dex/ArtUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtUtils.java @@ -42,9 +42,8 @@ public final class ArtUtils { AndroidPackage pkg, PackageStateInternal pkgSetting) { return new ArtPackageInfo( pkg.getPackageName(), - Arrays.asList(getAppDexInstructionSets( - AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting))), + Arrays.asList(getAppDexInstructionSets(pkgSetting.getPrimaryCpuAbi(), + pkgSetting.getSecondaryCpuAbi())), AndroidPackageUtils.getAllCodePaths(pkg), getOatDir(pkg, pkgSetting)); } diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index bc3d7a6b6778d..be3a4dab6152f 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -487,8 +487,10 @@ public class PackageInfoUtils { } info.seInfo = AndroidPackageUtils.getSeInfo(pkg, pkgSetting); - info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting); - info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting); + info.primaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawPrimaryCpuAbi(pkg) + : pkgSetting.getPrimaryCpuAbi(); + info.secondaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawSecondaryCpuAbi(pkg) + : pkgSetting.getSecondaryCpuAbi(); info.flags |= appInfoFlags(info.flags, pkgSetting); info.privateFlags |= appInfoPrivateFlags(info.privateFlags, pkgSetting); @@ -715,8 +717,10 @@ public class PackageInfoUtils { initForUser(info, pkg, userId); - info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting); - info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting); + info.primaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawPrimaryCpuAbi(pkg) + : pkgSetting.getPrimaryCpuAbi(); + info.secondaryCpuAbi = pkgSetting == null ? AndroidPackageUtils.getRawSecondaryCpuAbi(pkg) + : pkgSetting.getSecondaryCpuAbi(); info.nativeLibraryDir = pkg.getNativeLibraryDir(); info.secondaryNativeLibraryDir = pkg.getSecondaryNativeLibraryDir(); diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java index ca8ba6c325911..a6f1b291178a1 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java @@ -34,6 +34,7 @@ import com.android.internal.util.ArrayUtils; import com.android.server.SystemConfig; import com.android.server.pm.PackageManagerException; import com.android.server.pm.pkg.AndroidPackage; +import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedInstrumentation; @@ -271,27 +272,9 @@ public class AndroidPackageUtils { return true; } - public static String getPrimaryCpuAbi(AndroidPackage pkg, - @Nullable PackageStateInternal pkgSetting) { - if (pkgSetting == null || TextUtils.isEmpty(pkgSetting.getPrimaryCpuAbi())) { - return getRawPrimaryCpuAbi(pkg); - } - - return pkgSetting.getPrimaryCpuAbi(); - } - - public static String getSecondaryCpuAbi(AndroidPackage pkg, - @Nullable PackageStateInternal pkgSetting) { - if (pkgSetting == null || TextUtils.isEmpty(pkgSetting.getSecondaryCpuAbi())) { - return getRawSecondaryCpuAbi(pkg); - } - - return pkgSetting.getSecondaryCpuAbi(); - } - /** * Returns the primary ABI as parsed from the package. Used only during parsing and derivation. - * Otherwise prefer {@link #getPrimaryCpuAbi(AndroidPackage, PackageStateInternal)}. + * Otherwise prefer {@link PackageState#getPrimaryCpuAbi()}. */ public static String getRawPrimaryCpuAbi(AndroidPackage pkg) { return ((AndroidPackageHidden) pkg).getPrimaryCpuAbi(); @@ -299,10 +282,9 @@ public class AndroidPackageUtils { /** * Returns the secondary ABI as parsed from the package. Used only during parsing and - * derivation. Otherwise prefer - * {@link #getSecondaryCpuAbi(AndroidPackage, PackageStateInternal)}. + * derivation. Otherwise prefer {@link PackageState#getSecondaryCpuAbi()}. */ - public static String getRawSecondaryCpuAbi(AndroidPackage pkg) { + public static String getRawSecondaryCpuAbi(@NonNull AndroidPackage pkg) { return ((AndroidPackageHidden) pkg).getSecondaryCpuAbi(); } diff --git a/services/core/java/com/android/server/pm/pkg/PackageState.java b/services/core/java/com/android/server/pm/pkg/PackageState.java index a6e60166f69ab..fa1a63fc5986d 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageState.java +++ b/services/core/java/com/android/server/pm/pkg/PackageState.java @@ -154,7 +154,7 @@ public interface PackageState { /** * The install time CPU override, if any. This value is written at install time * and doesn't change during the life of an install. If non-null, - * {@link #getPrimaryCpuAbi()} will also contain the same value. + * {@link #getPrimaryCpuAbiLegacy()} will also contain the same value. * * @hide */ diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java b/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java index 8f5795bc47eb9..2f4c02774e4d3 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateInternal.java @@ -83,4 +83,24 @@ public interface PackageStateInternal extends PackageState { @NonNull PackageKeySetData getKeySetData(); + + /** + * Return the exact value stored inside this object for the primary CPU ABI type. This does + * not fallback to the inner {@link #getAndroidPackage()}, unlike {@link #getPrimaryCpuAbi()}. + * + * @deprecated Use {@link #getPrimaryCpuAbi()} if at all possible. + * + * TODO(b/249779400): Remove and see if the fallback-only API is a usable replacement + */ + @Deprecated + @Nullable + String getPrimaryCpuAbiLegacy(); + + /** + * Same behavior as {@link #getPrimaryCpuAbiLegacy()}, but with the secondary ABI. + * + * @deprecated Use {@link #getSecondaryCpuAbi()} if at all possible. + */ + @Nullable + String getSecondaryCpuAbiLegacy(); } diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java index 39220a429b8c4..f3ac246d12e43 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -749,8 +749,8 @@ public class PackageManagerSettingsTests { null /*usesStaticLibrariesVersions*/, null /*mimeGroups*/, UUID.randomUUID()); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("arm64-v8a")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("armeabi")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("arm64-v8a")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("armeabi")); assertThat(testPkgSetting01.getFlags(), is(0)); assertThat(testPkgSetting01.getPrivateFlags(), is(0)); final PackageUserState userState = testPkgSetting01.readUserState(0); @@ -785,8 +785,8 @@ public class PackageManagerSettingsTests { null /*usesStaticLibrariesVersions*/, null /*mimeGroups*/, UUID.randomUUID()); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("arm64-v8a")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("armeabi")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("arm64-v8a")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("armeabi")); assertThat(testPkgSetting01.getFlags(), is(ApplicationInfo.FLAG_SYSTEM)); assertThat(testPkgSetting01.getPrivateFlags(), is(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)); final PackageUserState userState = testPkgSetting01.readUserState(0); @@ -860,8 +860,8 @@ public class PackageManagerSettingsTests { assertThat(testPkgSetting01.getPackageName(), is(PACKAGE_NAME)); assertThat(testPkgSetting01.getFlags(), is(ApplicationInfo.FLAG_SYSTEM)); assertThat(testPkgSetting01.getPrivateFlags(), is(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("arm64-v8a")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("armeabi")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("arm64-v8a")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("armeabi")); // signatures object must be different assertNotSame(testPkgSetting01.getSignatures(), originalSignatures); assertThat(testPkgSetting01.getVersionCode(), is(UPDATED_VERSION_CODE)); @@ -901,8 +901,8 @@ public class PackageManagerSettingsTests { assertThat(testPkgSetting01.getPackageName(), is(PACKAGE_NAME)); assertThat(testPkgSetting01.getFlags(), is(0)); assertThat(testPkgSetting01.getPrivateFlags(), is(0)); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("x86_64")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("x86")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("x86_64")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("x86")); assertThat(testPkgSetting01.getVersionCode(), is(INITIAL_VERSION_CODE)); // by default, the package is considered stopped final PackageUserState userState = testPkgSetting01.readUserState(0); @@ -944,8 +944,8 @@ public class PackageManagerSettingsTests { assertThat(testPkgSetting01.getPackageName(), is(PACKAGE_NAME)); assertThat(testPkgSetting01.getFlags(), is(0)); assertThat(testPkgSetting01.getPrivateFlags(), is(0)); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("x86_64")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("x86")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("x86_64")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("x86")); assertThat(testPkgSetting01.getVersionCode(), is(INITIAL_VERSION_CODE)); final PackageUserState userState = testPkgSetting01.readUserState(0); verifyUserState(userState, false /*notLaunched*/, false /*stopped*/, true /*installed*/); @@ -987,8 +987,8 @@ public class PackageManagerSettingsTests { assertThat(testPkgSetting01.getPackageName(), is(PACKAGE_NAME)); assertThat(testPkgSetting01.getFlags(), is(0)); assertThat(testPkgSetting01.getPrivateFlags(), is(0)); - assertThat(testPkgSetting01.getPrimaryCpuAbi(), is("arm64-v8a")); - assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("armeabi")); + assertThat(testPkgSetting01.getPrimaryCpuAbiLegacy(), is("arm64-v8a")); + assertThat(testPkgSetting01.getSecondaryCpuAbiLegacy(), is("armeabi")); assertNotSame(testPkgSetting01.getSignatures(), disabledSignatures); assertThat(testPkgSetting01.getVersionCode(), is(UPDATED_VERSION_CODE)); final PackageUserState userState = testPkgSetting01.readUserState(0); @@ -1211,11 +1211,11 @@ public class PackageManagerSettingsTests { // assertThat(origPkgSetting.pkg, is(testPkgSetting.pkg)); assertThat(origPkgSetting.getFlags(), is(testPkgSetting.getFlags())); assertThat(origPkgSetting.getPrivateFlags(), is(testPkgSetting.getPrivateFlags())); - assertSame(origPkgSetting.getPrimaryCpuAbi(), testPkgSetting.getPrimaryCpuAbi()); - assertThat(origPkgSetting.getPrimaryCpuAbi(), is(testPkgSetting.getPrimaryCpuAbi())); + assertSame(origPkgSetting.getPrimaryCpuAbiLegacy(), testPkgSetting.getPrimaryCpuAbiLegacy()); + assertThat(origPkgSetting.getPrimaryCpuAbiLegacy(), is(testPkgSetting.getPrimaryCpuAbiLegacy())); assertThat(origPkgSetting.getRealName(), is(testPkgSetting.getRealName())); - assertSame(origPkgSetting.getSecondaryCpuAbi(), testPkgSetting.getSecondaryCpuAbi()); - assertThat(origPkgSetting.getSecondaryCpuAbi(), is(testPkgSetting.getSecondaryCpuAbi())); + assertSame(origPkgSetting.getSecondaryCpuAbiLegacy(), testPkgSetting.getSecondaryCpuAbiLegacy()); + assertThat(origPkgSetting.getSecondaryCpuAbiLegacy(), is(testPkgSetting.getSecondaryCpuAbiLegacy())); assertSame(origPkgSetting.getSignatures(), testPkgSetting.getSignatures()); assertThat(origPkgSetting.getSignatures(), is(testPkgSetting.getSignatures())); assertThat(origPkgSetting.getLastModifiedTime(), is(testPkgSetting.getLastModifiedTime())); diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java index 6f3249e3ec4b9..4d03749d27590 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java @@ -211,8 +211,8 @@ public class ScanTests { assertBasicPackageScanResult(scanResult, DUMMY_PACKAGE_NAME, false /*isInstant*/); - assertThat(scanResult.mPkgSetting.getPrimaryCpuAbi(), is("primaryCpuAbi")); - assertThat(scanResult.mPkgSetting.getSecondaryCpuAbi(), is("secondaryCpuAbi")); + assertThat(scanResult.mPkgSetting.getPrimaryCpuAbiLegacy(), is("primaryCpuAbi")); + assertThat(scanResult.mPkgSetting.getSecondaryCpuAbiLegacy(), is("secondaryCpuAbi")); assertThat(scanResult.mPkgSetting.getCpuAbiOverride(), nullValue()); assertPathsNotDerived(scanResult);