summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jiakai Zhang <jiakaiz@google.com> 2022-05-11 14:21:17 +0000
committer Jiakai Zhang <jiakaiz@google.com> 2022-05-11 16:37:15 +0100
commitae3f78a394a66cfd3af8531239938784aa9fb562 (patch)
tree4df376e44f4044dfe4b6b6af04663d43a2d0a0fd
parent9804076394ba1dc0348150a772c59e13c2643316 (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.java67
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();