android jni fork()子进程不运行_安卓系统最重要的进程之一:system_server详细分析...
1 概述
SystemServer是android系統(tǒng)的系統(tǒng)服務(wù)進程。屬于系統(tǒng)級別,其它服務(wù)進程都是應(yīng)用級別。它也是android系統(tǒng)的唯一一個系統(tǒng)服務(wù)進程。
SystemServer進程的名字是system_server,由父進程zygote fork()而來。可以通過ps查看system_server的PPID(Parent Process ID)剛好是zygote進程的PID(Process ID)。
SystemServer進程里面主要有三塊內(nèi)容:android_servers、framework資源、各種系統(tǒng)服務(wù)。
1)android_servers是指動態(tài)鏈接庫libandroid_servers.so。android_servers是JNI層。源碼位于frameworks/base/services/core/jni/路徑下。是服務(wù)的JAVA端和C端銜接的地方。
2)framework資源,創(chuàng)建上下文的時候,會加載framework-res.apk。framework-res.apk是一個資源型APK,只有資源,沒有邏輯。源碼位于frameworks/base/core/res/。最后生成到system/framework/framework-res.apk。
3)各種系統(tǒng)服務(wù),android的系統(tǒng)服務(wù)非常多,有上百個。其中關(guān)鍵服務(wù)ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService等。源碼位于frameworks/base/services/core/java/路徑下。
2 system_server前置啟動過程
system_server進程是在zygote進程啟動的時候,由zygote進程fork而來。
frameworks/base/cmds/app_process/app_main.cpp
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
至此,粗略的回顧了一下,需要詳細信息的請參見前面的文章。下面進入system_server進程的實際邏輯。
3 system_server啟動過程
主流程代碼位于下面的路徑。直接去看入口函數(shù)main()。
frameworks/base/services/java/com/android/server/Systemserver.java
創(chuàng)建匿名對象,然后調(diào)用run()方法。下面開始分析run()方法,run()方法就是system_server進程的主流程。
第一步檢查并設(shè)置系統(tǒng)時間。因為如果系統(tǒng)時間在1970年以前,很多Java API會崩潰。所以這里首先檢查系統(tǒng)時間,如果小于1970年,就設(shè)置系統(tǒng)時間為1970年。正常情況下,后面cell tower或NTP會糾正系統(tǒng)時間。
這里是系統(tǒng)語言和地區(qū)的檢查設(shè)置。
從虛擬機運行時取得虛擬機庫,設(shè)置屬性persist.sys.dalvik.vm.lib.2。
內(nèi)存設(shè)置。system_server作為核心進程,并且需要持續(xù)在后臺運行。清除內(nèi)存限制,提高效率。
檢查fingerprint屬性并設(shè)置。如果沒有預(yù)先設(shè)置fingerprint屬性,這里會根據(jù)下面的屬性生成一個fingerprint的值,然后設(shè)置。
提高binder calls的優(yōu)先級,是其為前臺優(yōu)先級。設(shè)置最大binder線程數(shù)為31個。
設(shè)置本線程優(yōu)先級為前臺優(yōu)先級,不允許設(shè)置優(yōu)先級為后臺。同時,創(chuàng)建主線程的Looper。
加載動態(tài)鏈接庫libandroid_servers.so。這個庫是系統(tǒng)服務(wù)和native進行交互的jni層生成的。
創(chuàng)建上下文context,并設(shè)置system_server進程的默認主題。
創(chuàng)建systemservicemanager,顧名思義,它是用來管理系統(tǒng)服務(wù)systemservice的。并把它添加到LocalService。在第四節(jié)詳細分析。
啟動系統(tǒng)服務(wù)。在第五節(jié)詳細分析。
進入消息循環(huán),Looper的無限循環(huán)。
消息循環(huán)異常退出的時候,會拋出這個異常,意味著system_server進程死掉了。
4 SystemServiceManager
管理系統(tǒng)服務(wù)的創(chuàng)建、啟動和生命周期事件。
這個類比較小,整個文件就250行。關(guān)鍵成員變量是mServices,是SystemService的列表,每個注冊的系統(tǒng)服務(wù),都會在這個列表里面存在instance。
SystemServiceManager是一個管理類Manager。使用列表ArrayList數(shù)據(jù)結(jié)構(gòu)來存儲系統(tǒng)服務(wù)的實例。
系統(tǒng)服務(wù)都會繼承基類SystemService,抽象類SystemService里面定義了系統(tǒng)服務(wù)的框架方法。
系統(tǒng)服務(wù)管理者SystemServiceManager會在系統(tǒng)啟動/運行的不同階段,調(diào)用系統(tǒng)服務(wù)們的不同方法。
5 各種系統(tǒng)服務(wù)
運行在system_server進程里面的系統(tǒng)服務(wù)分為三類:關(guān)鍵服務(wù)、核心服務(wù)、其它服務(wù)。
關(guān)鍵服務(wù):
已上都是binder service,還有一個local service 叫l(wèi)ight service。
核心服務(wù):
其他服務(wù):
這里的注解給人以遐想:開始處理一大堆尚未重構(gòu)和整理的東西。
這一階段啟動的服務(wù)非常多:振動器服務(wù)、掛載服務(wù)、網(wǎng)絡(luò)管理服務(wù)、網(wǎng)絡(luò)狀態(tài)服務(wù)、連接服務(wù)、網(wǎng)絡(luò)評分服務(wù)、nsd服務(wù)、窗口管理服務(wù)、串號服務(wù)、網(wǎng)絡(luò)時間更新服務(wù)、common time管理服務(wù)、輸入管理服務(wù)、TelephonyRegistry、ConsumerIsService、MmsServiceBroker、硬件屬性管理服務(wù)、SchedulingPolicyService、CameraService、賬戶管理服務(wù)、ContentService、鬧鐘服務(wù)、VR管理服務(wù)等等上百個服務(wù)。startOtherService()方法有1000多行。
總結(jié)
以上是生活随笔為你收集整理的android jni fork()子进程不运行_安卓系统最重要的进程之一:system_server详细分析...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当代的设计潮流是什么_12月,潮流咖的出
- 下一篇: mongodb 企业版_MongoDB