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

android framework analysis(partII)

2010-06-10 16:24 363 查看
android framework 分析(二)

启动 Zygote

-Xzygote /system/bin --zygote --start-system-server

AndroidRuntime->AppRuntime

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

{

AppRuntime runtime;生成AndroidRuntime实例

...

AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);

}

其中
AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);

呼叫Android::Start(const char* className,const bool startSystemServer)

/framework/base/core/jni/AndroidRuntime.cpp

该函数的处理内容:

1.处理Jave Virtual Machine的一些参数选项;

2.创建Dalvik Java虚拟机,JNI_CreateJavaVM(&mJavaVM,&env,&initArgs);

3.注册Android Runtime中的JNI接口给虚拟机;

4.呼叫Java类
com.android.internal.os.ZygoteInit的main函数



com.android.internal.os.ZygoteInit的main函数中,

1.注册Zygote socket用来接收请求;

2.加载preloaded class、resources用来加快启动速度,文件清单在framework.jar中的preloaded-classes,framework-res.apk中的res中;

3.启动System Server;

fork出独立的进程名称为system-server,呼叫com.android.server.SystemServer类的main函数;

在HandleSystemServerProcess函数中,RuntimeInit.ZygoteInit调用会呼叫AppRuntime的OnZygoteInit函数

4.RuntimeInit.ZygoteInit函数会呼叫
com.android.server.SystemServer类的main函数。

在此main函数中,系统首先加载android_server共享库libandroid_server.so 源代码位于/framework/base/service/jni

在该库中有定义JNI_OnLoad函数,所以Dalvik在加载
libandroid_server.so
的时候会首先呼叫该JNI_OnLoad函数,该函数将android
server注册到Java虚拟机中,包括
KeyInputQueue,HardwareService,AlarmManager,BatteryService,SensorService,SystemServer
等;

呼叫在libanroid_server.so中注册的native函数init1,该函数位于/frameworks/base/services/jni/com_android_server_SystemServer.cpp中;

init1函数呼叫libsystem_server中的system_init函数,该函数位于/frameworks/base/cmds
/system_server/library/system_init.cpp中,该函数将SurfaceFlinger/AudioFlinger
/MediaPlayer/CameraService等组件注册到ServiceManager中

system_init函数反过来呼叫java类com.android.server.SystemServer的init2函数;

5.在init2函数中,android创建了serverthread,在该thread中android开始注册各种service到service manager中

包括EntropyService,PowerManager,ActivityManager,Telephony,PackageManager,ContentManager,ContentProvider,

BatteryService,HardwareService,AlarmManager等等。

注意该线程使用Looper来执行thread

至此android system server启动完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: