您可以搭配使用 R8 和 packageScope,最佳化特定套件。如果應用程式尚未採用 R8,這項功能可做為選用的第一步,但如果應用程式已採用 R8,則不建議使用這項功能。
考慮是否使用 packageScope
如果應用程式已使用 R8,請勿使用 packageScope,因為就效能和應用程式大小而言,這是次佳設定。請改用改良的保留規則,強化應用程式的 R8 設定;如果使用相容模式,請遷移至 R8 的完整模式。
如果應用程式尚未採用 R8,但正在導入 R8,則可使用 packageScope 逐步管理轉換作業。由於 R8 會套用強大的最佳化功能,可能會改變應用程式行為,因此將這些最佳化功能限定在可安全最佳化的特定套件 (例如 AndroidX 和 Kotlin) 中,可讓您以最低風險獲得效能提升。應用程式穩定後,您可以逐步將這些最佳化措施擴展至其餘程式碼集和依附元件,並在每個階段測試穩定性。
必要條件
搭配 packageScope 使用 R8 的必要條件:
- Android Gradle 外掛程式 9.0 以上版本。
- R8 完整模式,而非相容模式。
設定最佳化
如要使用 packageScope 啟用最佳化功能,請完成下列步驟。
選擇要最佳化的媒體庫
找出要最佳化的程式庫。建議您從 AndroidX 和 Kotlin 程式庫 androidx.**、kotlin.** 和 kotlinx.** 開始,因為這些是已設定為與 R8 相容的穩定程式庫。
啟用支援,以便搭配 packageScope 使用 R8
在專案的 gradle.properties 檔案中新增下列內容:
android.r8.gradual.support=true
設定最佳化區塊
在模組層級的 build.gradle.kts (或 build.gradle) 檔案中,將 optimization 區塊新增至發布子版本建構設定。在這個區塊中,使用 packageScope 列出要最佳化的特定套件。在 build.gradle.kts 檔案中,將套件清單包裝在 setOf() 中。
Kotlin
android {
buildTypes {
release {
optimization {
enable = true
packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true
packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
}
}
}
}
測試最佳化功能
套用或更新packageScope聲明後,請徹底測試應用程式,確認沒有發生非預期的當機或行為變更。
從最佳化指定套件,改為最佳化整個應用程式
為盡量發揮最佳化效益,您應逐步將整個應用程式從使用 packageScope 轉換為使用 R8。這個過程包括逐步擴大最佳化涵蓋範圍:
- 先從穩定版程式庫開始。首先,請只加入與 R8 的最佳化功能相容的常用穩定程式庫,並列在
packageScope清單中。從 AndroidX 和 Kotlin 程式庫androidx.**、kotlin.**和kotlinx.**開始。 - 逐步新增套件。逐步將新的套件前置字元新增至
packageScope:- 評估依附元件。查看應用程式的程式庫。建議加入
packageScope清單的項目包括官方 Google 程式庫 (例如com.google.**),以及其他穩健的程式庫 (例如OkHttp,包括okhttp3.**和okio.**)。請優先使用不涉及大量反射、序列化或原生程式碼呼叫 (JNI) 的程式庫。 - 根據套件大小決定優先順序。使用 Android Studio 的 APK 分析工具,找出造成應用程式大小增加的主要因素。
- 關閉 R8,然後建構發布版 AAB 或 APK。
- 在「分析器」中開啟,並檢查
dex檔案。 - 依大小排序套件。最大型套裝組合可為最佳化作業帶來最高的投資報酬率。只要這些程式庫沒有過於寬鬆的保留規則,優先指定這些程式庫就能在程序初期大幅縮減大小。詳情請參閱「明智地選擇程式庫」一文。
- 評估依附元件。查看應用程式的程式庫。建議加入
- 驗證行為變更。新增每個套件前置字串後,請進行全面測試,偵測並解決任何回歸或非預期行為。
- 最後再新增應用程式套件。如果應用程式套件未使用大量反射,請在
packageScope中加入應用程式套件,並視需要逐步新增保留規則。如果應用程式套件使用大量反射,請在packageScope中加入這些套件,並為必要套件新增套件範圍的保留規則。反覆查看保留規則,並加以修正。 - 改用 R8 處理整個應用程式。應用程式的大部分依附元件都納入
packageScope宣告,且應用程式穩定運作後,請移除packageScope,以完整模式最佳化整個應用程式。