Android系統以及Activity啓動講解

1、Android系統啓動java

Android框架架構圖:(來自網上,我以爲這張圖看起來很清晰)android

Linux內核啓動以後就到Android Init進程,進而啓動Android相關的服務和應用。啓動的過程以下圖所示:(圖片來自網上,後面有地址)c++

image

 

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究竟是怎麼一回事怎麼運行來的;裏面的東東真是叫個龐大;

如今只能簡單的瞭解其框架性的概念和流程;

一 Activity概念

Android的核心不是Application而是Activity,至少在咱們開發的時候是這樣的;

Activity就是被用來進行與用戶交互和用來與android內部特性交互的組件,

在應用程序中用到的全部activity都須要在manifest.xml文件中進行註冊;

那麼Activity又是怎樣一種組件,怎麼樣進行顯示交互的,一個activity實例是如何被管理和運行起來的,activity生命週期又是怎麼一回事。

二 Activity框架和管理結構

Activity管理的核心是AcitivityManagerService,是一個獨立的進程;

ActiveThread是每個應用程序所在進程的主線程,循環的消息處理;

ActiveThread與AcitivityManagerService的通訊是屬於進程間通訊,使用binder機制;

三 Activity啓動過程

以啓動一個應用程序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啓動講解

相關文章
相關標籤/搜索