確認啟動設定檔最佳化

您可以透過 Android Studio 或查看 R8 建構中繼資料,確認啟動設定檔是否正常運作。

使用 Android Studio 確認

如要確認 DEX 版面配置最佳化功能,請使用 Android Studio 開啟 APK,並驗證 DEX 檔案中的類別。確認主要 classes.dex 未完全填滿。如果應用程式只包含一個 DEX 檔案,啟用啟動設定檔後,您可以檢查應用程式是否包含兩個 DEX 檔案。

如果啟動類別不適合放在單一 DEX 檔案中,Android Studio 會顯示警告。如要取得診斷資訊 (包括啟動類別中非啟動方法的數量),請對 settings.gradle 檔案進行下列變更,確保 R8 編譯器更新至 8.3.21 以上版本,然後套用啟動設定檔:

Kotlin

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.21")
        }
    }
}

Groovy

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

使用 Gradle 建構時,請務必在下列指令的 assembleRelease 後方加入 --info

./gradlew assembleRelease --info

診斷結果隨即會列印到終端機。

如果應用程式或任何程式庫參照任何還原的 API,這些類別的配套相容性實作項目一律會包含在最後一個 DEX 檔案中。這個經過去糖化的最後一個 DEX 檔案不會參與 DEX 版面配置最佳化。

使用套件中繼資料確認

從 AGP 8.8 開始,R8 會在 Android App Bundle (AAB) 中輸出中繼資料,您可以使用這些資料檢查 DEX 版面配置最佳化是否成功。如要確認最佳化是否成功,請按照下列步驟操作:

  1. 建構應用程式的 AAB:

    ./gradlew app:bundleRelease
    
  2. 確認至少有一個 DEX 檔案包含文字 "startup": true

    1. 開啟中繼資料:

      unzip -j -o path-to-aab BUNDLE-METADATA/com.android.tools/r8.json && jq .dexFiles r8.json
      

      AAB 的路徑可能類似於 app/build/outputs/bundle/release/app-release.aab

    2. 檢查輸出內容,應如下所示:

          inflating: r8.json
      [
        {
          "checksum": "f0b4b0ddb295812607f44efe03cf7a830056ccfddbdb81db3760d2281940e951",
          "startup": true
        }
      ]
      

    如果中繼資料中只顯示 "startup": false,請啟用啟動設定檔,並確保啟動設定檔未經過混淆處理。

  3. 確認中繼資料中的 SHA-256 值與 AAB 中的值相符。如要取得所有 DEX 檔案的 SHA-256 值,請執行下列指令:

    unzip -o path-to-aab */dex/*.dex && sha256sum */dex/*
    

    輸出內容應如下所示:

    Archive: app/build/outputs/bundle/release/myapp-release.aab
      inflating: base/dex/classes.dex
    f0b4b0ddb295812607f44efe03cf7a830056ccfddbdb81db3760d2281940e951  base/dex/classes.dex
    

    比較雜湊值與步驟 1 中的「校驗碼」值。如果 SHA-256 值不相符,可能是編譯步驟干擾 R8 輸出 DEX 檔案。