1ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek/*
2ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * Copyright (C) 2016 The Android Open Source Project
3ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek *
4ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * Licensed under the Apache License, Version 2.0 (the "License");
5ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * you may not use this file except in compliance with the License.
6ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * You may obtain a copy of the License at
7ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek *
8ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek *      http://www.apache.org/licenses/LICENSE-2.0
9ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek *
10ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * Unless required by applicable law or agreed to in writing, software
11ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * distributed under the License is distributed on an "AS IS" BASIS,
12ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * See the License for the specific language governing permissions and
14ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek * limitations under the License.
15ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek */
16ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
17ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
18ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#define LOG_TAG "WebViewZygote"
19ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
20ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <sys/prctl.h>
21ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
22ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <android_runtime/AndroidRuntime.h>
23ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <binder/IPCThreadState.h>
24ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <binder/ProcessState.h>
25ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <utils/Log.h>
26ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <utils/String8.h>
27ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek#include <utils/Vector.h>
28ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
29ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Seseknamespace android {
30ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
31ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesekclass WebViewRuntime : public AndroidRuntime {
32ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesekpublic:
33ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    WebViewRuntime(char* argBlockStart, size_t argBlockSize)
34ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        : AndroidRuntime(argBlockStart, argBlockSize) {}
35ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
36ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    ~WebViewRuntime() override {}
37ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
38ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    void onStarted() override {
39ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        // Nothing to do since this is a zygote server.
40ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
41ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
42ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    void onVmCreated(JNIEnv*) override {
43ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        // Nothing to do when the VM is created in the zygote.
44ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
45ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
46ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    void onZygoteInit() override {
47ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        // Called after a new process is forked.
48ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        sp<ProcessState> proc = ProcessState::self();
49ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        proc->startThreadPool();
50ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
51ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
52ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    void onExit(int code) override {
53ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        IPCThreadState::self()->stopProcess();
54ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        AndroidRuntime::onExit(code);
55ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
56ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek};
57ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
58ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek}  // namespace android
59ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
60ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesekint main(int argc, char* const argv[]) {
61ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
62ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
63ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        return 12;
64ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
65ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
66ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    size_t argBlockSize = 0;
67ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    for (int i = 0; i < argc; ++i) {
68ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek        argBlockSize += strlen(argv[i]) + 1;
69ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    }
70ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
71ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    android::WebViewRuntime runtime(argv[0], argBlockSize);
72ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    runtime.addOption("-Xzygote");
73ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek
74ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    android::Vector<android::String8> args;
75ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek    runtime.start("com.android.internal.os.WebViewZygoteInit", args, /*zygote=*/ true);
76ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek}
77