深入理解Android 卷1:init過程

1.引言

深入理解Android 卷1.第三章講解了Android系統(tǒng)的init過程绳军。我在學(xué)習(xí)這章的時(shí)候前前后后看了4遍。也看了很多很多博客。最后慢慢慢慢的理解了一點(diǎn),當(dāng)然對(duì)細(xì)節(jié)性代碼還是不懂扇单。只知道一個(gè)大概的流程。現(xiàn)在記錄下整個(gè)init過程奠旺。

2正題

2.1 init.rc 文件的介紹

init.rc很重要一定要搞懂蜘澜。詳細(xì)文章請(qǐng)參見這個(gè)大佬的http://www.reibang.com/p/d08e1affd5ec
Action的格式如下:

on <trgger> [&& <trigger>]*
   <command>
   <command>
   <command>
   ...

on 關(guān)鍵字 后面加觸發(fā)器响疚。中間的都是command命令:


image.png

init.rc 的部分文件鄙信。init.rc文件很有順序的:按照section執(zhí)行到先后順序排布的。其中重要的步驟是:

on-early init 
on init 
on late-init
on boot

為什么會(huì)提到這些稽寒。因?yàn)樵趇nit.cpp中會(huì)對(duì)這四個(gè)步驟扮碧。調(diào)用代碼進(jìn)行執(zhí)行。

2.2 解析init.rc的過程

init_parser.cpp文件:

image.png

當(dāng)遇到section的時(shí)候就會(huì)走case T_NEWLINE杏糙。 進(jìn)而執(zhí)行到parse_new_section();

parse_new_section()

image.png

我們來看下解析case k_on的情況:

分析parse_line_action

image.png

list_add_tail 是一個(gè)雙向鏈表慎王。都command都添加到list的尾部(tail)。之后依次執(zhí)行
on early-init ,init,late-init,boot宏侍,調(diào)用代碼 如下所示:

image.png

總結(jié)init.rc過程:
通過parse_new_section ->parse_line_action 最終將command都添加進(jìn)雙向列表赖淤。然后在init.cpp中依次執(zhí)行 以下section中的caommand 。

on early-init
init
late-init
boot

現(xiàn)在有一個(gè)問題:command是怎么去執(zhí)行的谅河?
答案: 每個(gè)command 都對(duì)應(yīng)一個(gè) 執(zhí)行函數(shù)咱旱。這樣知道了command 就了執(zhí)行函數(shù)。這個(gè)執(zhí)行函數(shù)在keywords.cpp 里面绷耍。

image.png

3.啟動(dòng)zygote線程

在on boot section 下面有一個(gè) class_start core 的命令吐限。根據(jù)keywords class_start 對(duì)應(yīng)的函數(shù)就是do_class_start().

image.png

service_start_if_not_disabled() 方法

image.png

這個(gè)service_start() 是在 init.cpp中的。這個(gè)方法通過條用 fork()方法 產(chǎn)生zygote方法褂始。


image.png

4 屬性服務(wù)器工作流程

屬性服務(wù)器也不是特別了解诸典,我就按照書上,博客上走一遍流程崎苗,加深影響狐粱。Android 6.0 和4.4的 代碼差別存在。好多4.4上提供的代碼參考胆数,6.0上都沒得肌蜻。

屬性服務(wù)就像window的注冊(cè)表采用key-value的形式保存數(shù)據(jù)。所以萬變不離其宗必尼,跟蹤代碼總會(huì)發(fā)現(xiàn)set(key,value)的字樣蒋搜。

按照init.cpp中對(duì)property_service流程進(jìn)行分析:

property_init() ----->start_property_service

property_init():

image.png

初始化屬性服務(wù),主要是初始化內(nèi)存區(qū)域,并且該內(nèi)存區(qū)域是內(nèi)存共享的豆挽。想來也對(duì)酸休,就像在Android中使用sh,肯定要?jiǎng)?chuàng)建一塊內(nèi)存區(qū)域祷杈,不然怎么去保存數(shù)據(jù)呢斑司?

start_property_service

image.png

create_socket創(chuàng)建了一個(gè)專門用來接收請(qǐng)求的socket。很顯然但汞,其他進(jìn)程是能通過ipc 與此socket進(jìn)行通信的宿刮。
該方法目的就是將handler_property_set_fd 與socket綁定起來。register_epoll_handler的方法在init.cpp
image.png

image.png

私蕾。

這樣當(dāng)socket接受到一個(gè)請(qǐng)求,handle_property_set_fd就負(fù)責(zé)處理請(qǐng)求:
handle_property_set_fd:找到這段代碼

image.png

property_set(key,value)最終調(diào)用 的是

image.png

注意是property_service中的 property_set()方法僵缺。

property_set_iml(name,value)就是對(duì)文件中的key.value進(jìn)行保存。


image.png

總結(jié):上述 屬性服務(wù)器算是啟動(dòng)完畢踩叭,工作流程如上所示磕潮。那么問題來了客戶端是怎么調(diào)用呢?

4.1 客戶端與屬性服務(wù)器通信

客戶端與服務(wù)器進(jìn)行交互是通過調(diào)用如下代碼:


image.png

_system_property_set(key,value) 代碼:


image.png

通過socket與屬性服務(wù)器接受的socket進(jìn)行連接容贝,發(fā)送消息自脯,接受端的socket收到之后就會(huì)執(zhí)行handler_proerty_set_fd().然后寫入到文件中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斤富,一起剝皮案震驚了整個(gè)濱河市膏潮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌满力,老刑警劉巖焕参,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異油额,居然都是意外死亡叠纷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門潦嘶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涩嚣,“玉大人,你說我怎么就攤上這事衬以』貉蓿” “怎么了校摩?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵看峻,是天一觀的道長。 經(jīng)常有香客問我衙吩,道長互妓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮冯勉,結(jié)果婚禮上澈蚌,老公的妹妹穿的比我還像新娘。我一直安慰自己灼狰,他們只是感情好宛瞄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著交胚,像睡著了一般份汗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝴簇,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天杯活,我揣著相機(jī)與錄音,去河邊找鬼熬词。 笑死旁钧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的互拾。 我是一名探鬼主播歪今,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颜矿!你這毒婦竟也來了彤委?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤或衡,失蹤者是張志新(化名)和其女友劉穎焦影,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封断,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斯辰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坡疼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彬呻。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柄瑰,靈堂內(nèi)的尸體忽然破棺而出闸氮,到底是詐尸還是另有隱情,我是刑警寧澤教沾,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布蒲跨,位于F島的核電站,受9級(jí)特大地震影響授翻,放射性物質(zhì)發(fā)生泄漏或悲。R本人自食惡果不足惜孙咪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巡语。 院中可真熱鬧翎蹈,春花似錦、人聲如沸男公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枢赔。三九已至逞力,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糠爬,已是汗流浹背寇荧。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留执隧,地道東北人揩抡。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像镀琉,于是被迫代替她去往敵國和親峦嗤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容