Merge "Increment vers of PrintRecommendationService"
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 4eee854..9cd1a42 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -398,6 +398,10 @@
* make easily identifyable processes even if you are using the same base
* <var>processClass</var> to start them.
*
+ * When invokeWith is not null, the process will be started as a fresh app
+ * and not a zygote fork. Note that this is only allowed for uid 0 or when
+ * debugFlags contains DEBUG_ENABLE_DEBUGGER.
+ *
* @param processClass The class to use as the process's main entry
* point.
* @param niceName A more readable name to use for the process.
@@ -410,6 +414,7 @@
* @param abi non-null the ABI this app should be started with.
* @param instructionSet null-ok the instruction set to use.
* @param appDataDir null-ok the data directory of the app.
+ * @param invokeWith null-ok the command to invoke with.
* @param zygoteArgs Additional arguments to supply to the zygote process.
*
* @return An object that describes the result of the attempt to start the process.
@@ -426,10 +431,11 @@
String abi,
String instructionSet,
String appDataDir,
+ String invokeWith,
String[] zygoteArgs) {
return zygoteProcess.start(processClass, niceName, uid, gid, gids,
debugFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, zygoteArgs);
+ abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
}
/** @hide */
@@ -442,10 +448,11 @@
String abi,
String instructionSet,
String appDataDir,
+ String invokeWith,
String[] zygoteArgs) {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
debugFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, zygoteArgs);
+ abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
}
/**
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index c45fe5a..5ac33a1 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -170,6 +170,10 @@
* make easily identifyable processes even if you are using the same base
* <var>processClass</var> to start them.
*
+ * When invokeWith is not null, the process will be started as a fresh app
+ * and not a zygote fork. Note that this is only allowed for uid 0 or when
+ * debugFlags contains DEBUG_ENABLE_DEBUGGER.
+ *
* @param processClass The class to use as the process's main entry
* point.
* @param niceName A more readable name to use for the process.
@@ -182,6 +186,7 @@
* @param abi non-null the ABI this app should be started with.
* @param instructionSet null-ok the instruction set to use.
* @param appDataDir null-ok the data directory of the app.
+ * @param invokeWith null-ok the command to invoke with.
* @param zygoteArgs Additional arguments to supply to the zygote process.
*
* @return An object that describes the result of the attempt to start the process.
@@ -196,11 +201,12 @@
String abi,
String instructionSet,
String appDataDir,
+ String invokeWith,
String[] zygoteArgs) {
try {
return startViaZygote(processClass, niceName, uid, gid, gids,
debugFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, zygoteArgs);
+ abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
@@ -330,6 +336,7 @@
String abi,
String instructionSet,
String appDataDir,
+ String invokeWith,
String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<String>();
@@ -407,6 +414,11 @@
argsForZygote.add("--app-data-dir=" + appDataDir);
}
+ if (invokeWith != null) {
+ argsForZygote.add("--invoke-with");
+ argsForZygote.add(invokeWith);
+ }
+
argsForZygote.add(processClass);
if (extraArgs != null) {
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 66b294d..44c6e85 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -697,9 +697,11 @@
throws ZygoteSecurityException {
int peerUid = peer.getUid();
- if (args.invokeWith != null && peerUid != 0) {
- throw new ZygoteSecurityException("Peer is not permitted to specify "
- + "an explicit invoke-with wrapper command");
+ if (args.invokeWith != null && peerUid != 0 &&
+ (args.debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) == 0) {
+ throw new ZygoteSecurityException("Peer is permitted to specify an"
+ + "explicit invoke-with wrapper command only for debuggable"
+ + "applications.");
}
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 5fcde8b..70e9004 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -20,10 +20,6 @@
LOCAL_CFLAGS += -DENABLE_CPUSETS
endif
-ifneq ($(ENABLE_SCHED_BOOST),)
- LOCAL_CFLAGS += -DENABLE_SCHED_BOOST
-endif
-
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index d081549..fec8f4e 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -37,6 +37,7 @@
#include <sys/prctl.h>
#include <sys/resource.h>
#include <sys/stat.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <sys/wait.h>
@@ -153,6 +154,24 @@
}
}
+// Resets nice priority for zygote process. Zygote priority can be set
+// to high value during boot phase to speed it up. We want to ensure
+// zygote is running at normal priority before childs are forked from it.
+//
+// This ends up being called repeatedly before each fork(), but there's
+// no real harm in that.
+static void ResetNicePriority(JNIEnv* env) {
+ errno = 0;
+ int prio = getpriority(PRIO_PROCESS, 0);
+ if (prio == -1 && errno != 0) {
+ ALOGW("getpriority failed: %s\n", strerror(errno));
+ }
+ if (prio != 0 && setpriority(PRIO_PROCESS, 0, 0) != 0) {
+ ALOGE("setpriority(%d, 0, 0) failed: %s", PRIO_PROCESS, strerror(errno));
+ RuntimeAbort(env, __LINE__, "setpriority failed");
+ }
+}
+
// Sets the SIGCHLD handler back to default behavior in zygote children.
static void UnsetSigChldHandler() {
struct sigaction sa;
@@ -418,27 +437,6 @@
}
}
-#ifdef ENABLE_SCHED_BOOST
-static void SetForkLoad(bool boost) {
- // set scheduler knob to boost forked processes
- pid_t currentPid = getpid();
- // fits at most "/proc/XXXXXXX/sched_init_task_load\0"
- char schedPath[35];
- snprintf(schedPath, sizeof(schedPath), "/proc/%u/sched_init_task_load", currentPid);
- int schedBoostFile = open(schedPath, O_WRONLY);
- if (schedBoostFile < 0) {
- ALOGW("Unable to set zygote scheduler boost");
- return;
- }
- if (boost) {
- write(schedBoostFile, "100\0", 4);
- } else {
- write(schedBoostFile, "0\0", 2);
- }
- close(schedBoostFile);
-}
-#endif
-
// The list of open zygote file descriptors.
static FileDescriptorTable* gOpenFdTable = NULL;
@@ -452,10 +450,6 @@
jstring instructionSet, jstring dataDir) {
SetSigChldHandler();
-#ifdef ENABLE_SCHED_BOOST
- SetForkLoad(true);
-#endif
-
// Close any logging related FDs before we start evaluating the list of
// file descriptors.
__android_log_close();
@@ -472,6 +466,8 @@
RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table.");
}
+ ResetNicePriority(env);
+
pid_t pid = fork();
if (pid == 0) {
@@ -614,12 +610,6 @@
}
} else if (pid > 0) {
// the parent process
-
-#ifdef ENABLE_SCHED_BOOST
- // unset scheduler knob
- SetForkLoad(false);
-#endif
-
}
return pid;
}
@@ -750,4 +740,3 @@
return RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
}
} // namespace android
-
diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h
index af27069..b78b8ff 100644
--- a/core/jni/fd_utils-inl.h
+++ b/core/jni/fd_utils-inl.h
@@ -51,6 +51,7 @@
"/dev/null",
"/dev/socket/zygote",
"/dev/socket/zygote_secondary",
+ "/dev/socket/webview_zygote",
"/sys/kernel/debug/tracing/trace_marker",
"/system/framework/framework-res.apk",
"/dev/urandom",
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 25021b8..4cf1226 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1287,7 +1287,8 @@
This may be empty if network scoring and recommending isn't supported.
-->
<string-array name="config_networkRecommendationPackageNames" translatable="false">
- <!-- Add packages here -->
+ <!-- The standard AOSP network recommendation provider -->
+ <item>com.android.networkrecommendation</item>
</string-array>
<!-- Whether to enable Hardware FLP overlay which allows Hardware FLP to be
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index fa54a61..5b02c79 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3783,6 +3783,15 @@
mNativeDebuggingApp = null;
}
+ String invokeWith = null;
+ if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
+ // Debuggable apps may include a wrapper script with their library directory.
+ String wrapperFileName = app.info.nativeLibraryDir + "/wrap.sh";
+ if (new File(wrapperFileName).exists()) {
+ invokeWith = "/system/bin/logwrapper " + wrapperFileName;
+ }
+ }
+
String requiredAbi = (abiOverride != null) ? abiOverride : app.info.primaryCpuAbi;
if (requiredAbi == null) {
requiredAbi = Build.SUPPORTED_ABIS[0];
@@ -3809,12 +3818,12 @@
startResult = Process.startWebView(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
- app.info.dataDir, entryPointArgs);
+ app.info.dataDir, null, entryPointArgs);
} else {
startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
- app.info.dataDir, entryPointArgs);
+ app.info.dataDir, invokeWith, entryPointArgs);
}
checkTime(startTime, "startProcess: returned from zygote!");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);