Android虚拟机art流程:从zygote开始梳理art的启动(1)

  • A+
所属分类:art虚拟机

art虚拟主机—从zygote启动开始分析,内容分为17篇笔记更新,欢迎大家阅读。

 

AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
class AppRuntime : public AndroidRuntime
{
public:
}

 

AndroidRuntime.cpp frameworks\base\core\jni

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    ....
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);

  ...
    char* slashClassName = toSlashClassName(className);
    jclass startClass = env->FindClass(slashClassName);
    if (startClass == NULL) {
...
    } else {
        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
        if (startMeth == NULL) {
            ALOGE("JavaVM unable to find main() in '%s'\n", className);
            /* keep going */
        } else {
            env->CallStaticVoidMethod(startClass, startMeth, strArray);

....
        }
    }
...
}

 

  • 首先是要看下 JniInvocation 里面的初始化的东西
  • 然后是要看下JavaVM 和 JNIEnv 的初始化,就是java环境的建立。
  • 然后看下JNI_CreateJavaVM 对运行时 oat文件等等,runtime等等的建立
  • 最后看下FindClass 怎么找到我们的ZygoteInit类,已经怎么连接本地代码和怎么调用。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: