diff options
| author | 2018-05-09 17:37:42 -0700 | |
|---|---|---|
| committer | 2018-05-09 17:37:42 -0700 | |
| commit | 35fe028c9300cf7d183165d98176c05f594e631c (patch) | |
| tree | 8c19769f4612ed52006ad6d24c5dc5f88aca59b9 | |
| parent | a50afa5ebfb60506b31f42fc4e04604845016343 (diff) | |
| parent | 15b95580188b9d36b7f2b6891290c6100eb938ce (diff) | |
Merge "Properly prepare system server profiles"
am: 15b9558018
Change-Id: I83070dd881f164e8d458925274b2fb41851b1ae5
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 40 |
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); } |