| 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可執行程式 ,IMEIME 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啟動完成。
|