建立啟動設定檔

啟動設定檔是基準設定檔的子集。建構系統可使用啟動設定檔,藉由改善 APK DEX 檔案中程式碼的版面配置,進一步將包含的類別和方法最佳化。使用啟動設定檔時,應用程式啟動速度比單獨使用基準設定檔快 15% 以上。

圖 1 根據 DEX 版面配置最佳化調整程式碼位置。

相關規定

我們建議將啟動設定檔與下列工具搭配使用:

  • Jetpack Macrobenchmark 1.2.0 以上版本
  • Android Gradle 外掛程式 8.2 以上版本
  • Android Studio Iguana 以上版本

此外,您需要在應用程式中採用下列設定:

  • 已啟用 R8。請為發布子版本設定 isMinifyEnabled = true
  • 已啟用 DEX 版面配置最佳化功能。在應用程式模組建構檔案的 baselineProfile {} 區塊中,設定 dexLayoutOptimization = true

建立啟動設定檔

使用預設的基準設定檔產生器範本時,Android Studio 會建立啟動設定檔和基準設定檔。

建立及產生啟動設定檔的一般步驟與建立基準設定檔的步驟相同。

建立啟動設定檔的預設方式,是使用 Android Studio 中的基準設定檔產生器模組範本。這包括構成基本啟動設定檔的啟動互動。如要透過更關鍵的使用者歷程 (CUJ) 擴充這個啟動設定檔,請將應用程式啟動 CUJ 新增至 includeInStartupProfile 設為 truerule 區塊中。如果是簡單的應用程式,啟動應用程式的 MainActivity 或許就夠用了。如果是較複雜的應用程式,請考慮在應用程式中加入最常見的進入點,例如從主畫面啟動應用程式,或開啟至深層連結

下列程式碼片段顯示基準設定檔產生器 (預設為 BaselineProfileGenerator.kt 檔案),包括從主畫面啟動應用程式並啟動深層連結。深層連結會直接導向應用程式的新聞動態消息,而非應用程式的主畫面。

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

執行「Generate Baseline Profile for app」設定,然後在 src/<variant>/generated/baselineProfiles/startup-prof.txt 中尋找啟動設定檔規則。

確認啟動設定檔最佳化

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

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

Kotlin

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

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 版面配置最佳化作業。