① 深入理解android:SystemServer進程的作用
看了一段時間關於SystemServer進程的博客,有點小理解,寫一篇關於SystemServer的小筆記,然後走一遍過程。
ZygoteInit通過startSystemServer方法fork了一個SS進程。這個進程有啥作用呢。
handlerSystemServerProcess()方法只要是以下三個方法:
其中 applicationInit() 很有意思很重要。該方法中有一個,invokeStaticMain方法通過反射調用main方法:
run方法最終通過反射調用SystemServer的main方法,作用是:
通過以上分析其實main方法的主要作用是:
1、調整系統時間
2、設置屬性persist.sys.dalvik.vm.lib.2的值為當前虛擬機的運行庫路徑
3、裝載libandroid_servers.so庫,初始化native層service
4、初始化系統Context
5、創建SystemServiceManager對象
6、調用startBootstrapServices(),startCoreServices(),startOtherServices()啟動所有的java服務
另外也可以看到為什麼說handler默認是主線程,以及android 應用本身就是基於handler/Looper/Message的
startBootstrapServices():啟動java層的各種服務。framwork層的服務。例如AMS
startCoreServices:啟動核心服務:
startOtherServices也與上面一樣啟動各種服務。
總結下:SystemServer進程最終會執行到SystemServer類中的main方法中,初始化各種伺服器,其中第一個初始化的就是ActivityManagerService。當我們點擊啟動app的時候。Zygote會對這個消息進行處理,最終執行到applicationInit。那麼是在哪裡調用方法啟動應用的呢?
② androidpersist保存文件
persist分區。androidpersist保存文件通常在恢復出廠設置以後都是在persist分區。安卓(Android)是一種基於Linux內核(不包含GNU組件)的自由及開放源代碼的操作系統。
③ 如何修改android系統默認時區
android平台,經常會遇到產品需要更改系統默認時區日期時間的問題。android更改時區相對比較容易實現,網上也有很多資料,直接設置一個屬性即可,例如設置上海東八區,persist.sys.timezone=Asia/Shanghai。但是如何實現更改默認系統時間呢?
在android中,Linux內核中、rtc時鍾,默認的起始日期都是1970年1月1日,那麼如何把默認日期指到2012-01-01呢?筆者在實踐中發現,在RTC驅動中可以很容易實現。在RTC驅動載入的時候,一般都有個probe函數需要先執行,因此在probe函數里下手最直接有效。RTC從1970-01-01開始,那當然很容易把默認值設置到2012-01-01,所需要設置的seconds也就是從1970-01-01所差的秒數,以秒為單位。因此,一旦讀出來的RTC值小於我們預想的值比如2012-01-01(1325402913)小,我們就把它設置到這個時間點。
seconds = rtc_read_time();
printk("init PMU/RTC time to %ld \n", seconds);
if(seconds <= 1325402913) {
seconds = 1325402913;/*2012-01-01*/
ret = rtc_set_time(seconds);
RTC_DBG("Init Set time: %ld, ret =0x%x\n", seconds, ret);
}
筆者通過結果顯示,在android平台上是可行的。要設置到哪天幾點幾分,只要算好具體1970-01-01 00:00差的秒數即可,簡單明了。這樣客戶、用戶使用起來更方便一些。