根據預設,R8 會進行大量最佳化,以改善效能和大小,但這些最佳化可能無法立即套用至您的應用程式。如果您要在大型應用程式中首次啟用 R8 (或啟用完整模式),請嘗試逐步採用最佳化功能:暫時關閉模糊處理功能,並為部分程式碼啟用 R8,而非應用程式中的所有程式碼。建議您在本機開發期間採用這種漸進式方法,但您也可以在內部品質確查測試期間,甚至在正式版中使用這種方法,以便逐步推出。您採取的確切步驟取決於所需的時程,以及您對預先發布測試涵蓋率的信心。
限制最佳化
R8 會執行多種最佳化作業,包括移除程式碼、重新編寫程式碼,以及移除資源。以下概略說明最佳化類型:
- 程式碼縮減 (或搖樹):移除未參照的程式碼
- 模糊處理 (或 ID 縮減):縮短類別和方法的名稱
- 最佳化:重新編寫程式碼,例如內嵌
為降低發生錯誤的機率,您可以先啟用其中部分最佳化功能。
只啟用樹狀圖抖動
程式碼縮減 (也稱為搖樹) 會移除似乎未參照的程式碼。建議您從樹狀圖抖動開始,因為這是最簡單的方法。
如要只啟用樹狀圖搖動功能,請在 proguard-rules.pro
檔案中加入以下內容,以關閉其他類型的最佳化功能。關閉模糊處理功能非常重要,因為這樣可讓堆疊追蹤更容易閱讀。
-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization
最後,您不會想要發布這項設定,因為這會大幅限制 R8 最佳化程式碼的能力,但在首次在有待修正問題的大型程式碼集中採用 R8 時,這會是絕佳的起點。
使用相容模式
根據預設,R8 會在完整模式下執行。完整模式可大幅提升效能並節省空間,但首次啟用縮減功能時,您可以暫時停用該模式,改用相容模式。
如要使用相容模式,請在 gradle.properties
檔案中使用下列設定:
android.enableR8.fullMode = false // Use temporarily to disable full mode
啟用其他最佳化功能
確認樹狀圖抖動功能可在應用程式中運作後,您可以移除上述設定,重新啟用模糊處理、最佳化和 R8 完整模式。請注意,模糊處理可能會使偵錯作業更加困難,因此建議您先解決樹狀圖抖動問題。
如要進一步瞭解如何去模糊化堆疊追蹤,請參閱「復原原始堆疊追蹤」。
限制最佳化範圍
完整最佳化版本會針對每個程式庫和套件中的所有程式碼進行最佳化,因此首次啟用 R8 時,通常會遇到相關問題。如果您發現應用程式某部分出現最佳化問題,請勿完全關閉 R8,否則您將無法享有其他方面的最佳化效益。請改為只在導致問題的應用程式部分暫時停用 R8。
使用套件層級的保留規則
建議您使用套件層級的保留規則,暫時在應用程式部分停用 R8。您應該會在稍後修正這些最佳化問題;這通常是解決問題區域的權宜之計。
舉例來說,如果應用程式的部分內容大量使用 Gson,並導致最佳化問題,理想的修正方式是新增更多指定的保留規則,或改用 codegen 解決方案。不過,如要解除封鎖應用程式其餘部分的最佳化作業,您可以在專用子包中放置定義 Gson 類型的程式碼,並在 proguard-rules.pro
檔案中加入以下規則:
-keep class com.myapp.json.** { *; }
如果您使用的某些程式庫已將反射納入內部元件,您也可以為整個程式庫新增保留規則。您必須檢查程式庫的程式碼或 JAR/AAR,才能找出要保留的適當套件。再次提醒,不建議長期維持這個狀態,但這麼做可以解除應用程式其餘部分的最佳化限制:
-keep class com.somelibrary.** { *; }
移除檔案包層級的保留規則
一旦應用程式可透過套件層級保留規則正常運作,您就應返回並新增指定保留規則,或移除需要保留規則的反射用途或程式庫。
舉例來說,在 AndroidX 中,保留所有擴充特定類別的規則,是為了只保留相關類別。一般來說,反射應只針對擴充特定抽象類別、實作特定介面,或具有特定執行階段註解的類別,指定類別或方法。這些都是支援定義保留規則的方式,因此您不需要在最終的完全最佳化應用程式中使用包裝層級保留規則。