簡體   English   中英

Android N Java 8功能(Jack編譯器)和Kotlin互操作

[英]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工具鏈

使用javackotlinc的當前工具鏈:
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提供了一些對我們來說非常重要的功能:

  • Retrolambda - 不需要。 傑克可以妥善處理羔羊
  • Proguard - 它現在被烘焙到Jack中,所以你仍然可以使用混淆和最小化

好處:

Jack支持Java編程語言1.7並集成了下面描述的其他功能。

  • Predexing

    生成JACK庫文件時,生成庫的.dex並將其存儲在.jack庫文件中作為pre-dex。 編譯時,JACK重用每個庫中的pre-dex。 所有庫都是預先設定的。

  • 增量編譯

    增量編譯意味着只重新編譯自上次編譯以來觸及的組件及其依賴項。 當更改僅限於一組有限的組件時,增量編譯可能比完全編譯快得多。

  • 重新包裝

    JACK使用jarjar配置文件進行重新打包。

  • Multidex支持

    由於dex文件限制為65K方法,因此必須將具有超過65K方法的應用程序拆分為多個dex文件。 (有關multidex的更多信息,請參閱“使用超過65K方法構建應用程序”。)

缺點:

  • Jack不支持轉換API - 沒有可以修改的中間Java字節碼,因此我在這里沒有提到的一些插件將停止工作
  • Jack目前不支持注釋處理,因此如果您嚴重依賴Dagger,AutoValue等庫,則在切換到Jack之前應該三思而后行。 編輯:正如Jake Wharton所指出的,Jack in N Preview有注釋處理支持,但它尚未通過Gradle公開。
  • 不支持在Java字節碼級別上運行的Lint檢測器。
  • Jacoco不受支持 - 好吧,我個人覺得Jacoco有問題(它並沒有真正顯示你想看的東西),所以可以完全沒有它
  • Dexguard - 目前不支持企業版的Proguard

更新(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生成的字節碼( 196084203531 ),但我們計划與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工具集。

來源: Android的Java 8語言功能支持的未來

我已經從Kotlin官方博客上發現了這篇博文: Kotlin的Android路線圖

在那里,你會發現一個部分告訴:

我們計划提高Android構建性能的下一步是提供與Android新Jack和Jill工具鏈的集成。 現在有一些問題阻止Jack正確處理Kotlin生成的字節碼( 196084203531 ),但我們計划與Google團隊合作解決問題或提供我們方面的解決方法。 完成此操作后,我們將能夠在增量編譯期間僅使用Jill轉換已更改的類文件,而不是每次都轉換所有類文件(這是舊Android工具中唯一可能的行為)。

所以@LukasBergstrom說,“堅持過去”不會有任何問題;-)

您還可以查看與此主題相關的Reddit討論: Kotlin與Jack和Jill的狀態如何?

快樂的編碼。

根據Kotlin博客 ,發布1.1-beta2新功能部分:

啟用Jack工具鏈時支持構建Android項目(jackOptions {true});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM