Android虚拟机启动过程

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);
    ...
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值