diff options
| author | 2022-05-11 14:21:17 +0000 | |
|---|---|---|
| committer | 2022-05-11 16:37:15 +0100 | |
| commit | ae3f78a394a66cfd3af8531239938784aa9fb562 (patch) | |
| tree | 4df376e44f4044dfe4b6b6af04663d43a2d0a0fd | |
| parent | 9804076394ba1dc0348150a772c59e13c2643316 (diff) | |
Revert^2 "Check and `speed` compile System UI on boot."
This reverts commit 6897ab2ff96281fc97c860455164054be6a418e6.
Reason for revert: Protected the change with a system property.
We don't need an sepolicy change because we already have a rule for all
system properties under the `dalvik.vm.` namespace.
Bug: 227310505
Test: -
1. Set `dalvik.vm.systemuicompilerfilter=speed` in the makefile of a
particular product.
2. Build a system image and flash to a device.
3. Install an APEX.
4. Reboot.
5. See dex2oat invocation for `SystemUIGoogle.apk` with
`--compiler-filter=speed`.
Change-Id: I7e612137a3d7678bd405a892ade959c1a96d462e
| -rw-r--r-- | services/core/java/com/android/server/pm/DexOptHelper.java | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index 8c33dd935822..29b122d56ac5 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -26,10 +26,13 @@ import static com.android.server.pm.PackageManagerService.REASON_CMDLINE; import static com.android.server.pm.PackageManagerService.REASON_FIRST_BOOT; import static com.android.server.pm.PackageManagerService.STUB_SUFFIX; import static com.android.server.pm.PackageManagerService.TAG; +import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason; import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefaultCompilerFilter; import static com.android.server.pm.PackageManagerServiceUtils.REMOVE_IF_NULL_PKG; +import android.Manifest; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.AppGlobals; import android.content.Intent; @@ -42,6 +45,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.Log; import android.util.Slog; @@ -55,6 +59,8 @@ import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.pkg.PackageStateInternal; +import dalvik.system.DexFile; + import java.io.File; import java.util.ArrayList; import java.util.Collection; @@ -250,10 +256,71 @@ final class DexOptHelper { numberOfPackagesFailed}; } + /** + * Checks if system UI package (typically "com.android.systemui") needs to be re-compiled, and + * compiles it if needed. + */ + private void checkAndDexOptSystemUi() { + Computer snapshot = mPm.snapshotComputer(); + String sysUiPackageName = + mPm.mContext.getString(com.android.internal.R.string.config_systemUi); + AndroidPackage pkg = snapshot.getPackage(sysUiPackageName); + if (pkg == null) { + Log.w(TAG, "System UI package " + sysUiPackageName + " is not found for dexopting"); + return; + } + + // It could also be after mainline update, but we're not introducing a new reason just for + // this special case. + int reason = REASON_BOOT_AFTER_OTA; + + String defaultCompilerFilter = getCompilerFilterForReason(reason); + String targetCompilerFilter = + SystemProperties.get("dalvik.vm.systemuicompilerfilter", defaultCompilerFilter); + String compilerFilter; + + if (DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter)) { + compilerFilter = defaultCompilerFilter; + File profileFile = new File(getPrebuildProfilePath(pkg)); + + // Copy the profile to the reference profile path if it exists. Installd can only use a + // profile at the reference profile path for dexopt. + if (profileFile.exists()) { + try { + synchronized (mPm.mInstallLock) { + if (mPm.mInstaller.copySystemProfile(profileFile.getAbsolutePath(), + pkg.getUid(), pkg.getPackageName(), + ArtManager.getProfileName(null))) { + compilerFilter = targetCompilerFilter; + } else { + Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath()); + } + } + } catch (Exception e) { + Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath(), e); + } + } + } else { + compilerFilter = targetCompilerFilter; + } + + performDexOptTraced(new DexoptOptions(pkg.getPackageName(), REASON_BOOT_AFTER_OTA, + compilerFilter, null /* splitName */, 0 /* dexoptFlags */)); + } + + @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) public void performPackageDexOptUpgradeIfNeeded() { PackageManagerServiceUtils.enforceSystemOrRoot( "Only the system can request package update"); + // The default is "true". + if (!"false".equals(DeviceConfig.getProperty("runtime", "dexopt_system_ui_on_boot"))) { + // System UI is important to user experience, so we check it on every boot. It may need + // to be re-compiled after a mainline update or an OTA. + // TODO(b/227310505): Only do this after a mainline update or an OTA. + checkAndDexOptSystemUi(); + } + // We need to re-extract after an OTA. boolean causeUpgrade = mPm.isDeviceUpgrading(); |