1、Android系統啓動java
Android框架架構圖:(來自網上,我以爲這張圖看起來很清晰)android
Linux內核啓動以後就到Android Init進程,進而啓動Android相關的服務和應用。啓動的過程以下圖所示:(圖片來自網上,後面有地址)c++
Android系統整個過程以下:數據結構
(一) Init進程的啓動架構
init進程,它是一個由內核啓動的用戶級進程。內核自行啓動(已經被載入內存,開始運行,並已初始化全部的設備驅動程序和數據結構等)以後,就經過啓動一個用戶級程序init的方式,完成引導進程。init始終是第一個進程。app
啓動過程就是代碼init.c中main函數執行過程:system\core\init\init.c框架
在函數中執行了:文件夾創建,掛載,rc文件解析,屬性設置,啓動服務,執行動做,socket監聽……socket
(二) ServiceManager啓動函數
在.rc腳本文件中zygote的描述:oop
service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm
ServiceManager用來管理系統中全部的binder service,無論是本地的c++實現的仍是java語言實現的都須要
這個進程來統一管理,最主要的管理就是,註冊添加服務,獲取服務。全部的Service使用前都必須先在servicemanager中進行註冊。
do_find_service( )
do_add_service( )
svcmgr_handler( )
代碼位置:frameworks\base\cmds\servicemanager\Service_manager.c
(三) Zygote進程的啓動
Zygote這個進程是很是重要的一個進程,Zygote進程的創建是真正的Android運行空間,初始化創建的Service都是Navtive service.
(1) 在.rc腳本文件中zygote的描述:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd 參數:--zygote --start-system-server
代碼位置:frameworks/base/cmds/app_process/app_main.cpp
上面的參數在這裏就會用上,決定是否要啓動和啓動那些進程。
int main( ){ AppRuntime runtime; if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : ""); } } class AppRuntime : public AndroidRuntime{};
(2) 接着到了AndroidRuntime類中:
frameworks\base\core\jni\AndroidRuntime.cpp
void start(const char* className, const char* options){ // start the virtual machine Java在虛擬機中運行的 JNIEnv* env; if (startVm(&mJavaVM, &env) != 0) { return; } //向剛剛新建的虛擬機註冊JNI本地接口 if (startReg(env) < 0) { return; } // jni 調用 java 方法,獲取對應類的靜態main方法 jmethodID startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V"); // jni調用 java方法,調用到ZygoteInit類的main函數 jclass startClass = env->FindClass(className); env->CallStaticVoidMethod(startClass, startMeth, strArray); }
到了ZygoteInit.java中的靜態main函數中,從C++ ——》JAVA
(3)ZygoteInit
真正Zygote進程:
frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
public static void main(String argv[]) { //Registers a server socket for zygote command connections registerZygoteSocket(); //Loads and initializes commonly used classes and //used resources that can be shared across processes preload(); // Do an initial gc to clean up after startup gc(); if (argv[1].equals("start-system-server")) { startSystemServer(); } /** * Runs the zygote process's select loop. Accepts new connections as * they happen, and reads commands from connections one spawn-request's * worth at a time. */ runSelectLoopMode(); //loop中 /** * Close and clean up zygote sockets. Called on shutdown and on the * child's exit path. */ closeServerSocket(); }
Zygote就創建好了,利用Socket通信,接收請求,Fork應用程序進程,進入Zygote進程服務框架中。
(四) SystemServer啓動
(五) Home界面啓動
2、Activity啓動
最近學習Android相關知識,感受僅僅瞭解Activity幾個生命週期函數基本上沒有任何意義的;
因而想深刻了解一下Activity究竟是怎麼一回事怎麼運行來的;裏面的東東真是叫個龐大;
如今只能簡單的瞭解其框架性的概念和流程;
Android的核心不是Application而是Activity,至少在咱們開發的時候是這樣的;
Activity就是被用來進行與用戶交互和用來與android內部特性交互的組件,
在應用程序中用到的全部activity都須要在manifest.xml文件中進行註冊;
那麼Activity又是怎樣一種組件,怎麼樣進行顯示交互的,一個activity實例是如何被管理和運行起來的,activity生命週期又是怎麼一回事。
Activity管理的核心是AcitivityManagerService,是一個獨立的進程;
ActiveThread是每個應用程序所在進程的主線程,循環的消息處理;
ActiveThread與AcitivityManagerService的通訊是屬於進程間通訊,使用binder機制;
以啓動一個應用程序startActivity爲例看一下代碼執行的大概流程:
可將其分爲6個過程:
1 使用代理模式啓動到ActivityManagerService中執行;
2 建立ActivityRecord到mHistory記錄中;
3 經過socket通訊到Zgote相關類建立process;
4 經過ApplicatonThread與ActivityManagerService創建通訊;
5 ActivityManagerService通知ActiveThread啓行;動Activity的建立;
6 ActivityThread建立Activity加入到mActivities中並開始調度Activity執
請看下圖:
並非全部啓動一個Activity都是這樣的過程:一個應用程序中全部Activity只有一個ActivityThread屬於一個Process;
ActivityStack並非每次都須要建立一個Stack來管理Activities;
下面看看adnroid系統中四個重要概念:
Application:由多個相關的鬆散的與用戶進行交互Activity組成,一般被打包成apk後綴文件中;
Activities:應用程序的主要組成部分,是應用程序的核心;
ActivityStack:將應用程序中打開的Activity保存在歷史棧中,按照棧的先進後出的原則;Start Activity時入棧,返回時出棧;
Task:將一系列相關的Activity組合,完成某個應用程序完整操做;無論activity屬於哪一個Application的;
例如:寫信息—調用—文件管理,都屬於一個Task,但屬於兩個Application;
轉載請註明:Android開發中文站 » 【Android高級】Android系統以及Activity啓動講解