Android編譯器Jack&Jill

在沒有jack以前,google一直使用的sun/oracle的java編譯器javac用作android的官方編譯器檐嚣。
javac是jdk中的java編譯器幕随,將java文件編譯成class文件,那么我們來看一下之前的Android的java文件是怎么一步一步變成可以在dalvik虛擬機(jī)中運(yùn)行的dex文件的。

簡介

2016 年 3 月 10 日囚戚, Google 向外界發(fā)布了 Android N 的預(yù)覽版,并宣布了 Android N 的Roadmap轧简,Android N 的最終版源代碼將于今年 8 或 9 月份釋出到 AOSP 項(xiàng)目驰坊。
在眾多的 Android N 新特性中,有一項(xiàng)新工具鏈的出現(xiàn)與 Android 生態(tài)圈的所有開發(fā)者息息相關(guān)哮独,即 Jack & Jill 編譯器的引入拳芙。

在依賴了 Sun/Oracle 的 Java 編譯器十年之后,Android 終于有了自己的 Java 編譯器皮璧。

本文試圖對(duì)市面上非常有限的資料進(jìn)行總結(jié)舟扎,向大家介紹 Jack & Jill 的緣起,工作方式和原理悴务。

Jack 是 Java Android Compiler Kit 的縮寫睹限,它可以將 Java 代碼直接編譯為 Dalvik 字節(jié)碼,并負(fù)責(zé) Minification, Obfuscation, Repackaging, Multidexing, Incremental compilation讯檐。它試圖取代 javac/dx/proguard/jarjar/multidex 庫等工具羡疗。

Jill 是 Jack Intermediate Library Linker 的縮寫别洪,它負(fù)責(zé) “Shielding JACK from Java byte code”叨恨;實(shí)際上輔助 Jack 對(duì).class 做預(yù)處理,生成.jack文件

Source

雖然 Google 是在宣布 Android N 預(yù)覽版時(shí)隆重介紹了Jack & Jill痒钝。但是,早在 2014 年 Google 就對(duì)外宣布了新編譯器 Jack 的存在[meet our new experimental toolchain](http://android-developers.blogspot.jp/2014/12/hello-world-meet-our-new-experimental.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/hsDu+(Android+Developers+Blog), 它的開發(fā)啟動(dòng)時(shí)間更是遠(yuǎn)遠(yuǎn)早于 2014 年痢毒。

  • 一家名叫 FlexyCore 的小公司基于 GCC toolchain 開發(fā)了 Android 平臺(tái)上的 AOT 編譯器送矩,被 Google 看中并于 2013 年被收購
  • FlexyCore team 基于 LLVM toolchain 開發(fā)了 ART,并成為 Android 5.0 之后的缺省 Java Runtime
  • FlexyCore team 基于 Eclipse ecj 編譯器開始開發(fā) Jack哪替,基于 ASM4 開發(fā) Jill益愈。 他們?cè)缭?2014 年 2 月就開始提交 Jill 的代碼了Jill initial commit; 3 月份開始提交 Jack的代碼Jack initial commit
  • 自 Android build-tools 21.1 開始,里面已經(jīng)內(nèi)置 jack.jar 和 jill.jar
  • Android Gradle plugin 自 0.14 開始支持 Jack & Jillinitial commit
  • 自 Android 6.0 開始蒸其,Jack & Jill 成為 AOSP 的官方編譯器, 也就是說所有的 Android 6.0 ROM 都是 Jack 編譯出來的link,也代表 Google 認(rèn)為 Jack 達(dá)到了一定的成熟度
  • 預(yù)計(jì)等 Android 7.0 正式發(fā)布時(shí)库快,Jack 可能會(huì)成為官方推薦的編譯器

原因

可能是

  • 提高編譯速度
  • 應(yīng)對(duì) Oracle 的法律訴訟
  • 將編譯器掌控權(quán)拿在自己手中摸袁,不再受制于 Oracle,可以做一些 Android only 的優(yōu)化

javac的編譯流程

簡單的說义屏,將 Java 代碼和依賴庫編譯為 dex 有兩個(gè)大的階段
javac (.java –> .class) –> dx (.class –> .dex)


image

javac 將 java 代碼編譯為 java bytecode, 以.class的形式存在; 以 jar 和 aar 形式存在的依賴庫靠汁,代碼在里面以一堆.class 的形式存在
Proguard 工具讀取 Proguard 配置,對(duì).class做 shrinking, obfuscation闽铐,輸出 Proguard mapping
dx 將多個(gè).class轉(zhuǎn)化為單一的 classes.dex ; 如果 dex 方法數(shù)超過 65k, 就生成 classes.dex, classes1.dex…classesN.dex

jack編譯流程

新的編譯過程只有一個(gè)階段了蝶怔,它完全拋棄了 javac, ProGuard, jarjar 等工具,一個(gè)工具搞定一切
Jack (.java –> .jack –> .dex)

image

image

各種依賴庫仍然以 jar/aar 的形式存在
輔助工具 Jill 將根據(jù)依賴庫中的.class生成 Jayce 格式的 IL兄墅,并調(diào)用 Jack 做 pre-dex 并生成.jack踢星,此過程只在編譯 app 時(shí)發(fā)生一次
Jack 將 java 源代碼也編譯為.jack,然后將多個(gè).jack轉(zhuǎn)化為單一的.dex; 如果 dex 方法數(shù)超過 65k, 就生成 classes.dex, classes1.dex…classesN.dex
pre-dex 的詳細(xì)解釋可以參閱此鏈接new-build-system

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隙咸,一起剝皮案震驚了整個(gè)濱河市沐悦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌五督,老刑警劉巖藏否,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異充包,居然都是意外死亡副签,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門基矮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淆储,“玉大人,你說我怎么就攤上這事愈捅《艨迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蓝谨,是天一觀的道長灌具。 經(jīng)常有香客問我,道長譬巫,這世上最難降的妖魔是什么咖楣? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮芦昔,結(jié)果婚禮上诱贿,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好珠十,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布料扰。 她就那樣靜靜地躺著,像睡著了一般焙蹭。 火紅的嫁衣襯著肌膚如雪晒杈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天孔厉,我揣著相機(jī)與錄音拯钻,去河邊找鬼。 笑死撰豺,一個(gè)胖子當(dāng)著我的面吹牛粪般,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播污桦,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亩歹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寡润?” 一聲冷哼從身側(cè)響起捆憎,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梭纹,沒想到半個(gè)月后躲惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年础拨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍载。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诡宗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出击儡,到底是詐尸還是另有隱情塔沃,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布阳谍,位于F島的核電站蛀柴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矫夯。R本人自食惡果不足惜鸽疾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望训貌。 院中可真熱鬧制肮,春花似錦冒窍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儒飒,卻和暖如春意乓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背约素。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笆凌,地道東北人圣猎。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像乞而,于是被迫代替她去往敵國和親送悔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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