1.init.zygote64.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
2.app_main.cpp
main(){
AppRuntime runtime;
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
class AppRuntime : public AndroidRuntime
AppRuntime继承AndroidRuntime
3.AndroidRuntime.cpp
void AndroidRuntime::start(const char* className, const Vector& options, bool zygote){
//第一步:开始虚拟机
if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
//第二步:注册系统jni
if (startReg(env) < 0) {
ALOGE("Unable to register all android natives\n");
return;
}
//第三步:进入zygoteinit.java main方法 startClass = com.android.internal.os.ZygoteInit
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([L;
}
分析startVm方法
4.int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote){
//通过getprop的值设置JVM的堆栈信息
//主要介绍几个相关堆栈信息
//dalvik.vm.heapstartsize每次申请空间的大小,这个值越小,速度越慢,值越大越容易空间不够
//dalvik.vm.heapgrowthlimit 每个应用内存空间的大小
//dalvik.vm.heapsize large模式下每个应用空间内存大小 minifest配置android:largeHeap="true"
//dalvik.vm.heaptargetutilization 应用堆栈使用率一般都是0.75
...
//关键方法JNI_CreateJavaVM
if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {
ALOGE("JNI_CreateJavaVM failed\n");
return -1;
}
}
5.java_vm_ext.cc
extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
...
//初始化两个jni的结构JavaVM和JNIEnv
*p_env = Thread::Current()->GetJniEnv();
*p_vm = runtime->GetJavaVM();
}
6.Thread.h
// JNI methods
JNIEnvExt* GetJniEnv () const {
return tlsPtr_.jni_env;//jni_env在Thread.cc的init中初始化详情见7
}
Runtime.h
JavaVMExt* GetJavaVM() const {
return java_vm_;
}
7.Thread.cc
bool Thread::Init(ThreadList* thread_list, JavaVMExt* java_vm, JNIEnvExt* jni_env_ext) {
...
tlsPtr_.jni_env = JNIEnvExt::Create(this, java_vm);
...
}
8.Runtime.cc
bool Runtime::Init(RuntimeArgumentMap&& runtime_options_in) {
...
java_vm_ = new JavaVMExt(this, runtime_options);
...
}
Android虚拟机启动过程
最新推荐文章于 2023-07-12 10:06:33 发布