Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d145a6e authored by Pawan Wagh's avatar Pawan Wagh Committed by Android (Google) Code Review
Browse files

Merge changes I1ad345f7,Ieec96f2e,I45fe240f into main

* changes:
  Install debuggable app via session
  Pass down the installSource to initial scan request
  [PM] Fix deadlock between PMS and SettingsProvider
parents be737613 2bc1ea1c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@

    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
        <option name="cleanup" value="true" />
        <option name="push" value="app_with_4kb_elf_no_override.apk->/data/local/tmp/pagesizewarnings/app_with_4kb_elf_no_override.apk" />
        <option name="push" value="app_with_4kb_elf_no_override_debuggable.apk->/data/local/tmp/pagesizewarnings/app_with_4kb_elf_no_override_debuggable.apk" />
    </target_preparer>

    <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
+1 −1
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ public class AppWarningsHostTest extends BaseHostJUnit4Test {

    @Test
    @AppModeFull
    public void testWarnings_installedBySession()
    public void testNoWarnings_installedBySession()
            throws FileNotFoundException, DeviceNotAvailableException, TargetSetupError {
        String appPackage = "android.content.pm.tests";
        String testName = "AppWarningsTest";
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ import java.util.concurrent.TimeUnit;
public class AppWarningsTest {

    private static final String TEST_APK_PATH =
            "/data/local/tmp/pagesizewarnings/app_with_4kb_elf_no_override.apk";
            "/data/local/tmp/pagesizewarnings/app_with_4kb_elf_no_override_debuggable.apk";
    private static final String PACKAGE_INSTALLED_ACTION =
            "com.example.android.testing.PACKAGE_INSTALLED";
    private static final String WARNING_TEXT = "Android App Compatibility";
+27 −16
Original line number Diff line number Diff line
@@ -1297,7 +1297,7 @@ final class InstallPackageHelper {
                final ScanResult scanResult = scanPackageTraced(request.getParsedPackage(),
                        request.getParseFlags(), request.getScanFlags(),
                        System.currentTimeMillis(), request.getUser(),
                        request.getAbiOverride());
                        request.getAbiOverride(), request.getInstallSource());
                request.setScanResult(scanResult);
                request.onScanFinished();
                if (!scannedPackages.add(packageName)) {
@@ -4215,13 +4215,14 @@ final class InstallPackageHelper {
    }

    private ScanResult scanPackageTraced(ParsedPackage parsedPackage,
            final @ParsingPackageUtils.ParseFlags int parseFlags,
            @PackageManagerService.ScanFlags int scanFlags, long currentTime,
            @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException {
            @ParsingPackageUtils.ParseFlags int parseFlags,
            @PackageManagerService.ScanFlags int scanFlags, long scanTime, UserHandle user,
            @Nullable String cpuAbiOverride, @Nullable InstallSource installSource)
            throws PackageManagerException {
        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage");
        try {
            return scanPackageNew(parsedPackage, parseFlags, scanFlags, currentTime, user,
                    cpuAbiOverride);
            return scanPackageNew(parsedPackage, parseFlags, scanFlags, scanTime, user,
                    cpuAbiOverride, installSource);
        } finally {
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
        }
@@ -4230,7 +4231,7 @@ final class InstallPackageHelper {
    private ScanRequest prepareInitialScanRequest(@NonNull ParsedPackage parsedPackage,
            @ParsingPackageUtils.ParseFlags int parseFlags,
            @PackageManagerService.ScanFlags int scanFlags,
            @Nullable UserHandle user, String cpuAbiOverride)
            @Nullable UserHandle user, String cpuAbiOverride, @Nullable InstallSource installSource)
            throws PackageManagerException {
        final AndroidPackage platformPackage;
        final String realPkgName;
@@ -4240,9 +4241,9 @@ final class InstallPackageHelper {
        final SharedUserSetting sharedUserSetting;
        SharedUserSetting oldSharedUserSetting = null;

        final boolean isSystemApp = AndroidPackageLegacyUtils.isSystem(parsedPackage);
        synchronized (mPm.mLock) {
            platformPackage = mPm.getPlatformPackage();
            var isSystemApp = AndroidPackageLegacyUtils.isSystem(parsedPackage);
            final String renamedPkgName = mPm.mSettings.getRenamedPackageLPr(
                    AndroidPackageUtils.getRealPackageOrNull(parsedPackage, isSystemApp));
            realPkgName = ScanPackageUtils.getRealPackageName(parsedPackage, renamedPkgName,
@@ -4287,23 +4288,30 @@ final class InstallPackageHelper {

        final boolean isPlatformPackage = platformPackage != null
                && platformPackage.getPackageName().equals(parsedPackage.getPackageName());

        final  String initiatingPackage = installSource != null
                ? installSource.mInitiatingPackageName : null;
        // Run 16 KB alignment checks on 4 KB device if evaluated as true for new installations.
        // To prevent deadlock, move the call of SettingsProvider out of mLock block
        final boolean enableAlignmentChecks = ScanPackageUtils.enableAlignmentChecks(
                parsedPackage, mPm.mInjector.getContext(), initiatingPackage,
                isSystemApp, isPlatformPackage, scanFlags);
        return new ScanRequest(parsedPackage, oldSharedUserSetting,
                installedPkgSetting == null ? null : installedPkgSetting.getPkg() /* oldPkg */,
                installedPkgSetting /* packageSetting */,
                sharedUserSetting,
                disabledPkgSetting /* disabledPackageSetting */,
                originalPkgSetting  /* originalPkgSetting */,
                realPkgName, parseFlags, scanFlags, isPlatformPackage, user, cpuAbiOverride);
                realPkgName, parseFlags, scanFlags, isPlatformPackage, user, cpuAbiOverride,
                enableAlignmentChecks);
    }

    private ScanResult scanPackageNew(@NonNull ParsedPackage parsedPackage,
            final @ParsingPackageUtils.ParseFlags int parseFlags,
            @PackageManagerService.ScanFlags int scanFlags, long currentTime,
            @Nullable UserHandle user, String cpuAbiOverride)
            @Nullable UserHandle user, String cpuAbiOverride, @Nullable InstallSource installSource)
            throws PackageManagerException {
        final ScanRequest initialScanRequest = prepareInitialScanRequest(parsedPackage, parseFlags,
                scanFlags, user, cpuAbiOverride);
                scanFlags, user, cpuAbiOverride, installSource);
        final PackageSetting installedPkgSetting = initialScanRequest.mPkgSetting;
        final PackageSetting disabledPkgSetting = initialScanRequest.mDisabledPkgSetting;

@@ -4327,7 +4335,7 @@ final class InstallPackageHelper {
                    initialScanRequest.mSharedUserSetting, disabledPkgSetting,
                    initialScanRequest.mOriginalPkgSetting, initialScanRequest.mRealPkgName,
                    parseFlags, scanFlags, initialScanRequest.mIsPlatformPackage, user,
                    cpuAbiOverride);
                    cpuAbiOverride, initialScanRequest.mEnableAlignmentChecks);
            return ScanPackageUtils.scanPackageOnly(request, mPm.mInjector, mPm.mFactoryTest,
                    currentTime);
        }
@@ -4343,7 +4351,7 @@ final class InstallPackageHelper {
            final boolean scanSystemPartition =
                (parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0;
            final ScanRequest initialScanRequest = prepareInitialScanRequest(parsedPackage,
                    parseFlags, scanFlags, user, null);
                    parseFlags, scanFlags, user, null /*cpuAbiOverride*/, null /*installSource*/);
            final PackageSetting installedPkgSetting = initialScanRequest.mPkgSetting;
            final PackageSetting originalPkgSetting = initialScanRequest.mOriginalPkgSetting;
            final PackageSetting pkgSetting =
@@ -4354,6 +4362,7 @@ final class InstallPackageHelper {
            final boolean isSystemPkgUpdated;
            final PackageSetting disabledPkgSetting;
            final boolean isUpgrade;

            synchronized (mPm.mLock) {
                isUpgrade = mPm.isDeviceUpgrading();
                if (scanSystemPartition && !pkgAlreadyExists
@@ -4381,7 +4390,8 @@ final class InstallPackageHelper {
                            initialScanRequest.mSharedUserSetting,
                            null /* disabledPkgSetting */, null /* originalPkgSetting */,
                            null, parseFlags, scanFlags,
                            initialScanRequest.mIsPlatformPackage, user, null);
                            initialScanRequest.mIsPlatformPackage, user, null,
                            initialScanRequest.mEnableAlignmentChecks);
                    ScanPackageUtils.applyPolicy(parsedPackage, scanFlags,
                            mPm.getPlatformPackage(), true);
                    final ScanResult scanResult =
@@ -4583,7 +4593,8 @@ final class InstallPackageHelper {

            final long firstInstallTime = System.currentTimeMillis();
            final ScanResult scanResult = scanPackageNew(parsedPackage, parseFlags,
                    scanFlags | SCAN_UPDATE_SIGNATURE, firstInstallTime, user, null);
                    scanFlags | SCAN_UPDATE_SIGNATURE, firstInstallTime, user,
                    null /*cpuAbiOverride*/, null /*installSource*/);
            // Set scan outcome as successful for InitAppScanMetrics.
            metrics.setInitAppScanOutcome(PackageManager.INSTALL_SUCCEEDED);
            return new Pair<>(scanResult, shouldHideSystemApp);
+24 −21
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM;
import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR;
import static com.android.server.pm.PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD;
import static com.android.server.pm.PackageManagerService.SCAN_BOOTING;
import static com.android.server.pm.PackageManagerService.SCAN_DONT_KILL_APP;
import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE;
import static com.android.server.pm.PackageManagerService.SCAN_MOVE;
@@ -425,25 +424,13 @@ final class ScanPackageUtils {

        boolean is16KbDevice = Os.sysconf(OsConstants._SC_PAGESIZE) == PAGE_SIZE_16KB;

        // Run 16 KB alignment checks on 4 KB device if evaluated as true for new installations.
        boolean enable4kbChecks =  false;
        if ((Build.SUPPORTED_64_BIT_ABIS.length > 0)
                && !isSystemApp
                && !isApex
                && !isPlatformPackage
                && (scanFlags & SCAN_NEW_INSTALL) != 0
        ) {
            enable4kbChecks = enableAlignmentChecks(parsedPackage, injector.getContext(),
                pkgSetting.getInstallSource().mInitiatingPackageName);
        }

        // If package is upgrading, mPageSizeCompatFlags in PackageSetting should be populated
        // according to the upgraded package.
        if (!createNewPackage) {
            pkgSetting.clearPageSizeAppCompatFlags();
        }

        if (Flags.appCompatOption16kb() && (is16KbDevice || enable4kbChecks)) {
        if (Flags.appCompatOption16kb() && (is16KbDevice || request.mEnableAlignmentChecks)) {
            // Alignment checks are used decide whether this app should run in compat mode when
            // nothing was specified in manifest. Manifest should always take precedence over
            // something decided by platform.
@@ -1107,13 +1094,24 @@ final class ScanPackageUtils {
        }
    }

    private static boolean enableAlignmentChecks(@NonNull ParsedPackage parsedPackage,
            Context context, String initiatingPackage) {
    static boolean enableAlignmentChecks(@NonNull ParsedPackage parsedPackage,
            Context context, String initiatingPackage, boolean isSystemApp,
            boolean isPlatformPackage, int scanFlags) {
        // Run alignment checks when feature flag is enabled
        if (!Flags.appCompatWarnings16kb()) {
            return false;
        }

        final boolean isApex = (scanFlags & SCAN_AS_APEX) != 0;
        final boolean isNewInstall = (scanFlags & SCAN_NEW_INSTALL) != 0;
        if ((Build.SUPPORTED_64_BIT_ABIS.length == 0)
                || isSystemApp
                || isApex
                || isPlatformPackage
                || !isNewInstall) {
            return false;
        }

        if (context == null) {
            Slog.w(TAG, "Provided context is null!");
            return false;
@@ -1125,12 +1123,17 @@ final class ScanPackageUtils {
            return false;
        }

        boolean isDebuggable = parsedPackage.isDebuggable();
        boolean isDeveloperMode = android.provider.Settings.Global.getInt(resolver,
                android.provider.Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
        final boolean isDebuggable = parsedPackage.isDebuggable();
        if (!isDebuggable) {
            return false;
        }
        boolean isInstalledByAdb = PackageManagerServiceUtils.isInstalledByAdb(initiatingPackage);

        return isDebuggable && isDeveloperMode && isInstalledByAdb;
        if (!isInstalledByAdb) {
            return false;
        }
        final boolean isDeveloperMode = android.provider.Settings.Global.getInt(resolver,
                android.provider.Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
        return isDeveloperMode;
    }

    /** Directory where installed application's 32-bit native libraries are copied. */
Loading