[英]Android N Java 8 features (Jack compiler) and Kotlin interop
更新3. KOTLIN 現在正在為ANDROID開發提供正式支持 。 通過GOOGLE。 YAAAAAAAAS!
更新2 : 從長遠來看 ,看起來JetBrains真的致力於支持Kotlin for Android 。 我是一個快樂的kotlin用戶:)。
更新 :來自JetBrains的Hadi Hariri 提到他們將發布有關此主題的一些信息 。 一旦他們這樣做,我會更新這篇文章。
===下一個被棄用的東西===
谷歌剛剛發布了即將推出的Android N的預覽版,其中包含一些有趣的功能,最值得注意的是部分Java 8語言支持 。 這是可能的,因為Google正在開發新的Jack工具鏈 。
使用javac或kotlinc的當前工具鏈:
javac ( .java
- > .class
) - > dx ( .class
- > .dex
)
kotlinc ( .kt
- > .class
) - > dx ( .class
- > .dex
)
新傑克工具鏈:
傑克 ( .java
- > .jack
- > .dex
)
我假設谷歌將推動傑克成為Android開發的默認工具鏈。 更新: Jack現已棄用 。 亞斯。
我的問題是,作為Android開發的kotlin用戶,這個新工具鏈將來會如何影響我? 我會“陷入困境”嗎?
免責聲明:我在傑克工作
這不會影響你。 Kotlin的編譯器生成Java 6字節碼,Jack / Jill可以很好地導入它。
@Pavel Dudka
傑克 - 是一個編譯器。 與javac類似,但它的確略有不同:
如您所見,Jack將Java源代碼直接編譯為Dex文件! 我們不再有中間* .class文件了,所以不需要dx工具!
可是等等! 如果我在項目中包含第三方庫(作為.class文件的集合)會怎樣?
這就是吉爾發揮作用的時候:
Jill可以處理類文件並將它們轉換為特殊的Jayce格式,可以用作Jack編譯器的輸入。
所以,現在讓我們暫時擱置一下,再想一想......我們上癮的所有酷插件會發生什么? 他們都需要.class文件,傑克編譯器不再有那些......
幸運的是,Jack提供了一些對我們來說非常重要的功能:
Jack支持Java編程語言1.7並集成了下面描述的其他功能。
Predexing
生成JACK庫文件時,生成庫的.dex並將其存儲在.jack庫文件中作為pre-dex。 編譯時,JACK重用每個庫中的pre-dex。 所有庫都是預先設定的。
增量編譯
增量編譯意味着只重新編譯自上次編譯以來觸及的組件及其依賴項。 當更改僅限於一組有限的組件時,增量編譯可能比完全編譯快得多。
重新包裝
JACK使用jarjar配置文件進行重新打包。
Multidex支持
由於dex文件限制為65K方法,因此必須將具有超過65K方法的應用程序拆分為多個dex文件。 (有關multidex的更多信息,請參閱“使用超過65K方法構建應用程序”。)
更新(03/16/2017)
幸運的是,傑克已經死了,所以它不會影響Kotlin的開發者。
如果傑克是未來,那么你將會被Kotlin困在過去。 目前,Jack不支持可以將非Java源代碼編譯為Dalvik字節碼的插件。 即使它確實如此,JetBrains也需要為Kotlin編譯器添加一個新的后端,這不是一項微不足道的任務。 所以你必須使用Killlin和Jill,這將是你現在使用的工具鏈非常相似的東西。
正如您在下圖中看到的那樣,即使不能明確關閉Jack,您仍然可以將項目轉換為庫項目以使用Jill。 應用程序項目將僅引用此庫項目。
我看到Kotlin如何與Jack一起工作的唯一方法就是在Kotlin編譯器中添加一個Java后端,即生成像Xtend這樣的Java代碼的后端。 在這種情況下,由Kotlin編譯器生成的代碼可以由Jack處理為任何其他Java代碼。
但目前我們並不確切知道傑克在發布時會支持什么。 也許某些事情會發生巨大變化,並且可以為Jack增加Kotlin支持。
谷歌不打算將傑克作為默認工具,但Jack and Jill
。
使用Jill將.class文件編譯為dex就可以了。 否則,你可以告訴jar / aar庫。
Jack或Jill是否會變慢仍然需要辯論。 Android團隊希望jack會比當前的構建過程更快,但現在情況並非如此
此外,Jack和Dex可以公開使用,沒有什么可以阻止kotlin團隊編寫從kotlin源代碼發出.jack或.dex文件的工具。
正如今天出現的博客文章( Kotlin的Android路線圖 )所述:
現在有一些問題阻止Jack正確處理Kotlin生成的字節碼( 196084和203531 ),但我們計划與Google團隊合作解決問題或提供我們方面的解決方法。 完成此操作后, 我們將能夠在增量編譯期間僅使用Jill轉換已更改的類文件 ,而不是每次都轉換所有類文件(這是舊Android工具中唯一可能的行為)。
所以Kotlin最終將支持Jack&Jill並從中獲益。
根據最新谷歌公告 -
我們決定直接在當前的javac和dx工具集中添加對Java 8語言功能的支持,並棄用Jack工具鏈。 有了這個新方向,依賴於Java類文件格式的現有工具和插件應該繼續工作。 展望未來,Android構建系統將本身支持Java 8語言功能。 我們的目標是在未來幾周內將其作為Android Studio的一部分推出,我們希望盡早與您分享此決定。
我們最初測試通過Jack工具鏈添加Java 8支持。 隨着時間的推移,當我們考慮注釋處理器,字節碼分析器和重寫器受到影響時,我們意識到切換到Jack的成本對於我們的社區來說太高了。 感謝您嘗試Jack工具鏈並給予我們很好的反饋。 您可以繼續使用Jack構建Java 8代碼,直到我們發布新的支持。 從傑克遷移應該很少或根本不需要工作。
所以我們不必擔心傑克工具鏈成為Android開發的默認工具鏈。 您可以繼續使用kotlin或使用普通的javac / dx工具集。
我已經從Kotlin官方博客上發現了這篇博文: Kotlin的Android路線圖
在那里,你會發現一個部分告訴:
我們計划提高Android構建性能的下一步是提供與Android新Jack和Jill工具鏈的集成。 現在有一些問題阻止Jack正確處理Kotlin生成的字節碼( 196084和203531 ),但我們計划與Google團隊合作解決問題或提供我們方面的解決方法。 完成此操作后,我們將能夠在增量編譯期間僅使用Jill轉換已更改的類文件,而不是每次都轉換所有類文件(這是舊Android工具中唯一可能的行為)。
所以@LukasBergstrom說,“堅持過去”不會有任何問題;-)
您還可以查看與此主題相關的Reddit
討論: Kotlin與Jack和Jill的狀態如何?
快樂的編碼。
根據Kotlin博客 ,發布1.1-beta2新功能部分:
啟用Jack工具鏈時支持構建Android項目(jackOptions {true});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.