https://www.jianshu.com/p/75039ea24937
bootloader
bootloader程序分两个阶段执行。第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;第二阶段,设置网络、内存等等。这些对于运行内核是必要的,为了达到特殊的目标,bootloader可以根据配置参数或者输入数据设置内核。
Kernel
kernel开始启动时,设置缓存、被保护存储器、计划列表,加载驱动。
当kernel完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。
Init进程初始化
1 | adb shell ps | grep 'init\|zygote' 0|1 ✘ 14:07:25 |
- system/core/init/main.cpp 入口
- system/core/init/first_stage_init.cpp FirstStageMain,第一阶段,挂载系统文件
- system/core/init/selinux.cpp SetupSelinux,第二阶段,
- system/core/init/init.cpp SecondStageMain,第三阶段,初始化 property 服务,解析执行 rc 配置文件
Zygote进程
.rc 文件是配置文件,是由 Android 初始化语言(Android Init Language)编写的脚本,这里直接跟看下 system/core/rootdir/init.zygote64.rc
1 | service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server |
- frameworks/base/core/jni/AndroidRuntime.cppJniInvocation Init
1
2
3
4
5
6
7
8
9
10
11
12/* start the virtual machine */
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
return;
}
// zygote 什么也不做
onVmCreated(env);
// 调用 com.android.internal.os.ZygoteInit 的 main方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30bool JniInvocationInit(struct JniInvocationImpl* instance, const char* library_name) {
...
// 找到libart.so
library_name = JniInvocationGetLibrary(library_name, buffer);
// dlopen libart.so
DlLibrary library = DlOpenLibrary(library_name);
// 找到 3个 libart.so 中JNI符号
DlSymbol JNI_GetDefaultJavaVMInitArgs_ = FindSymbol(library, "JNI_GetDefaultJavaVMInitArgs");
if (JNI_GetDefaultJavaVMInitArgs_ == NULL) {
return false;
}
DlSymbol JNI_CreateJavaVM_ = FindSymbol(library, "JNI_CreateJavaVM");
if (JNI_CreateJavaVM_ == NULL) {
return false;
}
DlSymbol JNI_GetCreatedJavaVMs_ = FindSymbol(library, "JNI_GetCreatedJavaVMs");
if (JNI_GetCreatedJavaVMs_ == NULL) {
return false;
}
// set param to JniInvocationImpl instance
instance->jni_provider_library_name = library_name;
instance->jni_provider_library = library;
instance->JNI_GetDefaultJavaVMInitArgs = (jint (*)(void *)) JNI_GetDefaultJavaVMInitArgs_;
instance->JNI_CreateJavaVM = (jint (*)(JavaVM**, JNIEnv**, void*)) JNI_CreateJavaVM_;
instance->JNI_GetCreatedJavaVMs = (jint (*)(JavaVM**, jsize, jsize*)) JNI_GetCreatedJavaVMs_;
return true;
}
JNIEnv是一个结构体,定义在jni.h 中,实际的实现在art/runtime/jni/jni_internal.cc,主要作用是调用jni中提供的方法。
1 | JNIEnv* env; |
startVm
1 | extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) { |