summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2015-08-10 18:55:34 +0200
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-10-19 00:12:33 +0200
commite510155dbdebb50048632810b1735d69f9e72638 (patch)
tree068adab1d5aba8f3eb4132d8ff7004a34a9292f0
parent38add157784a2bb5ddb13558573ece99229bb3b0 (diff)
downloadframeworks_base-e510155dbdebb50048632810b1735d69f9e72638.zip
frameworks_base-e510155dbdebb50048632810b1735d69f9e72638.tar.gz
frameworks_base-e510155dbdebb50048632810b1735d69f9e72638.tar.bz2
Allow debugging only for apps forked from zygoteHEADmaster
When starting the runtime from app_process, we only pass JDWP options if starting zygote. It prevents from opening a JDWP connection in non-zygote programs while Android apps (forked from zygote) remain debuggable. Bug: 23050463 (cherry picked from commit 7a09b8322cab26d6e3da1362d3c74964ae66b5d4) Change-Id: Ib5b6d3bc4d45389993c3c54226df5a7b72479d19 Signed-off-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
-rw-r--r--cmds/app_process/app_main.cpp6
-rw-r--r--core/jni/AndroidRuntime.cpp42
-rw-r--r--include/android_runtime/AndroidRuntime.h4
3 files changed, 29 insertions, 23 deletions
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 6fe358c..324c1d2 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -187,14 +187,16 @@ int main(int argc, const char* const argv[])
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit",
- startSystemServer ? "start-system-server" : "");
+ startSystemServer ? "start-system-server" : "",
+ zygote);
} else if (className) {
// Remainder of args get passed to startup class main()
runtime.mClassName = className;
runtime.mArgC = argc - i;
runtime.mArgV = argv + i;
runtime.start("com.android.internal.os.RuntimeInit",
- application ? "application" : "tool");
+ application ? "application" : "tool",
+ zygote);
} else {
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 01ad2f0..ec20e91 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -444,7 +444,7 @@ void AndroidRuntime::parseExtraOpts(char* extraOptsBuf)
*
* Returns 0 on success.
*/
-int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
+int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
int result = -1;
JavaVMInitArgs initArgs;
@@ -634,25 +634,29 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
}
}
- /* enable debugging; set suspend=y to pause during VM init */
- /* use android ADB transport */
- opt.optionString =
- "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
- mOptions.add(opt);
+ /*
+ * Enable debugging only for apps forked from zygote.
+ * Set suspend=y to pause during VM init and use android ADB transport.
+ */
+ if (zygote) {
+ opt.optionString =
+ "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
+ mOptions.add(opt);
- ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
- if (checkJni) {
- /* extended JNI checking */
- opt.optionString = "-Xcheck:jni";
- mOptions.add(opt);
+ ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
+ if (checkJni) {
+ /* extended JNI checking */
+ opt.optionString = "-Xcheck:jni";
+ mOptions.add(opt);
- /* set a cap on JNI global references */
- opt.optionString = "-Xjnigreflimit:2000";
- mOptions.add(opt);
+ /* set a cap on JNI global references */
+ opt.optionString = "-Xjnigreflimit:2000";
+ mOptions.add(opt);
- /* with -Xcheck:jni, this provides a JNI function call trace */
- //opt.optionString = "-verbose:jni";
- //mOptions.add(opt);
+ /* with -Xcheck:jni, this provides a JNI function call trace */
+ //opt.optionString = "-verbose:jni";
+ //mOptions.add(opt);
+ }
}
char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:") + sizeof(propBuf)];
@@ -807,7 +811,7 @@ char* AndroidRuntime::toSlashClassName(const char* className)
* Passes the main function two arguments, the class name and the specified
* options string.
*/
-void AndroidRuntime::start(const char* className, const char* options)
+void AndroidRuntime::start(const char* className, const char* options, bool zygote)
{
ALOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",
className != NULL ? className : "(unknown)");
@@ -840,7 +844,7 @@ void AndroidRuntime::start(const char* className, const char* options)
/* start the virtual machine */
JNIEnv* env;
- if (startVm(&mJavaVM, &env) != 0) {
+ if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
onVmCreated(env);
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index 0b3ce9a..e8e869d 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -64,7 +64,7 @@ public:
int addVmArguments(int argc, const char* const argv[]);
- void start(const char *classname, const char* options);
+ void start(const char *classname, const char* options, bool zygote);
void exit(int code);
@@ -116,7 +116,7 @@ public:
private:
static int startReg(JNIEnv* env);
void parseExtraOpts(char* extraOptsBuf);
- int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
+ int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote);
Vector<JavaVMOption> mOptions;
bool mExitWithoutCleanup;