切換語言為:簡體

Android中consumerProguardFiles 和 proguardFiles有什麼區別

  • 爱糖宝
  • 2024-09-22
  • 2047
  • 0
  • 0

在 Android 專案中,consumerProguardFilesproguardFiles 是與混淆相關的配置選項,它們有不同的用途和適用場景。

proguardFiles 和 consumerProguardFiles 的區別

  • proguardFiles:用於為當前模組(如應用程式模組或庫模組)指定 ProGuard 規則檔案。這些規則在編譯當前模組時使用,控制混淆和最佳化過程。

  • consumerProguardFiles:用於為庫模組指定 ProGuard 規則檔案。當你的模組作為庫(AAR 或 JAR)釋出時,這些規則檔案會與庫一起分發,並在該庫被其他專案使用時自動生效。這些規則會被合併到應用程式模組的混淆規則中。

所以proguardFiles指定的是當前模組的混淆規則檔案,僅在構建當前模組時使用;而consumerProguardFiles指定庫模組的混淆規則檔案,當該模組被其他專案引用時,這些規則檔案將自動應用。

示例

假設我們有一個 Android 專案,其中包含一個應用程式模組(app)和一個庫模組(lib_proguard)。

Android中consumerProguardFiles 和 proguardFiles有什麼區別

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 配合使用

如果希望在構建該模組時應用特定的混淆規則,同時在該庫被其他專案引用時也應用這些規則,可以同時使用 proguardFilesconsumerProguardFiles

// 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中配置混淆規則:

  • Android中consumerProguardFiles 和 proguardFiles有什麼區別

  • app主module中配置混淆規則:

  • Android中consumerProguardFiles 和 proguardFiles有什麼區別

  • 生成release包後:

    可以看到在build/outputs/mapping/release/configuration.txt 中將所有的混淆規則進行了合併。

  • Android中consumerProguardFiles 和 proguardFiles有什麼區別

Release包生成的混淆檔案

打完 Release 包後,通常會在 build/outputs/mapping/release/ 目錄下生成一些與程式碼混淆相關的檔案。這些檔案是由 ProGuard 或 R8(ProGuard 的後繼者)生成的,具體包括以下幾個檔案:

Android中consumerProguardFiles 和 proguardFiles有什麼區別

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 檔案有助於瞭解哪些部分的程式碼被認為是未使用的並被移除掉了。如果有意外的程式碼被移除導致應用出現問題,可以透過此檔案來檢查問題所在。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.