Android-DataBinding-原理-編譯期

概述

  • DataBinding框架分為兩部分:編譯期和運(yùn)行時(shí);編譯期根據(jù)XML中聲明式的綁定表達(dá)式以及一系列注解自動(dòng)生成代碼ViewDataBinding類;運(yùn)行時(shí)通過(guò)特定方法(notifyPropertyChanged)對(duì)某些綁定表達(dá)式標(biāo)記臟數(shù)據(jù),下一幀根據(jù)dirtyFlag對(duì)View進(jìn)行更新;
  • 編譯期原理主要根據(jù)編譯產(chǎn)物或者中間產(chǎn)物其做,進(jìn)行反推冷守;運(yùn)行期原理根據(jù)源碼分析茂嗓;
  • 編譯期比較復(fù)雜尘惧,所以只是結(jié)合網(wǎng)上相關(guān)資料和編譯產(chǎn)物進(jìn)行反推惭适,大概了解編譯期做了哪些工作笙瑟;

網(wǎng)上相關(guān)資料

  • 之前在網(wǎng)上看到過(guò)一篇講述編譯期的簡(jiǎn)單介紹(http://www.reibang.com/p/eb29c691d370
    ),這里做個(gè)大概描述癞志,后面會(huì)根據(jù)DataBinding最新版本的編譯產(chǎn)物進(jìn)行一些驗(yàn)證往枷;
  • ANDROID_DataBinding_Compiler.png
  • 白色部分為輸入;黃色部分為編譯器處理類凄杯;藍(lán)色部分為中間產(chǎn)物错洁;綠色部分為最終產(chǎn)物;
    • 白色
      • res/layout和代碼中的注解戒突;
    • 黃色
      • aapt編譯時(shí)處理:MakeCopy.java屯碴;
      • gradle-api處理:DataBinderPlugin.java;
      • AbstractProcessor處理:ProcessDataBinding.java膊存;
    • 藍(lán)色
      • data-binding-info文件夾:包含layout中的變量导而,綁定表達(dá)式相關(guān)信息忱叭;
      • setter_store.bin:包含所有setter相關(guān)信息;
      • layoutinfo.bin:包含所有l(wèi)ayout相關(guān)信息今艺;br.bin:包含所有BR相關(guān)信息韵丑;
    • 綠色
      • data-binding-layout-out:保存layout中view相關(guān)信息;
      • DataBindingInfo.class:一個(gè)看似空的類虚缎,但在SOURCE階段包含了一個(gè)@BindingBuildInfo注解撵彻,包含了基本DataBinding的基本信息;
      • DataBindingComponent.class:會(huì)根據(jù)自定義的DataBindingComponent自動(dòng)生成對(duì)應(yīng)實(shí)例化方法遥巴;
      • ViewDataBinding.class的子類千康;
      • BR.class;
      • DataBindingMapper.class:用于尋找某個(gè)layout.xml對(duì)應(yīng)的ViewDataBinding類铲掐;
  • 流程
    • 資源處理
      • aapt/gradle-api階段拾弃,都會(huì)觸發(fā)資源處理,DataBinding都會(huì)掃描一遍現(xiàn)有的資源摆霉,生成不包含<layout>的data-binding-layout-out以及DataBinding所需要的data-binding-info豪椿;
    • 生成DataBindingInfo.class
      • 資源處理后,aapt/gradle-api都會(huì)去生成DataBindingInfo.class携栋,把相關(guān)的信息寫入DataBindingInfo.class的@BindingBuildInfo注解中搭盾;
    • 監(jiān)聽到注解變化
      • 生成@BindingBuildInfo注解,或者code中發(fā)現(xiàn)有新的注解寫入婉支,AbstractProcessor注解處理器就開始執(zhí)行注解處理鸯隅;DataBinding中有一個(gè)ProcessDataBinding.java類專門來(lái)處理DataBinding相關(guān)的注解;
    • ProcessDataBinding處理注解向挖,生成bin
      • ProcessDataBinding中處理注解永遠(yuǎn)會(huì)按順執(zhí)行3步蝌以,ProcessMethodAdapter,ProcessExpressions何之,ProcessBindable跟畅。每次執(zhí)行都會(huì)從磁盤反序列化對(duì)應(yīng)的bin文件,然后往bin中寫入新的溶推,完成后再序列化到磁盤徊件;
    • 生成最終產(chǎn)物
      • 執(zhí)行ProcessMethodAdapter生成DataBindingComponents.class;執(zhí)行ProcessExpressions生成ViewDataBinding.class子類(ActivityDetail2Binding.class)蒜危,并觸發(fā)DataBindingMapper.class更新虱痕;執(zhí)行ProcessBindable生成BR.class,并觸發(fā)DataBindingMapper.class更新辐赞;

驗(yàn)證

  • gradle版本使用的是 com.android.tools.build:gradle:3.5.3部翘;
  • 中間產(chǎn)物
    • ./build/intermediates/data-binding/debug/bundle-bin目錄
      • 包含兩個(gè)文件:module-br.bin和module-setter_store.json;
      • 第一個(gè)文件應(yīng)該是用來(lái)生成該module對(duì)應(yīng)的br文件占拍;第二個(gè)文件記錄了該module中所有綁定注解的相關(guān)信息(比如略就,BindingAdapter關(guān)聯(lián)的屬性名捎迫,View類型,參數(shù)類型表牢,以及該方法所屬的類)窄绒;
    • ./build/intermediates/data_binding_dependency_artifacts/debug/dataBindingMergeDependencyArtifactsDebug/out目錄
      • 包含兩類文件module-br.bin和module-setter_store.json;文件內(nèi)容同上崔兴;
    • ./build/intermediates/data_binding_base_class_log_artifact/debug/dataBindingGenBaseClassesDebug/out目錄
      • 包含一個(gè)文件module-binding_classes.json彰导;包含從XML名稱到ViewDataBinding類的映射關(guān)系(包括XML中變量類型);
    • ./build/intermediates/data_binding_base_class_log_dependency_artifacts/debug/out目錄
      • 包含依賴module敲茄,依賴庫(kù)的binding_class.json文件位谋,文件內(nèi)容同上;
    • ./build/intermediates/data_binding_layout_info_type_merge/debug/mergeDebugResources/out目錄
      • 包含了XML中變量部分以及綁定表達(dá)式信息堰燎,不包含View信息掏父;
  • 最終產(chǎn)物
    • BR文件
      • 包含變量名和屬性名(@Bindable注解過(guò)的getter方法)對(duì)應(yīng)的ID;
    • Binding/BindingImp文件
      • XML文件對(duì)應(yīng)的綁定類秆剪,實(shí)現(xiàn)了運(yùn)行時(shí)自動(dòng)更新UI的邏輯赊淑;
    • DataBindingComponent文件
      • 如果BindingAdapter注解在實(shí)例方法上,會(huì)在該接口中生成獲取該實(shí)例的接口方法仅讽;
    • DataBinderMapperImpl文件
      • 包含了layout對(duì)應(yīng)的id到Binding類的映射陶缺,XML的rootView的tag到layout的id的映射,BR中的id到屬性名的映射洁灵;

總結(jié)

  • 網(wǎng)上資料和驗(yàn)證結(jié)合來(lái)看饱岸,整體流程沒什么變化,除了一些細(xì)小的差別(比如Binding類又多了BindingImp子類)徽千;
  • 流程
    • 開發(fā)階段:主要涉及兩部分苫费,XML(layout和data標(biāo)簽)和注解;
    • 資源處理:將XML拆分成兩部分:一部分為layout文件罐栈,最終打包到apk中的layout文件黍衙,和傳統(tǒng)寫法差不多泥畅,唯一不一樣的就是相關(guān)View的Tag會(huì)改成binding格式荠诬,這個(gè)是編譯期和運(yùn)行時(shí)的紐帶;另外一部分是layout-info文件位仁,包括變量和綁定表達(dá)式相關(guān)信息柑贞;
    • 注解處理:先處理綁定注解(除Bindable)生成setter_store.json文件;再根據(jù)layout-info文件和setter_store.json文件處理綁定表達(dá)式聂抢,生成Binding/DataBindingComponent文件钧嘶;再處理Bindable注解,生成BR文件琳疏;再生成BindingImp文件(這個(gè)是個(gè)人猜測(cè)有决,因?yàn)锽indingImp的邏輯是要根據(jù)BR值生成dirtyFlag)闸拿;再生成DataBinderMapperImpl文件;

存疑

  • DataBindingInfo文件及BindingBuildInfo注解有什么用书幕?
  • DataBindingComponent不建議使用新荤,在實(shí)例方法上注解BindingAdapter,還不如直接在對(duì)應(yīng)的Activity中對(duì)可觀察數(shù)據(jù)源掛監(jiān)聽做特殊邏輯台汇;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苛骨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苟呐,更是在濱河造成了極大的恐慌痒芝,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牵素,死亡現(xiàn)場(chǎng)離奇詭異严衬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笆呆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞳步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腰奋,你說(shuō)我怎么就攤上這事单起。” “怎么了劣坊?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嘀倒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我局冰,道長(zhǎng)测蘑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任康二,我火速辦了婚禮碳胳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沫勿。我一直安慰自己挨约,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布产雹。 她就那樣靜靜地躺著诫惭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔓挖。 梳的紋絲不亂的頭發(fā)上夕土,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瘟判,去河邊找鬼怨绣。 笑死角溃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篮撑。 我是一名探鬼主播开镣,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咽扇!你這毒婦竟也來(lái)了邪财?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤质欲,失蹤者是張志新(化名)和其女友劉穎树埠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘶伟,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎憋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了九昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊袋。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铸鹰,靈堂內(nèi)的尸體忽然破棺而出癌别,到底是詐尸還是另有隱情,我是刑警寧澤蹋笼,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布展姐,位于F島的核電站,受9級(jí)特大地震影響剖毯,放射性物質(zhì)發(fā)生泄漏圾笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一逊谋、第九天 我趴在偏房一處隱蔽的房頂上張望擂达。 院中可真熱鬧,春花似錦胶滋、人聲如沸板鬓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穗熬。三九已至镀迂,卻和暖如春丁溅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探遵。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工窟赏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妓柜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓涯穷,卻偏偏與公主長(zhǎng)得像棍掐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拷况,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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