Android Gradle 外掛程式 3.6.0 版 (2020 年 2 月)

這個版本的 Android 外掛程式須使用下列項目:

最低版本 預設版本 附註
Gradle 5.6.4 5.6.4 詳情請參閱「更新 Gradle」一節。
SDK 版本工具 28.0.3 28.0.3 安裝設定 SDK 版本工具。

新功能

此版本的 Android Gradle 外掛程式內附以下新功能。

檢視區塊繫結

參照程式碼中的檢視區塊時,檢視區塊繫結可提供安全的編譯時間。您現在可以將 findViewById() 替換為自動產生的繫結類別參照了。如要開始使用檢視區塊繫結,請在所有模組的 build.gradle 檔案中加入以下內容:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

詳情請參閱檢視區塊繫結說明文件

支援 Maven Publish 外掛程式

Android Gradle 外掛程式提供對 Maven Publish Gradle 外掛程式的支援功能,因此您可以將建構構件發布至 Apache Maven 存放區。Android Gradle 外掛程式會為應用程式或程式庫模組中的每個建構變數構件建立元件,方便您用來自訂 Maven 存放區的發布內容

如要瞭解詳情,請參閱使用 Maven Publish 外掛程式的相關說明。

全新的預設封裝工具

建構應用程式的偵錯版本時,外掛程式會使用名為「zipflinger」的新封裝工具來建構 APK。這個新工具應該可以提升建構速度。如果這項新封裝工具的運作情形不如預期,請回報錯誤。如要改回使用舊版封裝工具,可以在 gradle.properties 檔案中加入以下內容:

        android.useNewApkCreator=false
      

原生建構歸因

您現在可以判斷 Clang 建構及連結專案中每個 C/C++ 檔案所需的時間。Gradle 可以輸出 Chrome 追蹤記錄,當中包含這些編譯器事件的時間戳記,可讓您進一步瞭解建構專案所需的時間。如要輸出這個建構歸因檔案,請按照下列方式操作:

  1. 在執行 Gradle 建構作業時加入 -Pandroid.enableProfileJson=true 標記。例如:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. 開啟 Chrome 瀏覽器,然後在搜尋列中輸入 chrome://tracing

  3. 按一下「Load」按鈕,然後前往 <var>project-root</var>/build/android-profile 尋找檔案,檔案名稱為 profile-<var>timestamp</var>.json.gz

檢視器的頂端附近會顯示原生建構歸因資料,如下所示:

Chrome 內的原生建構歸因追蹤記錄

行為變更

使用這個版本的外掛程式時,您可能會遇到下列行為異動。

預設以未壓縮方式封裝原生資料庫

建構應用程式時,外掛程式現在預設會將 extractNativeLibs 設為 "false"。這表示原生資料庫會對齊頁面,並以未壓縮的方式封裝。儘管這樣會導致上傳大小較大,但您的使用者可以享有下列好處:

  • 由於平台可以直接透過安裝的 APK 存取原生資料庫,無須建立資料庫副本,因此能縮減應用程式安裝大小。
  • 由於 Play 商店的壓縮方式,通常會在 APK 或 Android App Bundle 內含未壓縮原生資料庫的情況下效果較佳,因此能縮減下載大小。

如果想讓 Android Gradle 外掛程式改為封裝經過壓縮的原生資料庫,請在應用程式的資訊清單中加入以下內容:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

注意:extractNativeLibs 資訊清單屬性已由 useLegacyPackaging DSL 選項取代。詳情請參閱版本資訊的使用 DSL 封裝壓縮的原生資料庫相關說明。

預設 NDK 版本

現在如果您下載了多個 NDK 版本,則 Android Gradle 外掛程式會選取在編譯原始碼檔案時要用的預設版本。外掛程式以往會選用最新下載的 NDK 版本。您可以使用模組 build.gradle 檔案中 android.ndkVersion 屬性,覆寫外掛程式選取的預設版本。

簡化 R 類別產生作業

Android Gradle 外掛程式簡化了編譯類別路徑,方法是只為專案的每個程式庫模組產生一個 R 類別,並與其他模組依附元件共用這些 R 類別。這項最佳化功能應該可以提升建構速度,但您必須留意以下事項:

  • 由於編譯器會和上游模組依附元件共用 R 類別,因此專案內每個模組都必須使用不重複的套件名稱。
  • 其他專案依附元件的程式庫 R 類別瀏覽權限,視用於納入該程式庫做為依附元件的設定而定。舉例來說,假設程式庫 A 納入程式庫 B 做為「api」依附元件,則程式庫 A 和其他依附程式庫 A 的程式庫都有權存取程式庫 B 的 R 類別。不過如果發生以下情況,其他程式庫便可能無法存取程式庫 B 的 R 類別:程式庫 A 使用 implementation 依附元件設定。詳情請參閱「依附元件設定」一文。

移除預設設定缺少的資源

如果您在 Library 模組中加入未納入預設資源集的語言資源 (舉例來說,如果您在 /values-es/strings.xml 中加入 hello_world 做為字串資源,但並未在 /values/strings.xml 中定義該項資源),則 Android Gradle 外掛程式編譯專案時不會再納入該項資源。這項行為變更應該可以減少發生 Resource Not Found 執行階段例外狀況,並提升建構速度。

D8 現在會遵循註解適用的 CLASS 資料保留政策

現在編譯應用程式時,D8 會遵循註解套用的 CLASS 資料保留政策,而且無法再在執行階段使用這些註解。這種運作方式也適用於將應用程式的目標 SDK 設為 API 級別 23 的情況;先前當您透過舊版 Android Gradle 外掛程式和 D8 編譯應用程式時,這項設定允許在執行階段存取這些註解。

其他行為變更

  • aaptOptions.noCompress 在所有平台都不會再區分大小寫 (適用於 APK 和套件),並且會遵循使用大寫字元的路徑。
  • 資料繫結現在預設為漸進式。詳情請參閱問題 #110061530

  • 現在包括 Robolectric 單元測試在內的所有單元測試都可以完整快取了。詳情請參閱問題 #115873047

修正錯誤

這個版本的 Android Gradle 外掛程式修正了以下錯誤:

  • 使用資料繫結的程式庫模組現已支援 Robolectric 單元測試。詳情請參閱問題 #126775542
  • 現在可以在啟用 Gradle 平行執行模式的情況下,跨多個模組執行 connectedAndroidTest 工作。

已知問題

本節說明 Android Gradle 外掛程式 3.6.0 版的已知問題。

Android Lint 工作的效能不佳

由於剖析基礎架構內發生迴歸現象,因此 Android Lint 可能需要花費更長的時間才能完成部分專案,進而導致某些程式碼結構中的 lambda 推測類型計算速度變慢。

此問題已回報為 IDEA 錯誤,且將在 Android Gradle 外掛程式 4.0 版中修正。

缺少資訊清單類別 {:#agp-missing-manifest}

如果應用程式在資訊清單中定義自訂權限,則 Android Gradle 外掛程式通常會產生 Manifest.java 類別,以便將自訂權限加入為字串常數。外掛程式會將此類別封裝至應用程式,方便您在執行階段參照這些權限。

在 Android Gradle 外掛程式 3.6.0 版中,產生這個資訊清單類別的功能無法運作。如果您使用這個外掛程式版本建構應用程式,且應用程式參照該資訊清單類別,就可能會發生 ClassNotFoundException 例外狀況。如要解決這個問題,請按照下列其中一種做法進行:

  • 依自訂權限的完整名稱參照這些權限。例如:"com.example.myapp.permission.DEADLY_ACTIVITY"

  • 自行定義常數,如下所示:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }