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