summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Calin Juravle <calin@google.com> 2018-05-09 17:37:42 -0700
committer android-build-merger <android-build-merger@google.com> 2018-05-09 17:37:42 -0700
commit35fe028c9300cf7d183165d98176c05f594e631c (patch)
tree8c19769f4612ed52006ad6d24c5dc5f88aca59b9
parenta50afa5ebfb60506b31f42fc4e04604845016343 (diff)
parent15b95580188b9d36b7f2b6891290c6100eb938ce (diff)
Merge "Properly prepare system server profiles"
am: 15b9558018 Change-Id: I83070dd881f164e8d458925274b2fb41851b1ae5
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java40
1 files changed, 33 insertions, 7 deletions
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 1df2dca4ac6b..d1d062865b38 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -35,6 +35,7 @@ import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
+import android.os.UserHandle;
import android.os.ZygoteProcess;
import android.os.storage.StorageManager;
import android.security.keystore.AndroidKeyStoreProvider;
@@ -466,13 +467,7 @@ public class ZygoteInit {
"dalvik.vm.profilesystemserver", false);
if (profileSystemServer && (Build.IS_USERDEBUG || Build.IS_ENG)) {
try {
- File profileDir = Environment.getDataProfilesDePackageDirectory(
- Process.SYSTEM_UID, "system_server");
- File profile = new File(profileDir, "primary.prof");
- profile.getParentFile().mkdirs();
- profile.createNewFile();
- String[] codePaths = systemServerClasspath.split(":");
- VMRuntime.registerAppInfo(profile.getPath(), codePaths);
+ prepareSystemServerProfile(systemServerClasspath);
} catch (Exception e) {
Log.wtf(TAG, "Failed to set up system server profile", e);
}
@@ -514,6 +509,37 @@ public class ZygoteInit {
/* should never reach here */
}
+ /**
+ * Note that preparing the profiles for system server does not require special
+ * selinux permissions. From the installer perspective the system server is a regular package
+ * which can capture profile information.
+ */
+ private static void prepareSystemServerProfile(String systemServerClasspath)
+ throws RemoteException {
+ if (systemServerClasspath.isEmpty()) {
+ return;
+ }
+ String[] codePaths = systemServerClasspath.split(":");
+
+ final IInstalld installd = IInstalld.Stub
+ .asInterface(ServiceManager.getService("installd"));
+
+ String systemServerPackageName = "android";
+ String systemServerProfileName = "primary.prof";
+ installd.prepareAppProfile(
+ systemServerPackageName,
+ UserHandle.USER_SYSTEM,
+ UserHandle.getAppId(Process.SYSTEM_UID),
+ systemServerProfileName,
+ codePaths[0],
+ /*dexMetadata*/ null);
+
+ File profileDir = Environment.getDataProfilesDePackageDirectory(
+ UserHandle.USER_SYSTEM, systemServerPackageName);
+ String profilePath = new File(profileDir, systemServerProfileName).getAbsolutePath();
+ VMRuntime.registerAppInfo(profilePath, codePaths);
+ }
+
public static void setApiBlacklistExemptions(String[] exemptions) {
VMRuntime.getRuntime().setHiddenApiExemptions(exemptions);
}