Android 啟動(dòng)到繪制迫摔,事件下發(fā)的源碼閱讀

目錄

  • 代碼流程
  • 參考鏈接
  • 延展閱讀

代碼流程

用戶點(diǎn)擊了桌面上的某個(gè)app圖標(biāo),
從Launcher開(kāi)始(Launcher也是一個(gè)app)

  • Launcher.startShortcutOrInfoActivity(View)

    它這里的形參view逝淹,通過(guò)view.tag 拿到intent信息

  • Launcher.startActivitySafely(View, Intent, Object)

    可以認(rèn)為是個(gè)包裝方法

  • Launcher.startActivity(View, Intent, Object)

    這里處理用戶信息(看是游客還是管理員身份),最終把傳遞進(jìn)來(lái)的intent加上FLAG_NEW_TASK

  • Launcher.startActivityForResult

    從點(diǎn)擊桌面啟動(dòng)器的按鈕開(kāi)始缓待,到最終把意圖傳遞出去,到這里就是Launcher的作用了渠牲。

  • Instrument.execStartActivity

    可能會(huì)問(wèn)Instrumentation類的作用旋炒,ActivityThread對(duì)Activity生命周期的調(diào)用具體通過(guò)這個(gè)類實(shí)現(xiàn)

  • ActivityManageProxy.startActivity

    Instrument類去調(diào)用AMS(AMP是AMS的代理類,真正的實(shí)現(xiàn)類)

    這里完成了Launcher點(diǎn)擊啟動(dòng)的應(yīng)用的動(dòng)畫(huà)(通過(guò)WMS實(shí)現(xiàn)签杈,不重要)瘫镇,完成了信息的保存

  • 這里全部都是AMS,WMS答姥,Instrument铣除,binder的交互,可以發(fā)散問(wèn) binder跨進(jìn)程通信的原理

  • AMS.startProcessLocked-----這里是Process創(chuàng)建新進(jìn)程鹦付,由Zygote.fork出一個(gè)新進(jìn)程

  • Zygote.fork新進(jìn)程成功后尚粘,會(huì)反射invokeActivityThread的main方法,也就是整個(gè)程序的入口函數(shù)

附app啟動(dòng)的部分代碼調(diào)用棧(源碼來(lái)自API 28)
···
Process::start
ZygoteProcess::start
ZygoteProcess::startViaZygote
ZygoteProcess::openZygoteSocketIfNeeded
--ZygoteState::connect(ZygoteState是ZygoteProcess的靜態(tài)內(nèi)部類)
--connect方法通過(guò)LocalSocket完成通信敲长,Zygote孵化一個(gè)新的進(jìn)程
ZygoteProcess::zygoteSendArgsAndGetResult(處理新進(jìn)程)

通信的接收方見(jiàn)zygoteSendArgsAndGetResult方法內(nèi)注釋 
SystemZygoteInit.readArgumentList()--可是我沒(méi)找到這個(gè)方法郎嫁,有誰(shuí)找到了告知一下,我找的是API 26的ZygoteInit類

ZygoteInit::main
--zygoteServer::registerServerSocketFromEnv
--內(nèi)部創(chuàng)建了一個(gè)LocalServerSokcet
···

以上部分是launcher和ams的交互,以下就是真正的app入口方法潘明,真正的起點(diǎn)

  • ActivityThread.main里最重要的方法就是新創(chuàng)建了一個(gè)looper并循環(huán)行剂,內(nèi)部的attach方法進(jìn)行所有的初始化功能

  • 首先進(jìn)行AMS.attachApplication

  • 通過(guò)AMS.bindApplication 進(jìn)程綁定到該application

    這里的AMS里起作用的thread實(shí)例實(shí)際是ActivityThreadProxy代理類

    最后發(fā)送一個(gè)H_BIND_APPLICATION的msg給handler,通知綁定完成

  • 接收到msg后

    • Instrument.onCreate
    • LoadApk.makeApplication
    • Instrument.newApplication
    • Application.attach
  • 至此完成Application的綁定和初始化

  • ContentProvider.OnCreate方法會(huì)先于Application.OnCreate钳降,后于Application.onAttach

  • 接著就是ActivityThread.scheduleLaunchActivity

    發(fā)送一個(gè)H_Launch_Activity的msg個(gè)handler

  • 接收到msg后厚宰,就開(kāi)始了Activity的啟動(dòng)流程
    http://www.reibang.com/p/a13e3a3259f3

  • ActivityThread.handleLauchActivity---封裝

  • ActivityThread.performLaunchActivity---重點(diǎn)干了以下三件事

  • 1.Instrument.newActivity

  • 2.Activity.attach這里完成了theme主題的設(shè)置,window的初始化遂填,windowManager的配置
    Activity铲觉、View、Window的理解一篇文章就夠了
    http://www.reibang.com/p/5297e307a688

  • 3.執(zhí)行activity的生命周期

  • Activity的onCreate方法里有setContentView吓坚,交給PhoneWindow.initDecorView,并解析xml布局
    Android應(yīng)用setContentView與LayoutInflater加載解析機(jī)制源碼分析
    https://blog.csdn.net/yanbober/article/details/45970721

  • Activity的onStart沒(méi)做啥事,此時(shí)已經(jīng)可見(jiàn)(只是看不見(jiàn)具體view)

  • Activity的onResume撵幽,把decor加到window里,并設(shè)置可見(jiàn)

  • 接著就是View的繪制相關(guān)知識(shí)了view繪制流程就看這個(gè)源碼分析
    http://www.reibang.com/p/28de1361590c

  • View的onMesure計(jì)算大小礁击,重點(diǎn)關(guān)注 父布局測(cè)量規(guī)格對(duì)子view的影響盐杂,exactly和at_most兩種測(cè)量模式對(duì)子view layoutParams的影響

  • View的OnLayout計(jì)算位置,setFrame拿左右頂?shù)姿膫€(gè)坐標(biāo)確定位置

  • View的繪制哆窿,依次畫(huà)背景drawBackground链烈,畫(huà)自己onDraw,畫(huà)孩子dispatchDraw挚躯,畫(huà)裝飾onDrawScroll

  • View的事件分發(fā)强衡,自上而下分發(fā) ,自下而上消費(fèi)
    view事件分發(fā)
    http://www.reibang.com/p/66a80ff0133b
    https://mp.weixin.qq.com/s/0HB719Iuz_BfGWCOIxC__A
    https://mp.weixin.qq.com/s/fBeeiTgWxn6xrnTe5jVqNQ

    • dispatchTouchEvent默認(rèn)分發(fā)码荔,true不分發(fā)
    • onInterceptTouchEvent漩勤,只有viewGroup有感挥,true攔截
    • onTouchEvent,消費(fèi)事件越败,true消費(fèi)

參考鏈接

application啟動(dòng)流程
http://www.reibang.com/p/6885b4558ba2

https://mp.weixin.qq.com/s/6tEBj9b-Uuw7vT39infiAA

延展閱讀

垂直同步16ms的問(wèn)題
http://www.reibang.com/p/02800806356c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末触幼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眉尸,更是在濱河造成了極大的恐慌域蜗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噪猾,死亡現(xiàn)場(chǎng)離奇詭異霉祸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)袱蜡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)丝蹭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坪蚁,你說(shuō)我怎么就攤上這事奔穿。” “怎么了敏晤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贱田,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嘴脾,道長(zhǎng)男摧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任译打,我火速辦了婚禮耗拓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奏司。我一直安慰自己乔询,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布韵洋。 她就那樣靜靜地躺著竿刁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搪缨。 梳的紋絲不亂的頭發(fā)上食拜,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音勉吻,去河邊找鬼监婶。 笑死旅赢,一個(gè)胖子當(dāng)著我的面吹牛齿桃,可吹牛的內(nèi)容都是我干的惑惶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼短纵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼带污!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起香到,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鱼冀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悠就,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體千绪,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年梗脾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荸型。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炸茧,死狀恐怖瑞妇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梭冠,我是刑警寧澤辕狰,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站控漠,受9級(jí)特大地震影響蔓倍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜润脸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一柬脸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毙驯,春花似錦倒堕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铭段,卻和暖如春骤宣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背序愚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工憔披, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓芬膝,卻偏偏與公主長(zhǎng)得像望门,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锰霜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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