Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4d81f25 authored by Andy McFadden's avatar Andy McFadden
Browse files

Add support for dalvik.vm.extra-opts property.

The goal here is to avoid the dalvik.vm.* property explosion by
having a single property that takes an arbitrary collection of Dalvik
command-line options.  This is intended for testing of various
configurations by the Dalvik team, not industrial use.

Options should be separated by spaces, e.g.

  adb shell setprop dalvik.vm.extra-opts "-showversion -Xmx4m"

will print the version banner and set the heap max to 4MB, which won't
get you very far.

The extra-opts options will appear last, which allows them to override
values set earlier (like the heap max).

Bug 2838629.

(cherry-pick from dalvik-dev branch)

Change-Id: Ibcbb1b62367cf2152798583e8722ef7e461ad19a
parent 01301d31
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -518,6 +518,40 @@ static void readLocale(char* language, char* region)
    //LOGD("language=%s region=%s\n", language, region);
}

/*
 * Parse a property containing space-separated options that should be
 * passed directly to the VM, e.g. "-Xmx32m -verbose:gc -Xregenmap".
 *
 * This will cut up "extraOptsBuf" as we chop it into individual options.
 *
 * Adds the strings, if any, to mOptions.
 */
void AndroidRuntime::parseExtraOpts(char* extraOptsBuf)
{
    JavaVMOption opt;
    char* start;
    char* end;

    memset(&opt, 0, sizeof(opt));
    start = extraOptsBuf;
    while (*start != '\0') {
        while (*start == ' ')                   /* skip leading whitespace */
            start++;
        if (*start == '\0')                     /* was trailing ws, bail */
            break;

        end = start+1;
        while (*end != ' ' && *end != '\0')     /* find end of token */
            end++;
        if (*end == ' ')
            *end++ = '\0';          /* mark end, advance to indicate more */

        opt.optionString = start;
        mOptions.add(opt);
        start = end;
    }
}

/*
 * Start the Dalvik Virtual Machine.
 *
@@ -537,6 +571,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
    char enableAssertBuf[sizeof("-ea:")-1 + PROPERTY_VALUE_MAX];
    char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX];
    char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char extraOptsBuf[PROPERTY_VALUE_MAX];
    char* stackTraceFile = NULL;
    bool checkJni = false;
    bool checkDexSum = false;
@@ -846,6 +881,10 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
        mOptions.add(opt);
    }

    /* extra options; parse this late so it overrides others */
    property_get("dalvik.vm.extra-opts", extraOptsBuf, "");
    parseExtraOpts(extraOptsBuf);

    /* Set the properties for locale */
    {
        char langOption[sizeof("-Duser.language=") + 3];
+1 −0
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ public:

private:
    static int startReg(JNIEnv* env);
    void parseExtraOpts(char* extraOptsBuf);
    int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);

    Vector<JavaVMOption> mOptions;