Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +27 −22 Original line number Diff line number Diff line Loading @@ -1509,7 +1509,9 @@ final class InstallPackageHelper { } else { // Enable SCAN_NO_DEX flag to skip dexopt at a later stage scanFlags |= SCAN_NO_DEX; // The native libs of Apex is located in apex_payload.img, don't need to parse it from // the original apex file if (!isApex) { try { PackageSetting pkgSetting; synchronized (mPm.mLock) { Loading @@ -1520,11 +1522,13 @@ final class InstallPackageHelper { final String abiOverride = deriveAbiOverride(request.getAbiOverride()); // TODO: Are these system flags actually set properly at this stage? boolean isUpdatedSystemAppInferred = pkgSetting != null && pkgSetting.isSystem(); boolean isUpdatedSystemAppInferred = pkgSetting != null && pkgSetting.isSystem(); final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage, systemApp, isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred, abiOverride, ScanPackageUtils.getAppLib32InstallDir()); derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage, systemApp, (isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred), abiOverride, ScanPackageUtils.getAppLib32InstallDir()); derivedAbi.first.applyTo(parsedPackage); derivedAbi.second.applyTo(parsedPackage); } catch (PackageManagerException pme) { Loading @@ -1534,6 +1538,7 @@ final class InstallPackageHelper { PackageManagerException.INTERNAL_ERROR_DERIVING_ABI); } } } if (!isApex) { doRenameLI(request, parsedPackage); Loading services/core/java/com/android/server/pm/ScanPackageUtils.java +72 −63 Original line number Diff line number Diff line Loading @@ -149,6 +149,8 @@ final class ScanPackageUtils { String primaryCpuAbiFromSettings = null; String secondaryCpuAbiFromSettings = null; boolean needToDeriveAbi = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; boolean isApex = (scanFlags & SCAN_AS_APEX) != 0; if (!needToDeriveAbi) { if (pkgSetting != null) { // TODO(b/154610922): if it is not first boot or upgrade, we should directly use Loading Loading @@ -240,6 +242,7 @@ final class ScanPackageUtils { usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(), newDomainSetId); } if (createNewPackage && originalPkgSetting != null) { // This is the initial transition from the original package, so, // fix up the new package's name now. We must do this after looking Loading Loading @@ -279,6 +282,9 @@ final class ScanPackageUtils { final boolean isUpdatedSystemApp = pkgSetting.isUpdatedSystemApp(); final File appLib32InstallDir = getAppLib32InstallDir(); // The native libs of Apex is located in apex_payload.img, don't need to parse it from // the original apex file if (!isApex) { if ((scanFlags & SCAN_NEW_INSTALL) == 0) { if (needToDeriveAbi) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi"); Loading @@ -301,15 +307,16 @@ final class ScanPackageUtils { // in which case we might end up not detecting abi solely based on apk // structure. Try to detect abi based on directory structure. String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage); String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi( parsedPackage); if (isSystemApp && !isUpdatedSystemApp && pkgRawPrimaryCpuAbi == null) { final PackageAbiHelper.Abis abis = packageAbiHelper.getBundledAppAbis( parsedPackage); abis.applyTo(parsedPackage); abis.applyTo(pkgSetting); final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isSystemApp, isUpdatedSystemApp, appLib32InstallDir); packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isSystemApp, isUpdatedSystemApp, appLib32InstallDir); nativeLibraryPaths.applyTo(parsedPackage); } } else { Loading @@ -334,9 +341,10 @@ final class ScanPackageUtils { } } else { if ((scanFlags & SCAN_MOVE) != 0) { // 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. // 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.getPrimaryCpuAbiLegacy()) .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbiLegacy()); } Loading @@ -359,6 +367,7 @@ final class ScanPackageUtils { parsedPackage.setPrimaryCpuAbi(VMRuntime.getRuntime().is64Bit() ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0]); } } // If there's a mismatch between the abi-override in the package setting // and the abiOverride specified for the install. Warn about this because we Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/ScanTests.java +41 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.SharedLibraryInfo.TYPE_SDK_PACKAGE; import static android.content.pm.SharedLibraryInfo.TYPE_STATIC; import static android.content.pm.SharedLibraryInfo.VERSION_UNDEFINED; import static com.android.server.pm.PackageManagerService.SCAN_AS_APEX; import static com.android.server.pm.PackageManagerService.SCAN_AS_FULL_APP; import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; Loading Loading @@ -364,6 +365,46 @@ public class ScanTests { assertThat(scanResult.mPkgSetting.getVolumeUuid(), is(UUID_TWO.toString())); } @Test public void scanFirstBoot_apexDontDeriveAbis() throws Exception { final PackageSetting pkgSetting = createBasicPackageSettingBuilder(DUMMY_PACKAGE_NAME) .setPkgFlags(ApplicationInfo.FLAG_SYSTEM).build(); final String codePath = "/data/apex/" + DUMMY_PACKAGE_NAME + ".apex"; // Create the ParsedPackage for the apex final ParsedPackage basicPackage = ((ParsedPackage) new PackageImpl(DUMMY_PACKAGE_NAME, codePath, codePath, mock(TypedArray.class), false) .setVolumeUuid(UUID_ONE.toString()) .hideAsParsed()) .setVersionCodeMajor(1) .setVersionCode(2345) .setSystem(true); when(mMockInjector.getAbiHelper()).thenReturn(new PackageAbiHelperImpl()); // prepare the scan request with the scanflag (SCAN_FIRST_BOOT_OR_UPGRADE | SCAN_AS_APEX) final ScanResult scanResult = executeScan(new ScanRequestBuilder(basicPackage) .setPkgSetting(pkgSetting) .addScanFlag(SCAN_FIRST_BOOT_OR_UPGRADE | SCAN_AS_APEX) .build()); final PackageSetting resultSetting = scanResult.mPkgSetting; final ApplicationInfo applicationInfo = PackageInfoUtils.generateApplicationInfo( resultSetting.getPkg(), 0, pkgSetting.getUserStateOrDefault(0), 0, resultSetting); assertThat(applicationInfo.primaryCpuAbi, nullValue()); assertThat(applicationInfo.primaryCpuAbi, nullValue()); assertThat(applicationInfo.secondaryCpuAbi, nullValue()); assertThat(applicationInfo.nativeLibraryRootDir, nullValue()); assertThat(pkgSetting.getLegacyNativeLibraryPath(), nullValue()); assertThat(applicationInfo.nativeLibraryRootRequiresIsa, is(false)); assertThat(applicationInfo.nativeLibraryDir, nullValue()); assertThat(applicationInfo.secondaryNativeLibraryDir, nullValue()); } @Test public void scanFirstBoot_derivesAbis() throws Exception { final PackageSetting pkgSetting = Loading Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +27 −22 Original line number Diff line number Diff line Loading @@ -1509,7 +1509,9 @@ final class InstallPackageHelper { } else { // Enable SCAN_NO_DEX flag to skip dexopt at a later stage scanFlags |= SCAN_NO_DEX; // The native libs of Apex is located in apex_payload.img, don't need to parse it from // the original apex file if (!isApex) { try { PackageSetting pkgSetting; synchronized (mPm.mLock) { Loading @@ -1520,11 +1522,13 @@ final class InstallPackageHelper { final String abiOverride = deriveAbiOverride(request.getAbiOverride()); // TODO: Are these system flags actually set properly at this stage? boolean isUpdatedSystemAppInferred = pkgSetting != null && pkgSetting.isSystem(); boolean isUpdatedSystemAppInferred = pkgSetting != null && pkgSetting.isSystem(); final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage, systemApp, isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred, abiOverride, ScanPackageUtils.getAppLib32InstallDir()); derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage, systemApp, (isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred), abiOverride, ScanPackageUtils.getAppLib32InstallDir()); derivedAbi.first.applyTo(parsedPackage); derivedAbi.second.applyTo(parsedPackage); } catch (PackageManagerException pme) { Loading @@ -1534,6 +1538,7 @@ final class InstallPackageHelper { PackageManagerException.INTERNAL_ERROR_DERIVING_ABI); } } } if (!isApex) { doRenameLI(request, parsedPackage); Loading
services/core/java/com/android/server/pm/ScanPackageUtils.java +72 −63 Original line number Diff line number Diff line Loading @@ -149,6 +149,8 @@ final class ScanPackageUtils { String primaryCpuAbiFromSettings = null; String secondaryCpuAbiFromSettings = null; boolean needToDeriveAbi = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; boolean isApex = (scanFlags & SCAN_AS_APEX) != 0; if (!needToDeriveAbi) { if (pkgSetting != null) { // TODO(b/154610922): if it is not first boot or upgrade, we should directly use Loading Loading @@ -240,6 +242,7 @@ final class ScanPackageUtils { usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(), newDomainSetId); } if (createNewPackage && originalPkgSetting != null) { // This is the initial transition from the original package, so, // fix up the new package's name now. We must do this after looking Loading Loading @@ -279,6 +282,9 @@ final class ScanPackageUtils { final boolean isUpdatedSystemApp = pkgSetting.isUpdatedSystemApp(); final File appLib32InstallDir = getAppLib32InstallDir(); // The native libs of Apex is located in apex_payload.img, don't need to parse it from // the original apex file if (!isApex) { if ((scanFlags & SCAN_NEW_INSTALL) == 0) { if (needToDeriveAbi) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi"); Loading @@ -301,15 +307,16 @@ final class ScanPackageUtils { // in which case we might end up not detecting abi solely based on apk // structure. Try to detect abi based on directory structure. String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage); String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi( parsedPackage); if (isSystemApp && !isUpdatedSystemApp && pkgRawPrimaryCpuAbi == null) { final PackageAbiHelper.Abis abis = packageAbiHelper.getBundledAppAbis( parsedPackage); abis.applyTo(parsedPackage); abis.applyTo(pkgSetting); final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isSystemApp, isUpdatedSystemApp, appLib32InstallDir); packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isSystemApp, isUpdatedSystemApp, appLib32InstallDir); nativeLibraryPaths.applyTo(parsedPackage); } } else { Loading @@ -334,9 +341,10 @@ final class ScanPackageUtils { } } else { if ((scanFlags & SCAN_MOVE) != 0) { // 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. // 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.getPrimaryCpuAbiLegacy()) .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbiLegacy()); } Loading @@ -359,6 +367,7 @@ final class ScanPackageUtils { parsedPackage.setPrimaryCpuAbi(VMRuntime.getRuntime().is64Bit() ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0]); } } // If there's a mismatch between the abi-override in the package setting // and the abiOverride specified for the install. Warn about this because we Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/ScanTests.java +41 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.SharedLibraryInfo.TYPE_SDK_PACKAGE; import static android.content.pm.SharedLibraryInfo.TYPE_STATIC; import static android.content.pm.SharedLibraryInfo.VERSION_UNDEFINED; import static com.android.server.pm.PackageManagerService.SCAN_AS_APEX; import static com.android.server.pm.PackageManagerService.SCAN_AS_FULL_APP; import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; Loading Loading @@ -364,6 +365,46 @@ public class ScanTests { assertThat(scanResult.mPkgSetting.getVolumeUuid(), is(UUID_TWO.toString())); } @Test public void scanFirstBoot_apexDontDeriveAbis() throws Exception { final PackageSetting pkgSetting = createBasicPackageSettingBuilder(DUMMY_PACKAGE_NAME) .setPkgFlags(ApplicationInfo.FLAG_SYSTEM).build(); final String codePath = "/data/apex/" + DUMMY_PACKAGE_NAME + ".apex"; // Create the ParsedPackage for the apex final ParsedPackage basicPackage = ((ParsedPackage) new PackageImpl(DUMMY_PACKAGE_NAME, codePath, codePath, mock(TypedArray.class), false) .setVolumeUuid(UUID_ONE.toString()) .hideAsParsed()) .setVersionCodeMajor(1) .setVersionCode(2345) .setSystem(true); when(mMockInjector.getAbiHelper()).thenReturn(new PackageAbiHelperImpl()); // prepare the scan request with the scanflag (SCAN_FIRST_BOOT_OR_UPGRADE | SCAN_AS_APEX) final ScanResult scanResult = executeScan(new ScanRequestBuilder(basicPackage) .setPkgSetting(pkgSetting) .addScanFlag(SCAN_FIRST_BOOT_OR_UPGRADE | SCAN_AS_APEX) .build()); final PackageSetting resultSetting = scanResult.mPkgSetting; final ApplicationInfo applicationInfo = PackageInfoUtils.generateApplicationInfo( resultSetting.getPkg(), 0, pkgSetting.getUserStateOrDefault(0), 0, resultSetting); assertThat(applicationInfo.primaryCpuAbi, nullValue()); assertThat(applicationInfo.primaryCpuAbi, nullValue()); assertThat(applicationInfo.secondaryCpuAbi, nullValue()); assertThat(applicationInfo.nativeLibraryRootDir, nullValue()); assertThat(pkgSetting.getLegacyNativeLibraryPath(), nullValue()); assertThat(applicationInfo.nativeLibraryRootRequiresIsa, is(false)); assertThat(applicationInfo.nativeLibraryDir, nullValue()); assertThat(applicationInfo.secondaryNativeLibraryDir, nullValue()); } @Test public void scanFirstBoot_derivesAbis() throws Exception { final PackageSetting pkgSetting = Loading