在 Android 專案中,consumerProguardFiles
和 proguardFiles
是與混淆相關的配置選項,它們有不同的用途和適用場景。
proguardFiles 和 consumerProguardFiles 的區別
proguardFiles
:用於為當前模組(如應用程式模組或庫模組)指定 ProGuard 規則檔案。這些規則在編譯當前模組時使用,控制混淆和最佳化過程。consumerProguardFiles
:用於為庫模組指定 ProGuard 規則檔案。當你的模組作為庫(AAR 或 JAR)釋出時,這些規則檔案會與庫一起分發,並在該庫被其他專案使用時自動生效。這些規則會被合併到應用程式模組的混淆規則中。
所以proguardFiles
指定的是當前模組的混淆規則檔案,僅在構建當前模組時使用;而consumerProguardFiles
指定庫模組的混淆規則檔案,當該模組被其他專案引用時,這些規則檔案將自動應用。
示例
假設我們有一個 Android 專案,其中包含一個應用程式模組(app
)和一個庫模組(lib_proguard
)。
proguardFiles 示例
在 app
模組中,我們使用 proguardFiles
來指定混淆規則檔案:
// app/build.gradle android { buildTypes { release { minifyEnabled true // 啟用混淆 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
在這個示例中,app
模組在構建 release 版本時啟用了混淆,並使用了兩個混淆規則檔案:
proguard-android-optimize.txt
:Android SDK 提供的預設混淆規則。proguard-rules.pro
:自定義的混淆規則檔案。
這些規則檔案隻影響 app
模組及其直接引用的程式碼。
consumerProguardFiles 示例
在 lib_proguard
模組中,我們使用 consumerProguardFiles
來指定混淆規則檔案:
// lib_proguard/build.gradle android { defaultConfig { // 庫模組的配置 } buildTypes { release { //注意這裏得配置consumerProguardFiles,consumer-rules.pro中的混淆規則纔會生效 consumerProguardFiles 'consumer-rules.pro' } } }
在這個示例中,lib_proguard
模組定義了一個混淆規則檔案 consumer-rules.pro
,它會在以下情況下生效:
當
lib_proguard
模組被編譯成 AAR 包釋出時,consumer-rules.pro
會自動包含在 AAR 中。當其他專案引用此庫時,
consumer-rules.pro
中的規則會自動合併到引用該庫的專案的混淆規則中。
consumerProguardFiles 和 proguardFiles 配合使用
如果希望在構建該模組時應用特定的混淆規則,同時在該庫被其他專案引用時也應用這些規則,可以同時使用 proguardFiles
和 consumerProguardFiles
:
// lib_proguard/build.gradle android { buildTypes { release { minifyEnabled true proguardFiles 'proguard-rules.pro' // 用於構建該庫模組時的混淆規則,一般也不會這麼寫 consumerProguardFiles 'consumer-rules.pro' // 用於在其他專案中引用該庫時的混淆規則 } } }
在這個配置中:
proguard-rules.pro
:在lib_proguard
模組的構建過程中使用。consumer-rules.pro
:在該庫被其他專案引用時自動生效。
綜合示例
更多情況下,是在主 app/build.gradle
中設定proguard-rules.pro,在 lib_proguard/build.gradle
中設定consumer-rules.pro,這樣打包後就會把所有的混淆規則進行合併,如:
在lib_proguard中配置混淆規則:
app主module中配置混淆規則:
生成release包後:
可以看到在
build/outputs/mapping/release/configuration.txt
中將所有的混淆規則進行了合併。
Release包生成的混淆檔案
打完 Release 包後,通常會在 build/outputs/mapping/release/
目錄下生成一些與程式碼混淆相關的檔案。這些檔案是由 ProGuard 或 R8(ProGuard 的後繼者)生成的,具體包括以下幾個檔案:
configuration.txt
configuration.txt
是由 ProGuard 或 R8 生成的檔案,包含了在混淆過程中實際使用的所有混淆配置規則。它列出了最終生效的混淆規則,包含在 proguard-rules.pro
檔案中定義的規則、consumerProguardFiles
中的規則(從依賴的庫模組中引入的混淆規則)以及 Android SDK 和其他工具可能附加的預設規則。透過檢視這個檔案,可以瞭解所有實際應用的混淆配置規則。
mapping.txt
mapping.txt
檔案是混淆對映檔案,記錄了混淆過程中類名、方法名和欄位名的對映關係。混淆後的程式碼會將原始的類名、方法名、欄位名替換為隨機的短名稱,以減小 APK 大小並增強反編譯的難度。 mapping.txt
檔案中的對映關係在排查生產環境的崩潰問題時尤為重要。用過bugly
的對這個檔案都不陌生吧。藉助這個檔案,可以將崩潰日誌中的混淆名稱還原為原始的程式碼名稱(即反混淆),以便更容易理解和除錯程式碼。
seeds.txt
seeds.txt
檔案用於記錄混淆過程中哪些類和成員(方法或欄位)未進行任何混淆或移除操作。 這些類和成員通常是透過配置規則明確指定要保留的部分,例如使用了 @Keep
註解或在 ProGuard 配置檔案中配置了 -keep
規則。seeds.txt
檔案有助於你瞭解在混淆過程中保留了哪些程式碼,確保它們不被混淆或最佳化移除。
usage.txt
usage.txt
檔案記錄了被刪除的類、方法、欄位的資訊。 ProGuard 或 R8 在混淆時,會根據規則判斷哪些程式碼是無用的或不可達的,從而移除它們以最佳化 APK 的大小。usage.txt
檔案有助於瞭解哪些部分的程式碼被認為是未使用的並被移除掉了。如果有意外的程式碼被移除導致應用出現問題,可以透過此檔案來檢查問題所在。