Android Support Library 編譯過了!

到了2018年旭旭,作為Android開發(fā)者谎脯,倘若沒看過一些Android源碼源梭,都不好意思說自己是Android工程師了吧?

之前一直是在GrepCode(http://grepcode.com/)上看的稍味。這是一個(gè)相當(dāng)老牌的Android源碼在線查看網(wǎng)站。雖然上面缺少了近幾個(gè)新版本的Android 源碼烛愧,但勝在源碼種類多,除了Android验庙,還有其他軟件的源碼可以閱讀;易上手社牲,代碼之間能相互索引粪薛,查看方法引用、繼承關(guān)系搏恤、類的結(jié)構(gòu)和跳轉(zhuǎn)這些功能都很好用违寿,還能方便在切換同一個(gè)文件的不同版本的源碼。令人悲傷的是熟空,它已經(jīng)掛了好長一段時(shí)間了藤巢。: - (

另一個(gè)源碼閱讀網(wǎng)站AndroidXRef(http://androidxref.com/)也很老牌,但用的不多息罗。這個(gè)網(wǎng)站專注于Android源碼掂咒,從遠(yuǎn)古版本到最新版本都能在上面找到。功能夠用迈喉,可以查看方法應(yīng)用绍刮、類的結(jié)構(gòu)和跳轉(zhuǎn)這些。繼承關(guān)系挨摸、版本間跳轉(zhuǎn)這些就沒有孩革。目前還活著,只是受限于國內(nèi)的網(wǎng)絡(luò)環(huán)境得运,訪問起來有點(diǎn)慢膝蜈。

選擇在線的方式閱讀源碼,主要是嫌麻煩熔掺。一來是不經(jīng)潮ゲ看,主要是查疑難bug的時(shí)候看置逻;二來是不方便窍帝,Android 發(fā)展了十年,源碼相當(dāng)龐大,有十幾個(gè)G之多报慕,前幾年嘗試過clone眠冈,結(jié)果拉了幾天才拉完蜗顽;三來是編譯環(huán)境不好配雇盖,官方的源碼編譯說明看著不多,實(shí)際操作沒那么簡(jiǎn)單贸街,之前的嘗試都失敗了薛匪;最后則是這兩個(gè)在線查看代碼的網(wǎng)站都能滿足看代碼的需求逸尖,也沒編譯的需求娇跟,也就一直這么過來了逞频。

然而看源碼最舒服的方式莫過于直接用IDE(如Android Studio)苗胀,功能多瓦堵,用起來順手澜驮,而且還可以編輯杂穷。等等卦绣,編輯滤港?還想改代碼不成?并不是這樣滴著榴。架不住年紀(jì)大了脑又,一些看過的源碼慢慢的就遺忘了。俗話說好記性不如爛筆頭口叙,編輯的需求嗅战,也就是給源碼加注釋加批注罷了疟呐。如果僅僅是看代碼的話东且,Android Studio通過SDK Manager下載Source Code就可以了鲁冯。

需求變了色查,在線看源碼的法子,就行不通了跨扮。真是應(yīng)了那句話:天道好輪回衡创,蒼天繞過誰钧汹。不對(duì),應(yīng)該是躲得了初一躲不過十五隘竭,之前那些避開的麻煩动看,還是需要去面對(duì)的菱皆。

Clone Android Repository的全部源碼仇轻,這輩子肯定是不可能的祭椰。近期想看的是Support Library的源碼疲陕,所以我在程序員的網(wǎng)站GitHub上找到了AOSP-Mirror這個(gè)Organization携茂,clone了一份support library (https://github.com/aosp-mirror/platform_frameworks_support)的源碼讳苦。

拉代碼的過程挺順利医吊,用Android Studio打開卿堂,完了草描,Gradle沒法build過去穗慕。Build不通過就沒生成索引逛绵,沒索引就Android Studio就從IDE淪為普通編輯器,那些強(qiáng)大的功能全都用不上瓢对,還不如用understand胰苏。

好在法焰,在某個(gè)風(fēng)和日麗月黑風(fēng)高的晚上倔毙,借著天時(shí)地利人和普监,通過命令行運(yùn)行Gradle得到的錯(cuò)誤輸出毙玻,一點(diǎn)點(diǎn)地改各類.gradle文件,最終把Gradle Sync這一步搞定了。后面又精簡(jiǎn)了一下改動(dòng)范圍胁澳,然后把這些改動(dòng),push到了自己fork的 platform_frameworks_support項(xiàng)目的buildable分支里胰丁。有需要的可以到這里(https://github.com/SR1s/platform_frameworks_support/tree/buildable)自取蒲祈。

改動(dòng)的地方不多幔嗦,涉及5個(gè)文件。改動(dòng)的內(nèi)容總結(jié)起來就是:

  1. 修改buildscript使用的maven庫汇恤,引入了jcenter和google這兩個(gè)公共的maven庫
  2. 修改 dependencies 使用的maven庫颜懊,引入了幾個(gè)公共的maven庫匠璧,去掉了源碼里指向android源碼工程里prebuilts文件夾的那幾個(gè)maven庫
  3. 去掉settings.gradle里配置的幾個(gè)module,一類是外部module,即代碼不在platform_frameworks_support里的module指黎;另一類是依賴的這些外部module的module,這幾個(gè)的代碼現(xiàn)在不關(guān)心,所以先挪去它們?cè)趕ettings里的配置(源碼還在)
  4. 修改gradle wrapper使用的gradle的下載地址磺芭,源碼里指向的是本地,也就是android源碼工程里防止prebuilts文件夾下的gradle的地址姻报,這里改成網(wǎng)上公共的gradle版本的地址。

涉及的5個(gè)文件如下:

  1. buildSrc/build.gradle
  2. buildSrc/init.gradle
  3. buildSrc/repos.gradle
  4. gradle/wrapper/gradle-wrapper.properties
  5. settings.gradle
  1. build.gradle
    給buildscript添加了jcenter和google這兩個(gè)maven庫。源碼里指向的是源碼中的prebuilts目錄,這個(gè)目錄不在這個(gè)repo里嚷掠,我去翻了翻,prebuilts目錄里東西非常多粟焊,也就是很大挎峦,拉下來不現(xiàn)實(shí)透典,另外自己一個(gè)個(gè)單獨(dú)下也不現(xiàn)實(shí),還是直接用jcenter這類公共maven庫方便。添加google的maven庫是因?yàn)間oogle現(xiàn)在把自家?guī)焱锓配霭保瑳]有發(fā)布在jcenter里了。(后面我試了下抡草,不加google的這個(gè)maven庫也是可以的)

  2. buildSrc/init.gradle
    這里改動(dòng)一個(gè)是注釋掉了enableDoclavaAndJDiff這個(gè)方法內(nèi)的實(shí)現(xiàn)代碼步悠,這個(gè)是給project添加jdiff和doclava這兩個(gè)依賴和配置,一個(gè)是diff工具,一個(gè)是文檔工具择卦,這兩個(gè)依賴都是android源碼里的其他工具的project泽铛,只是為了看代碼,用不著這兩個(gè)瓢喉,注釋掉也不影響盐杂。
    另一個(gè)就是去掉project.ext.androidJarprops.write這兩句厉斟,前者把a(bǔ)ndroidJar指向了prebuilts目錄內(nèi)的最新的android.jar擦秽,后者往local.properties文件里寫入配置码荔。前者去不去掉其實(shí)無所謂触幼,不影響,后面那個(gè)因?yàn)闀?huì)往local.properties寫入android.dir的路徑配置瘟栖,從而覆蓋掉ide內(nèi)設(shè)置的android.dir,那個(gè)配置指向的是當(dāng)前工程的父級(jí)目錄,正常情況下签餐,我們的sdk肯定不放哪里贱田,因而build就找不到相關(guān)的工具出錯(cuò)了蔬墩,所以要把這個(gè)寫入注釋掉乔询,用Android Studio設(shè)置里的那個(gè)就行了。

  3. buildSrc/repos.gradle
    這個(gè)文件定義了一堆本機(jī)上的依賴庫的地址搪缨,實(shí)際上就是android源碼里的prebuilts目錄內(nèi)的一些具體的目錄打月。地址都放在ext.repoNames這里悠就,然后通過下面addMavenRepositories方法荸型,給RepositoryHandler加上這些maven庫盹靴。牢記我們沒有prebuilts目錄,這些maven庫指向的地址自然也是無效的瑞妇。因此這里再加了一句ext.repoNames = []稿静,把列表重置成空列表,這樣后面加這些maven庫的代碼就無效了辕狰。
    另一個(gè)是要讓Repository能找到依賴改备。原來官方代碼是讓gradle去prebuilts下找,現(xiàn)在我們把這個(gè)配置去掉了蔓倍,依賴也就找不到了(不去掉也找不到啊哈哈)悬钳,那么就要跟之前對(duì)buildscript做的事情一樣,加上公共庫偶翅。剛好下面有個(gè)if語句默勾,在符合條件下,會(huì)給Repository加外部maven庫聚谁,所以就注釋掉if判斷母剥,讓內(nèi)部的代碼強(qiáng)制執(zhí)行,也就自然加上了外部maven庫,依賴就能被找到了环疼。

  4. gradle/wrapper/gradle-wrapper.properties
    這個(gè)很簡(jiǎn)單习霹,把wrapper依賴的gradle的下載的地址改成網(wǎng)絡(luò)上的,之前的配置指向的是android repo的tools目錄炫隶,再次的淋叶,我們沒有這個(gè)。所以等限,改成從網(wǎng)絡(luò)上可下載的地址:https://services.gradle.org/distributions/gradle-4.4-bin.zip

  5. settings.gradle
    這里做的事情簡(jiǎn)單概括起來就是:

  6. 去掉了項(xiàng)目里的support-emoji爸吮、support-emoji-bundledsupport-emoji-appcompat望门、support-emoji-demos這幾個(gè)module的定義形娇,原因是它們或直接或間接的依賴了另一個(gè)不屬于這個(gè)repo的noto-emoji-compatmodule,這塊代碼目前沒想著去看筹误,先不管桐早。

  7. 去掉不屬于這個(gè)repo的module的定義,分別是doclava厨剪、jdiff哄酝、noto-emoji-compat這三個(gè),他們的源碼都在Android大項(xiàng)目的源碼的external文件夾里祷膳,是在想引入這幾個(gè)的陶衅,可以去down下來,然后配置直晨。

相關(guān)的代碼變更都在這個(gè)commit(https://github.com/SR1s/platform_frameworks_support/commit/a23529ad2ca019624af9213daf2836e78ce579a2)里搀军,大家都是工程師,一看就懂勇皇。

終于可以好好看代碼了罩句,歐耶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敛摘,一起剝皮案震驚了整個(gè)濱河市门烂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兄淫,老刑警劉巖屯远,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捕虽,居然都是意外死亡氓润,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門薯鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖气,“玉大人挨措,你說我怎么就攤上這事”老” “怎么了浅役?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伶唯。 經(jīng)常有香客問我觉既,道長,這世上最難降的妖魔是什么乳幸? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任瞪讼,我火速辦了婚禮,結(jié)果婚禮上粹断,老公的妹妹穿的比我還像新娘符欠。我一直安慰自己,他們只是感情好瓶埋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布希柿。 她就那樣靜靜地躺著,像睡著了一般养筒。 火紅的嫁衣襯著肌膚如雪曾撤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天晕粪,我揣著相機(jī)與錄音挤悉,去河邊找鬼。 笑死巫湘,一個(gè)胖子當(dāng)著我的面吹牛尖啡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剩膘,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盆顾!你這毒婦竟也來了怠褐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤您宪,失蹤者是張志新(化名)和其女友劉穎奈懒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宪巨,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷杏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捏卓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极祸。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遥金,到底是詐尸還是另有隱情浴捆,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布稿械,位于F島的核電站选泻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏美莫。R本人自食惡果不足惜页眯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢呵。 院中可真熱鬧窝撵,春花似錦、人聲如沸述吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝌矛。三九已至道批,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間入撒,已是汗流浹背隆豹。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茅逮,地道東北人璃赡。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像献雅,于是被迫代替她去往敵國和親碉考。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355