您的位置:首页 > 移动开发 > Android开发

Android 系统的java世界是怎么诞生的?孵化器zygote的初步探索

2014-07-29 23:36 671 查看
1---->app_main.cpp (zygote进程)的入口,这个肯定是init进程来调用的)

int main(int argc, const char* const argv[])

{

runtime.start("com.android.internal.os.ZygoteInit",

startSystemServer ? "start-system-server" : "");

}

2---->AndroidRuntime.cpp

void AndroidRuntime::start(const char* className, const char* options)

{

//1.startVm start the virtual machine

//2.startReg Register android functions.

//3.通过jni调用调用com.android.internal.os.ZygoteInit.java中的main方法

//进入Java世界

}

------->2.1 startVm做了什么?

调用JNI创建vm的函数创建java虚拟机

设置一些参数,比如:全局引用数为2000,heap大小为16M等

------->2.2 startReg做了什么?

给上述创建的虚拟机注册一些JNI函数,因为后续java世界中的一些函数是以native的方式

实现的,所以要提前注册。把Android API与本地方法的注册关联起来

startReg的实现方式如下(可以借鉴,在涉及到JNI开发时)

1.遍历函数指针数组,通过函数指针来调用函数

static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)

{

for (size_t i = 0; i < count; i++) {

if (array[i].mProc(env) < 0) {

#ifndef NDEBUG

LOGD("----------!!! %s failed to load\n", array[i].mName);

#endif

return -1;

}

}

return 0;

}

2.RegJNIRec是个结构体:

#ifdef NDEBUG

#define REG_JNI(name) { name }

struct RegJNIRec {

int (*mProc)(JNIEnv*);

};

#else //debug版本

#define REG_JNI(name) { name, #name }

struct RegJNIRec {

int (*mProc)(JNIEnv*);

const char* mName;

};

#endif

3.int AndroidRuntime::startReg(JNIEnv* env)中会调用 register_jni_procs方法。

int AndroidRuntime::startReg(JNIEnv* env)

{

。。。

if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {

env->PopLocalFrame(NULL);

return -1;

}

}

4.而 gRegJNI 的是一个 RegJNIRec类型的数组

static const RegJNIRec gRegJNI[] = {

REG_JNI(register_android_debug_JNITest),

REG_JNI(register_com_android_internal_os_RuntimeInit),

REG_JNI(register_android_os_SystemClock),

REG_JNI(register_android_util_EventLog),

REG_JNI(register_android_util_Log),

REG_JNI(register_android_util_FloatMath),

REG_JNI(register_android_text_format_Time),

REG_JNI(register_android_content_AssetManager),

REG_JNI(register_android_content_StringBlock),

REG_JNI(register_android_content_XmlBlock),

REG_JNI(register_android_emoji_EmojiFactory),

REG_JNI(register_android_text_AndroidCharacter),

REG_JNI(register_android_text_AndroidBidi),

REG_JNI(register_android_text_KeyCharacterMap),

REG_JNI(register_android_os_Process),

REG_JNI(register_android_os_SystemProperties),

REG_JNI(register_android_os_Binder),

REG_JNI(register_android_view_Display),

REG_JNI(register_android_nio_utils),

REG_JNI(register_android_graphics_PixelFormat),

REG_JNI(register_android_graphics_Graphics),

REG_JNI(register_android_view_GLES20Canvas),

REG_JNI(register_android_view_Surface),

REG_JNI(register_android_view_TextureView),

REG_JNI(register_com_google_android_gles_jni_EGLImpl),

REG_JNI(register_com_google_android_gles_jni_GLImpl),

REG_JNI(register_android_opengl_jni_GLES10),

REG_JNI(register_android_opengl_jni_GLES10Ext),

REG_JNI(register_android_opengl_jni_GLES11),

REG_JNI(register_android_opengl_jni_GLES11Ext),

REG_JNI(register_android_opengl_jni_GLES20),

//图形绘制方面的jni函数

REG_JNI(register_android_graphics_Bitmap),

REG_JNI(register_android_graphics_BitmapFactory),

REG_JNI(register_android_graphics_BitmapRegionDecoder),

REG_JNI(register_android_graphics_Camera),

REG_JNI(register_android_graphics_Canvas),

REG_JNI(register_android_graphics_ColorFilter),

REG_JNI(register_android_graphics_DrawFilter),

REG_JNI(register_android_graphics_Interpolator),

REG_JNI(register_android_graphics_LayerRasterizer),

REG_JNI(register_android_graphics_MaskFilter),

REG_JNI(register_android_graphics_Matrix),

REG_JNI(register_android_graphics_Movie),

REG_JNI(register_android_graphics_NinePatch),

REG_JNI(register_android_graphics_Paint),

REG_JNI(register_android_graphics_Path),

REG_JNI(register_android_graphics_PathMeasure),

REG_JNI(register_android_graphics_PathEffect),

REG_JNI(register_android_graphics_Picture),

REG_JNI(register_android_graphics_PorterDuff),

REG_JNI(register_android_graphics_Rasterizer),

REG_JNI(register_android_graphics_Region),

REG_JNI(register_android_graphics_Shader),

REG_JNI(register_android_graphics_SurfaceTexture),

REG_JNI(register_android_graphics_Typeface),

REG_JNI(register_android_graphics_Xfermode),

REG_JNI(register_android_graphics_YuvImage),

REG_JNI(register_android_database_CursorWindow),

REG_JNI(register_android_database_SQLiteCompiledSql),

REG_JNI(register_android_database_SQLiteDatabase),

REG_JNI(register_android_database_SQLiteDebug),

REG_JNI(register_android_database_SQLiteProgram),

REG_JNI(register_android_database_SQLiteQuery),

REG_JNI(register_android_database_SQLiteStatement),

REG_JNI(register_android_os_Debug),

REG_JNI(register_android_os_FileObserver),

REG_JNI(register_android_os_FileUtils),

REG_JNI(register_android_os_MessageQueue),

REG_JNI(register_android_os_ParcelFileDescriptor),

REG_JNI(register_android_os_Power),

REG_JNI(register_android_os_StatFs),

REG_JNI(register_android_os_UEventObserver),

REG_JNI(register_android_net_LocalSocketImpl),

REG_JNI(register_android_net_NetworkUtils),

REG_JNI(register_android_net_TrafficStats),

REG_JNI(register_android_net_wifi_WifiManager),

REG_JNI(register_android_nfc_NdefMessage),

REG_JNI(register_android_nfc_NdefRecord),

REG_JNI(register_android_os_MemoryFile),

REG_JNI(register_com_android_internal_os_ZygoteInit),

REG_JNI(register_android_hardware_Camera),

REG_JNI(register_android_hardware_SensorManager),

REG_JNI(register_android_hardware_UsbDevice),

REG_JNI(register_android_hardware_UsbDeviceConnection),

REG_JNI(register_android_hardware_UsbRequest),

REG_JNI(register_android_media_AudioRecord),

REG_JNI(register_android_media_AudioSystem),

REG_JNI(register_android_media_AudioTrack),

REG_JNI(register_android_media_JetPlayer),

REG_JNI(register_android_media_ToneGenerator),

REG_JNI(register_android_opengl_classes),

REG_JNI(register_android_bluetooth_HeadsetBase),

REG_JNI(register_android_bluetooth_BluetoothAudioGateway),

REG_JNI(register_android_bluetooth_BluetoothSocket),

REG_JNI(register_android_server_BluetoothService),

REG_JNI(register_android_server_BluetoothEventLoop),

REG_JNI(register_android_server_BluetoothA2dpService),

REG_JNI(register_android_server_NetworkManagementSocketTagger),

REG_JNI(register_android_server_Watchdog),

REG_JNI(register_android_ddm_DdmHandleNativeHeap),

REG_JNI(register_android_backup_BackupDataInput),

REG_JNI(register_android_backup_BackupDataOutput),

REG_JNI(register_android_backup_FileBackupHelperBase),

REG_JNI(register_android_backup_BackupHelperDispatcher),

REG_JNI(register_android_app_backup_FullBackup),

REG_JNI(register_android_app_ActivityThread),

REG_JNI(register_android_app_NativeActivity),

REG_JNI(register_android_view_InputChannel),

REG_JNI(register_android_view_InputQueue),

REG_JNI(register_android_view_KeyEvent),

REG_JNI(register_android_view_MotionEvent),

REG_JNI(register_android_view_PointerIcon),

REG_JNI(register_android_view_VelocityTracker),

REG_JNI(register_android_content_res_ObbScanner),

REG_JNI(register_android_content_res_Configuration),

REG_JNI(register_android_animation_PropertyValuesHolder),

REG_JNI(register_com_android_internal_content_NativeLibraryHelper),

};

5.比如 在android_util_Process.cpp中调用register_android_os_Process的注册相关JNI函数

static const JNINativeMethod methods[] = {

{"myPid", "()I", (void*)android_os_Process_myPid},

{"myTid", "()I", (void*)android_os_Process_myTid},

{"myUid", "()I", (void*)android_os_Process_myUid},

{"getUidForName", "(Ljava/lang/String;)I", (void*)android_os_Process_getUidForName},

{"getGidForName", "(Ljava/lang/String;)I", (void*)android_os_Process_getGidForName},

{"setThreadPriority", "(II)V", (void*)android_os_Process_setThreadPriority},

{"setCanSelfBackground", "(Z)V", (void*)android_os_Process_setCanSelfBackground},

{"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority},

{"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority},

{"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},

{"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup},

{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},

{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},

{"setUid", "(I)I", (void*)android_os_Process_setUid},

{"setGid", "(I)I", (void*)android_os_Process_setGid},

{"sendSignal", "(II)V", (void*)android_os_Process_sendSignal},

{"sendSignalQuiet", "(II)V", (void*)android_os_Process_sendSignalQuiet},

{"getFreeMemory", "()J", (void*)android_os_Process_getFreeMemory},

{"readProcLines", "(Ljava/lang/String;[Ljava/lang/String;[J)V", (void*)android_os_Process_readProcLines},

{"getPids", "(Ljava/lang/String;[I)[I", (void*)android_os_Process_getPids},

{"readProcFile", "(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_readProcFile},

{"parseProcLine", "([BII[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_parseProcLine},

{"getElapsedCpuTime", "()J", (void*)android_os_Process_getElapsedCpuTime},

{"getPss", "(I)J", (void*)android_os_Process_getPss},

//{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},

};

const char* const kProcessPathName = "android/os/Process";

int register_android_os_Process(JNIEnv* env)

{

return AndroidRuntime::registerNativeMethods(

env, kProcessPathName,

methods, NELEM(methods));

}

而AndroidRuntime::registerNativeMethods(

env, kProcessPathName,

methods, NELEM(methods));继续调用JNIapi函数:

jniRegisterNativeMethods(env, className, gMethods, numMethods);

3----->ZygoteInit.java

public static void main(String argv[]) {

---A. 建立IPC通信服务端--registerZygoteSocket,zygote进程与其他进程的通信没有用Binder而是用AF_UNIX Sockt。

配置建立一个local socket,以接收其它进程的进程创建请求。

调用registerZygoteSocket():根据环境变量中的配置建立一个local socket,以接收其它进程的进程创建请求

---B. 调用preloadClasses()预加载指定的java类

在一个preloaded-classes文件中有1200多行,启动时加载这些类,引起慢的原因之一。

---C. 调用preloadResources()预加载指定的Resources

在ui编程中我们引用的com.android.R.XXX就是在这里加载的

---D. 调用startSystemServer()创建(fork)SystemServer进程,然后父进程zygote进入循环runSelectLoopMode(),

子进程SystemServer调用hanldeSystemServerProcess()

它创建的这个系统进程很重要,因为framework中的service,比如ActivityManagerService,PackageManagerService,

WindowManagerService等都运行在这个进程中,如果它死了会导致zygote进程自杀。

---E. 调用runSelectLoopMode()

进入死循环:监听socket,根据请求创建新进程

至此,zygote进程的初始化工作全部完成,Android Runtime已经启动。

}

*********************************************zygote任务结束,小结一下******************************************************

1.构建AppRuntime对象,并调用它的start方法,其他zygote不管了,都交给AppRuntime来做事。

2.AppRuntime在start方法里,调用startVm创建java虚拟机,并且注册JNI函数。

3.调用ZygoteInit.java的main方法,进入java世界。

4.ZygoteInit.java在main中,调用registerZygoteSocket响应子孙后代的请求。并调用

preloadClasses,preloadResources加载一些类,一些资源。

5.zygote既然具备孵化子进程的功能,它就无中生有,造了一个人来做一些事,这个人就是SystemServer进程,java

世界的service聚集地!

6.zygote把该做的都做好了,

给大家创建了一个java世界,

也为大家提供了创建进程的功能,

也为刚创建的java世界,加载了一些这个世界需要的一些类,一些资源

还孵化了一个进程,让java世界中的一些非常重要的核心服务放在这个进程里,一旦这个进程死了,zygote也不想活了,也自杀。

7.zygote老人家把这些事做好了,它并没有离开这个世界,而是无时不在的在我们身边,当接受到子孙后代的请求时,它会随时

为这些子孙后代工作。多么伟大啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: