diff options
| author | Ricky Wai <rickywai@google.com> | 2019-12-18 13:07:02 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-12-18 13:07:02 +0000 |
| commit | 32e4875f6b9a23f95d1ef38f9fd7c3efe575883b (patch) | |
| tree | 44048928a2df7f019af3ec5448cc5b2ed056cc1c /core/java/android | |
| parent | f95cac8b0a0ac81a1c306cc1be1e717f7258c2d8 (diff) | |
| parent | 4482ab53d17140dfeb756ff595b66fb641f1addf (diff) | |
Merge changes from topic "mount_isolate_apps_data"
* changes:
App data directory isolation
Pass app visible packages data directory info to zygote
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/os/Process.java | 15 | ||||
| -rw-r--r-- | core/java/android/os/ZygoteProcess.java | 35 |
2 files changed, 46 insertions, 4 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index ebb2071ead7e..6ae188a8fc3d 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -22,10 +22,13 @@ import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.system.Os; import android.system.OsConstants; +import android.util.Pair; import android.webkit.WebViewZygote; import dalvik.system.VMRuntime; +import java.util.Map; + /** * Tools for managing OS processes. */ @@ -521,6 +524,8 @@ public class Process { * @param isTopApp whether the process starts for high priority application. * @param disabledCompatChanges null-ok list of disabled compat changes for the process being * started. + * @param pkgDataInfoMap Map from related package names to private data directory + * volume UUID and inode number. * @param zygoteArgs Additional arguments to supply to the zygote process. * @return An object that describes the result of the attempt to start the process. * @throws RuntimeException on fatal start failure @@ -541,11 +546,14 @@ public class Process { @Nullable String packageName, boolean isTopApp, @Nullable long[] disabledCompatChanges, + @Nullable Map<String, Pair<String, Long>> + pkgDataInfoMap, @Nullable String[] zygoteArgs) { return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ true, isTopApp, disabledCompatChanges, zygoteArgs); + /*useUsapPool=*/ true, isTopApp, disabledCompatChanges, + pkgDataInfoMap, zygoteArgs); } /** @hide */ @@ -563,10 +571,13 @@ public class Process { @Nullable String packageName, @Nullable long[] disabledCompatChanges, @Nullable String[] zygoteArgs) { + // Webview zygote can't access app private data files, so doesn't need to know its data + // info. return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ false, /*isTopApp=*/ false, disabledCompatChanges, zygoteArgs); + /*useUsapPool=*/ false, /*isTopApp=*/ false, disabledCompatChanges, + /* pkgDataInfoMap */ null, zygoteArgs); } /** diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index d17a5e026880..d32bd26c2bb2 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -23,6 +23,7 @@ import android.content.pm.ApplicationInfo; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.util.Log; +import android.util.Pair; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -39,6 +40,7 @@ import java.util.Arrays; import java.util.Base64; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.UUID; /*package*/ class ZygoteStartFailedEx extends Exception { @@ -310,6 +312,8 @@ public class ZygoteProcess { * started. * @param zygoteArgs Additional arguments to supply to the zygote process. * @param isTopApp Whether the process starts for high priority application. + * @param pkgDataInfoMap Map from related package names to private data directory + * volume UUID and inode number. * * @return An object that describes the result of the attempt to start the process. * @throws RuntimeException on fatal start failure @@ -328,6 +332,8 @@ public class ZygoteProcess { boolean useUsapPool, boolean isTopApp, @Nullable long[] disabledCompatChanges, + @Nullable Map<String, Pair<String, Long>> + pkgDataInfoMap, @Nullable String[] zygoteArgs) { // TODO (chriswailes): Is there a better place to check this value? if (fetchUsapPoolEnabledPropWithMinInterval()) { @@ -338,7 +344,8 @@ public class ZygoteProcess { return startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false, - packageName, useUsapPool, isTopApp, disabledCompatChanges, zygoteArgs); + packageName, useUsapPool, isTopApp, disabledCompatChanges, + pkgDataInfoMap, zygoteArgs); } catch (ZygoteStartFailedEx ex) { Log.e(LOG_TAG, "Starting VM process through Zygote failed"); @@ -539,6 +546,8 @@ public class ZygoteProcess { * @param packageName null-ok the name of the package this process belongs to. * @param isTopApp Whether the process starts for high priority application. * @param disabledCompatChanges a list of disabled compat changes for the process being started. + * @param pkgDataInfoMap Map from related package names to private data directory volume UUID + * and inode number. * @param extraArgs Additional arguments to supply to the zygote process. * @return An object that describes the result of the attempt to start the process. * @throws ZygoteStartFailedEx if process start failed for any reason @@ -559,6 +568,8 @@ public class ZygoteProcess { boolean useUsapPool, boolean isTopApp, @Nullable long[] disabledCompatChanges, + @Nullable Map<String, Pair<String, Long>> + pkgDataInfoMap, @Nullable String[] extraArgs) throws ZygoteStartFailedEx { ArrayList<String> argsForZygote = new ArrayList<>(); @@ -635,6 +646,24 @@ public class ZygoteProcess { if (isTopApp) { argsForZygote.add(Zygote.START_AS_TOP_APP_ARG); } + if (pkgDataInfoMap != null && pkgDataInfoMap.size() > 0) { + StringBuilder sb = new StringBuilder(); + sb.append(Zygote.PKG_DATA_INFO_MAP); + sb.append("="); + boolean started = false; + for (Map.Entry<String, Pair<String, Long>> entry : pkgDataInfoMap.entrySet()) { + if (started) { + sb.append(','); + } + started = true; + sb.append(entry.getKey()); + sb.append(','); + sb.append(entry.getValue().first); + sb.append(','); + sb.append(entry.getValue().second); + } + argsForZygote.add(sb.toString()); + } if (disabledCompatChanges != null && disabledCompatChanges.length > 0) { StringBuilder sb = new StringBuilder(); @@ -1182,12 +1211,14 @@ public class ZygoteProcess { Process.ProcessStartResult result; try { + // As app zygote is for generating isolated process, at the end it can't access + // apps data, so doesn't need to its data info. result = startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo, abi, instructionSet, null /* appDataDir */, null /* invokeWith */, true /* startChildZygote */, null /* packageName */, false /* useUsapPool */, false /* isTopApp */, - null /* disabledCompatChanges */, extraArgs); + null /* disabledCompatChanges */, null /* pkgDataInfoMap */, extraArgs); } catch (ZygoteStartFailedEx ex) { throw new RuntimeException("Starting child-zygote through Zygote failed", ex); } |
