2016-08-20 45 views
6

幾年前,當第一次採用gradle for Android(在Gradle 2.0之前)時,我發現使用和取決於一個模塊會有一些開銷,所以我已經遠離將我的項目拆分爲更小的模塊,而是已經創建了非常大的模塊。在嘗試了一些其他構建系統(例如Buck)之後,通過將您的代碼拆分爲多個小模塊來獲得性能。 Kotlin等一些現代編程語言甚至具有專門構建的可見性修飾符,這些修飾符圍繞將代碼分解爲模塊的概念而構建。許多小模塊或少數大型模塊具有最佳構建性能?

我們目前在Gradle 2.14.1(差不多3.0),在過去的幾個版本中,他們引用了大量的性能提升。隨着Gradle/Android插件在過去幾年中的變化,它現在是否會生成更快的構建,以便將代碼拆分爲更小的模塊,或者使用更少的大型模塊?

+0

看到在整個構建過程主要是連續的,我不能完全肯定「揪」出來更小的模塊會比在其他項目中潛在的再利用有利於其他。 –

+0

構建過程可以並行。好處是,如果你改變了依賴關係底部的一段代碼,那麼其他模塊就不需要重建,而只需要把它們的輸出合併到最終的版本中。 – spierce7

+0

如果這些模塊不需要重建,那麼這似乎回答你的問題,不是嗎?這一過程將更快 –

回答

2

對於Gradle和Kotlin來說,在整體構建中編譯性能方面都有很大的提升。包括降低構建中多個模塊的開銷。

你可以看到這個最近的一篇文章中的這些增加一些例子:Kotlin vs. Java Compilation Speeds

多個模塊之間的開銷由模塊是量值的次序搖籃的配置步驟的組合減少得更快,並在內存中保存更多因此不必在每次編譯運行時重新加載,也不要編譯細粒度依賴性檢查認爲不需要重新編譯的內容。

這裏有提示:

  • 確保搖籃守護進程啓用(默認情況下,現在,所以,除非你把它關掉了,都好)
  • 升級到1.0.3科特林(並保持眼出來不久1.0.4版本)
  • 使incremental Kotlin compilation

    要啓用搖籃增量編譯,你需要將kotlin.incremental屬性設置爲true(例如,通過將線kotlin.incremental = TR ue到項目根目錄下的gradle.properties文件)。

  • 採用Android 2.1的工作室或更新,enable DEX in Process

    的Android 2.1工作室實現了新功能:敏捷在過程中,可以顯着提高全面清理的速度建立以及提高即時運行性能。

  • 確保任何任務,您使用支持增量運行在搖籃,有的沒有,可以減慢您的構建時間(例如Dokka任務運行,不管是什麼改變了),你可以禁用你不工作」 t需要所有的時間使用-x<task>參數到Gradle。

現在無論是多模塊構建還是單模塊構建都更快,我發現現在未改變的模塊的開銷可以忽略不計。而對於那些,編譯的正常成本。

由於Android plugin for Gradle changing the classpath ordering between builds由於Android plugin for Gradle changing the classpath ordering between builds,請注意增量編譯並不總是適用於Gradle中的Android構建。雖然這在構建之間往往是一致的,但如果它重新計算類路徑,它將會是一個不同的順序並導致新的完整構建。但是,無論您是單個或多個模塊構建,這都會成爲問題。

總體回答您的問題可能是整個項目的硬件,不同的配置,以及人們的觀念,甚至濫用,並建立的錯誤配置不同的根本。考慮到上述改進,您必須決定花時間測試您的實際項目的當前狀態 - 然後親自查看!

+0

我很感謝你的徹底和深思熟慮的答案! – spierce7