Android init 啓動過程分析2

執行action_list 中的命令:
從action_list 中取出 act->name 爲 early-init 的列表項,再調用 action_add_queue_tail(act)將其插入到
隊列 action_queue 尾部。drain_action_queue() 從action_list隊列中取出隊列項 ,然後執行act->commands
列表中的所有命令。
所以從  ./system/core/init/init.c mian()函數的程序片段:
action_for_each_trigger("early-init", action_add_queue_tail);
drain_action_queue();
action_for_each_trigger("init", action_add_queue_tail);
drain_action_queue();
action_for_each_trigger("early-boot", action_add_queue_tail);
action_for_each_trigger("boot", action_add_queue_tail);
drain_action_queue();
/* run all property triggers based on current state of the properties */
queue_all_property_triggers();
drain_action_queue();
可以看出,在解析完init.rc init.marvell.rc 文件後,action 命令執行順序爲:
執行act->name 爲 early-init,act->commands列表中的所有命令
執行act->name 爲 init,            act->commands列表中的所有命令
執行act->name 爲 early-boot,act->commands列表中的所有命令
執行act->name 爲 boot,            act->commands列表中的所有命令

關鍵的幾個命令:
class_start default   啓動所有service 關鍵字定義的服務。
class_start 在act->name爲boot的 act->commands列表中,所以當 class_start 被觸發後,實際
上調用的是函數 do_class_start()
int do_class_start(int nargs, char **args)
{
        /* Starting a class does not start services
         * which are explicitly disabled.  They must
         * be started individually.
         */
    service_for_each_class(args[1], service_start_if_not_disabled);
    return 0;
}
void service_for_each_class(const char *classname,
                            void (*func)(struct service *svc))
{
    struct listnode *node;
    struct service *svc;
    list_for_each(node, &service_list) {
        svc = node_to_item(node, struct service, slist);
        if (!strcmp(svc->classname, classname)) {
            func(svc);
        }
    }
}

因爲在調用 parse_service() 添加服務列表的時候,所有服務 svc->classname 默認取值:"default",
所以 service_list 中的所有服務將會被執行。

Zygote 服務概論:
Zygote 是android 系統中最重要的一個服務,它將一步一步完成下面的任務:
start Android Java Runtime and start system server. It’s the most important service. The source is in device/servers/app.
1. 創建JAVA 虛擬機
2. 爲JAVA 虛擬機註冊android 本地函數
3. 調用 com.android.internal.os.ZygoteInit 類中的main函數,android/com/android/internal/os/ZygoteInit.java.
a) 裝載ZygoteInit類
b) 註冊zygote socket
c) 裝載preload classes(the default file is device/java/android/preloaded-classes)
d) 裝載Load preload 資源
e) 調用 Zygote::forkSystemServer (定義在./dalvik/vm/InternalNative.c)來fork一個新的進程,在新進程中調用 com.android.server.SystemServer 的main函數。
a) 裝載 libandroid_servers.so庫
bb) 調用JNI native init1 函數 (device/libs/android_servers/com_android_server_SystemServers)
Load libandroid_servers.so
Call JNI native init1 function implemented in device/libs/android_servers/com_android_server_SystemServers. It only calls system_init implemented in device/servers/system/library/system_init.cpp.
If running on simulator, instantiate AudioFlinger, MediaPlayerService and CameraService here.
Call init2 function in JAVA class named com.android.server.SystemServer, whose source is in device/java/services/com/android/server. This function is very critical for Android because it start all of Android JAVA services.
If not running on simulator, call IPCThreadState::self()->joinThreadPool() to enter into service dispatcher.

SystemServer::init2 將會啓動一個新的線程來啓動下面的所有JAVA服務:
Core 服務:
1.  Starting Power Manager(電源管理)
2.  Creating Activity Manager(活動服務)
3.  Starting Telephony Registry(電話註冊服務)
4.  Starting Package Manager(包管理器)
5.  Set Activity Manager Service as System Process
6.  Starting Context Manager
7.  Starting System Context Providers
8.  Starting Battery Service(電池服務)
9.  Starting Alarm Manager(鬧鐘服務)
10. Starting Sensor Service
11. Starting Window Manager(啓動窗口管理器)
12. Starting Bluetooth Service(藍牙服務)
13. Starting Mount Service

其他services:
1.  Starting Status Bar Service(狀態服務)
2.  Starting Hardware Service(硬件服務)
3.  Starting NetStat Service(網絡狀態服務)
4.  Starting Connectivity Service
5.  Starting Notification Manager
6.  Starting DeviceStorageMonitor Service
7.  Starting Location Manager
8.  Starting Search Service(查詢服務)
9.  Starting Clipboard Service
10. Starting Checkin Service
11. Starting Wallpaper Service
12. Starting Audio Service
13. Starting HeadsetObserver
14. Starting AdbSettingsObserver

最後SystemServer::init2 將會調用 ActivityManagerService.systemReady 通過發送
Intent.CATEGORY_HOME intent來啓動第一個 activity.還有另外一種啓動system server的方法是:
通過名爲 system_server的程序(源代碼:device/servers/system/system_main.cpp)它也是通過
調用 system_init 來啓動 system services,這時候就有個問題:爲什麼android 有兩種方式啓動system services?
我的猜想是:
My guess is that directly start system_server may have synchronous problem with zygote because system_server will call JNI to start SystemServer::init2, while at that time zygote may not start JAVA VM yet. So Android uses another method. After zynote is initialized, fork a new process to start system services.


Zygote服務啓動的詳細過程:
通過啓動服務列表的 app_process 進程,實際上進入的是
App_main.cpp (frameworks\base\cmds\app_process)
main()
根據 init.rc 中的 --zygote --start-system-server
分別調用的是
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
或者
runtime.start();
start()函數在 AndroidRuntime.cpp (frameworks\base\core\jni)文件中
從打印信息:
D/AndroidRuntime(   56): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
也可以看出調用的是:
AndroidRuntime::start(const char* className, const bool startSystemServer)
  JNI_CreateJavaVM()
  startReg()
    LOGD("--- registering native functions ---\n");
  startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V");
  從上面的調用可以看出一類引用的過程都是從 main方法
所以接着調用了 ZygoteInit 類的main方法
main方法主要完成:
1.Register zygote socket, Registers a server socket for zygote command connections
2.Load preload classes(the default file is device/java/android/preloaded-classes).
3.Load preload resources, Load in commonly used resources, so they can be shared across processes.
4.Start SystemServer, Prepare the arguments and fork for the system server process.
具體執行過程如下:
ZygoteInit.java (frameworks\base\core\java\com\android\internal\os)中的mian
main()
  registerZygoteSocket()
  preloadClasses()
    loadLibrary()
      Log.i(TAG, "Preloading classes...");
    Runtime.loadLibrary
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章