diff options
| author | Anna Trostanetski <atrost@google.com> | 2019-12-12 11:35:51 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-12-12 11:35:51 +0000 |
| commit | 0f15f727f85bd2e8136286d7a66bc6cde84ef699 (patch) | |
| tree | 7bbfe942cbf9f39f8e6755de5382309e314ab70b /core/java | |
| parent | ab43bef713df26b7cf7d05fc6997b1f7be9b9085 (diff) | |
| parent | 5ae996f892dc536c8b56a9cbe6673aba1abd72f4 (diff) | |
Merge "Pipe disabled compat changes to runtime through zygote."
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/os/Process.java | 11 | ||||
| -rw-r--r-- | core/java/android/os/ZygoteProcess.java | 29 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/RuntimeInit.java | 5 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/WrapperInit.java | 12 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/Zygote.java | 1 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteArguments.java | 16 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteConnection.java | 1 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 14 |
8 files changed, 69 insertions, 20 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 6408f6170fce..ebb2071ead7e 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -519,11 +519,12 @@ public class Process { * @param invokeWith null-ok the command to invoke with. * @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 null-ok list of disabled compat changes for the process being + * started. * @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 - * + * * {@hide} */ public static ProcessStartResult start(@NonNull final String processClass, @@ -539,11 +540,12 @@ public class Process { @Nullable String invokeWith, @Nullable String packageName, boolean isTopApp, + @Nullable long[] disabledCompatChanges, @Nullable String[] zygoteArgs) { return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ true, isTopApp, zygoteArgs); + /*useUsapPool=*/ true, isTopApp, disabledCompatChanges, zygoteArgs); } /** @hide */ @@ -559,11 +561,12 @@ public class Process { @Nullable String appDataDir, @Nullable String invokeWith, @Nullable String packageName, + @Nullable long[] disabledCompatChanges, @Nullable String[] zygoteArgs) { return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ false, /*isTopApp=*/ false, zygoteArgs); + /*useUsapPool=*/ false, /*isTopApp=*/ false, disabledCompatChanges, zygoteArgs); } /** diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index 907eae87bcb2..d17a5e026880 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -306,6 +306,8 @@ public class ZygoteProcess { * @param appDataDir null-ok the data directory of the app. * @param invokeWith null-ok the command to invoke with. * @param packageName null-ok the name of the package this process belongs to. + * @param disabledCompatChanges null-ok list of disabled compat changes for the process being + * started. * @param zygoteArgs Additional arguments to supply to the zygote process. * @param isTopApp Whether the process starts for high priority application. * @@ -325,6 +327,7 @@ public class ZygoteProcess { @Nullable String packageName, boolean useUsapPool, boolean isTopApp, + @Nullable long[] disabledCompatChanges, @Nullable String[] zygoteArgs) { // TODO (chriswailes): Is there a better place to check this value? if (fetchUsapPoolEnabledPropWithMinInterval()) { @@ -335,7 +338,7 @@ public class ZygoteProcess { return startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false, - packageName, useUsapPool, isTopApp, zygoteArgs); + packageName, useUsapPool, isTopApp, disabledCompatChanges, zygoteArgs); } catch (ZygoteStartFailedEx ex) { Log.e(LOG_TAG, "Starting VM process through Zygote failed"); @@ -535,6 +538,7 @@ public class ZygoteProcess { * that has its state cloned from this zygote process. * @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 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 @@ -554,6 +558,7 @@ public class ZygoteProcess { @Nullable String packageName, boolean useUsapPool, boolean isTopApp, + @Nullable long[] disabledCompatChanges, @Nullable String[] extraArgs) throws ZygoteStartFailedEx { ArrayList<String> argsForZygote = new ArrayList<>(); @@ -584,10 +589,10 @@ public class ZygoteProcess { // --setgroups is a comma-separated list if (gids != null && gids.length > 0) { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append("--setgroups="); - int sz = gids.length; + final int sz = gids.length; for (int i = 0; i < sz; i++) { if (i != 0) { sb.append(','); @@ -631,6 +636,21 @@ public class ZygoteProcess { argsForZygote.add(Zygote.START_AS_TOP_APP_ARG); } + if (disabledCompatChanges != null && disabledCompatChanges.length > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("--disabled-compat-changes="); + + int sz = disabledCompatChanges.length; + for (int i = 0; i < sz; i++) { + if (i != 0) { + sb.append(','); + } + sb.append(disabledCompatChanges[i]); + } + + argsForZygote.add(sb.toString()); + } + argsForZygote.add(processClass); if (extraArgs != null) { @@ -1166,7 +1186,8 @@ public class ZygoteProcess { gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo, abi, instructionSet, null /* appDataDir */, null /* invokeWith */, true /* startChildZygote */, null /* packageName */, - false /* useUsapPool */, false /* isTopApp */, extraArgs); + false /* useUsapPool */, false /* isTopApp */, + null /* disabledCompatChanges */, extraArgs); } catch (ZygoteStartFailedEx ex) { throw new RuntimeException("Starting child-zygote through Zygote failed", ex); } diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java index a21187165c65..fa823c4bf2f6 100644 --- a/core/java/com/android/internal/os/RuntimeInit.java +++ b/core/java/com/android/internal/os/RuntimeInit.java @@ -367,8 +367,8 @@ public class RuntimeInit { if (DEBUG) Slog.d(TAG, "Leaving RuntimeInit!"); } - protected static Runnable applicationInit(int targetSdkVersion, String[] argv, - ClassLoader classLoader) { + protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges, + String[] argv, ClassLoader classLoader) { // If the application calls System.exit(), terminate the process // immediately without running any shutdown hooks. It is not possible to // shutdown an Android application gracefully. Among other things, the @@ -377,6 +377,7 @@ public class RuntimeInit { nativeSetExitWithoutCleanup(true); VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion); + VMRuntime.getRuntime().setDisabledCompatChanges(disabledCompatChanges); final Arguments args = new Arguments(argv); diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java index f0e779694c90..790d7f7ab694 100644 --- a/core/java/com/android/internal/os/WrapperInit.java +++ b/core/java/com/android/internal/os/WrapperInit.java @@ -23,16 +23,18 @@ import android.system.Os; import android.system.OsConstants; import android.system.StructCapUserData; import android.system.StructCapUserHeader; -import android.util.TimingsTraceLog; import android.util.Slog; +import android.util.TimingsTraceLog; + import dalvik.system.VMRuntime; + +import libcore.io.IoUtils; + import java.io.DataOutputStream; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; -import libcore.io.IoUtils; - /** * Startup class for the wrapper process. * @hide @@ -166,10 +168,10 @@ public class WrapperInit { System.arraycopy(argv, 2, removedArgs, 0, argv.length - 2); argv = removedArgs; } - // Perform the same initialization that would happen after the Zygote forks. Zygote.nativePreApplicationInit(); - return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); + return RuntimeInit.applicationInit(targetSdkVersion, /*disabledCompatChanges*/ null, + argv, classLoader); } /** diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index fbacdd73dabb..2b988c155412 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -672,6 +672,7 @@ public final class Zygote { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); return ZygoteInit.zygoteInit(args.mTargetSdkVersion, + args.mDisabledCompatChanges, args.mRemainingArgs, null /* classLoader */); } finally { diff --git a/core/java/com/android/internal/os/ZygoteArguments.java b/core/java/com/android/internal/os/ZygoteArguments.java index a23e659db49a..54b2a2063451 100644 --- a/core/java/com/android/internal/os/ZygoteArguments.java +++ b/core/java/com/android/internal/os/ZygoteArguments.java @@ -215,6 +215,12 @@ class ZygoteArguments { boolean mIsTopApp; /** + * A set of disabled app compatibility changes for the running app. From + * --disabled-compat-changes. + */ + long[] mDisabledCompatChanges = null; + + /** * Constructs instance and parses args * * @param args zygote command-line args @@ -421,6 +427,16 @@ class ZygoteArguments { expectRuntimeArgs = false; } else if (arg.startsWith(Zygote.START_AS_TOP_APP_ARG)) { mIsTopApp = true; + } else if (arg.startsWith("--disabled-compat-changes=")) { + if (mDisabledCompatChanges != null) { + throw new IllegalArgumentException("Duplicate arg specified"); + } + final String[] params = getAssignmentList(arg); + final int length = params.length; + mDisabledCompatChanges = new long[length]; + for (int i = 0; i < length; i++) { + mDisabledCompatChanges[i] = Long.parseLong(params[i]); + } } else { break; } diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index a14b09343a01..3111b6ff0f72 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -501,6 +501,7 @@ class ZygoteConnection { } else { if (!isZygote) { return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, + parsedArgs.mDisabledCompatChanges, parsedArgs.mRemainingArgs, null /* classLoader */); } else { return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion, diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 9ee79eada626..49b4cf828db6 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -553,6 +553,7 @@ public class ZygoteInit { * Pass the remaining arguments to SystemServer. */ return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, + parsedArgs.mDisabledCompatChanges, parsedArgs.mRemainingArgs, cl); } @@ -988,14 +989,16 @@ public class ZygoteInit { * * Current recognized args: * <ul> - * <li> <code> [--] <start class name> <args> + * <li> <code> [--] <start class name> <args> * </ul> * * @param targetSdkVersion target SDK version - * @param argv arg strings + * @param disabledCompatChanges set of disabled compat changes for the process (all others + * are enabled) + * @param argv arg strings */ - public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, - ClassLoader classLoader) { + public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges, + String[] argv, ClassLoader classLoader) { if (RuntimeInit.DEBUG) { Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote"); } @@ -1005,7 +1008,8 @@ public class ZygoteInit { RuntimeInit.commonInit(); ZygoteInit.nativeZygoteInit(); - return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); + return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, + classLoader); } /** |
