使用 proguard 縮減程式碼和資源

要使你的 APK 檔案儘可能小,你應該啟用收縮以刪除釋出版本中未使用的程式碼和資源。此頁面介紹瞭如何執行此操作以及如何指定在構建期間要保留或丟棄的程式碼和資源。

ProGuard 提供程式碼縮減功能,可以從打包的應用程式中檢測並刪除未使用的類,欄位,方法和屬性,包括來自所包含程式碼庫的那些(使其成為處理 64k 參考限制的有用工具)。ProGuard 還優化位元組碼,刪除未使用的程式碼指令,並使用短名稱對剩餘的類,欄位和方法進行模糊處理。混淆的程式碼使你的 APK 難以進行逆向工程,這在你的應用使用安全敏感功能(例如許可驗證)時尤為重要。

Gradle 的 Android 外掛提供了資源縮減功能,可以從打包的應用程式中刪除未使用的資源,包括程式碼庫中未使用的資源。它與程式碼收縮一起工作,這樣一旦刪除了未使用的程式碼,也可以安全地刪除不再引用的任何資源。

收縮你的程式碼

要使用 ProGuard 啟用程式碼收縮,請將 minifyEnabled true 新增到 build.gradle 檔案中的相應構建型別。

請注意,程式碼縮小會減慢構建時間,因此如果可能,應避免在除錯版本中使用它。但是,重要的是你要在用於測試的最終 APK 上啟用程式碼縮減,因為如果你沒有充分定製要保留的程式碼,它可能會引入錯誤。

例如,build.gradle 檔案中的以下程式碼段可以為釋出版本啟用程式碼收縮:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

minifyEnabled 屬性外,proguardFiles 屬性定義了 ProGuard rules

getDefaultProguardFile(‘proguard-android.txt’)方法從 Android SDK tools/proguard/ folder 獲取預設的 ProGuard 設定。提示:要獲得更多程式碼縮減,請嘗試位於同一位置的 proguard-android-optimize.txt 檔案。它包含相同的 ProGuard 規則,但其他優化功能可在位元組碼級別(內部和跨方法)執行分析,從而進一步降低 APK 大小並幫助其更快地執行。你可以在 proguard-rules.pro 檔案中新增自定義 ProGuard 規則。預設情況下,此檔案位於模組的根目錄(build.gradle 檔案旁邊)。要新增特定於每個構建變體的更多 ProGuard 規則,請在相應的 productFlavor 塊中新增另一個 proguardFiles 屬性。例如,以下 Gradle 檔案將 flavor2-rules.pro 新增到 flavor2 產品風格中。

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                   'proguard-rules.pro'
        }
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}