http://raymond1860.spaces.live.com/Blog/cns!BF47B6FD104579C9!797.entry
1.目錄樹 /framework/base/api /framework/base/awt /framework/base/build /framework/base/camera 關 於camera的HAL接口庫。最終生成native共享庫libcamera.so ,編譯時根據是否定義USE_CAMERA_STUB來決定系統是否有Camera硬件支持。若沒有實際的Camera硬件,則編譯時會和虛擬 camera靜態庫(libcamerastub.a,由camerahardwarestub.cpp,fakecamera生成)鏈接生成 libcamera.so。 /framework/base/cmds 關於android系統啟動時用到的command等 /framework/base/cmds/am /framework/base/cmds/app_process 可 執行文件app_process,該文件可以根據輸入參數決定是Zygote啟動(參考init.rc中的語句 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server). 該執行程式會鏈接libandroid_runtime.so去鏈接android runtime。后面我會在詳細分析此部分。 /framework/base/cmds/backup 可執行程式btool /framework/base/cmds/bmgr java可執行程式, backup manager, java庫形式分發到目標系統/system/framework/bmgr.jar /framework/base/cmds/bootanimation android啟動動畫效果程式,該程式必須在android runtime啟動后運行。 /framework/base/cmds/dumpstate android系統調試輔助工具,生成可執行程式dumpstate,同時建立兩個程式dumpcrash bugreport指向該程式。 /framework/base/cmds/dumpsys 生成可執行程式dumpsys /framework/base/cmds/ime java可執行程式 ,IME輸入法 input method manager, java庫形式分發到目標系統/system/framework/ime.jar /framework/base/cmds/input java可執行程式,管理input事件例如key event,text event 等,java庫形式分發到目標系統/system/framework/input.jar /framework/base/cmds/installd 可執行程式installd,install manager,僅在非simulator系統中運行,安裝到目標系統/system/bin/installd /framework/base/cmds/keystore 可執行程式keystore,用途???僅在非simulator系統中運行,安裝到目標系統/system/bin/keystore /framework/base/cmds/pm java可執行程式,package manager,java庫形式分發到目標系統/system/framework/pm.jar /framework/base/cmds/runtime runtime可執行程式,僅在simulator中使用 /framework/base/cmds/service service可執行程式,用來查找,檢查,呼叫service,安裝到目標系統/system/bin/service /framework/base/cmds/servicemanager android系統的service manager,可執行文件,安裝到目標系統/system/bin/servicemanager servicemanager會和kernel的binder driver協作共同完成service的添加、查詢、獲取、檢查等。 /framework/base/cmds/surfaceflinger surfaceflinger可執行程式,安裝到目標系統/system/bin/surfaceflinger, 該程式會初始化surfaceflinger,surfaceflinger::inistantiate(),該程式會鏈接到libsurfaceflinger.so /framework/base/cmds/svc /framework/base/cmds/system_server system server庫libsystem_server.so->system/lib/libsystem_server.so和system_server可執行程式->system/bin/system_server. 該可執行程式不清楚什么用途???? /framework/core/ /framework/core/config 幾個簡單java常量,(debug標志等) /framework/core/java/* framewor k的核心,此處主要指application framework,java庫形式分發到/system/framework/ 包括framework.jar,framework-tests.jar sure??? /framework/core/jni framework所需的JNI接口實現庫,分發到/system/lib/lib/libandroid_runtime.so /framework/core/res framework所需的資源文件打包,/system/framework/framework-res.apk, /framework/libs /framework/libs/audioflinger, 生成libaudioflinger.so, 若無實際硬件和靜態庫libaudiointerface.a(audio interface虛擬設備)鏈接。 若有實際硬件和libaudio.so鏈接,若支持bluetooth,則和liba2dp.so鏈接 /framework/libs/surfaceflinger 生成libsurfaceflinger.so /framework/libs/ui 生成libui.so /framework/libs/utils 生成libutils.so /framework/services/java/* system server java可執行程式service.jar,分發到/system/framework/service.jar /framework/services/jni/* system server JNI接口實現庫,libanroid_servers.so,分發到/system/lib/libanroid_servers.so
啟動 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啟動完成。
|