簡體   English   中英

用於庫的Android Studio consumerProguardFiles不起作用

[英]Android Studio consumerProguardFiles for the library doesn't work

我想在我的庫上使用proguard,但文件(規則)應該在庫中設置。 這意味着我不想在我的app模塊中明確設置規則w(屬於庫)。

我發現有類似consumerProguardFiles的屬性。 我的設置:

庫gradle:

buildTypes {
    debug {
        debuggable true
        minifyEnabled false
    }
    release {
        minifyEnabled true
        consumerProguardFiles 'proguard-rules.pro'
    }
}

app gradle:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        debuggable true
        minifyEnabled false
        signingConfig signingConfigs.debug
    }
    release {
        debuggable false
        minifyEnabled true
        signingConfig signingConfigs.release
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

為什么上面的配置不起作用? 我收到錯誤,無法找到庫中的包/符號。


編輯:

重要的是我的proguard-rules.pro用於庫和proguard-rules.pro用於主應用程序模塊都是空的。

示例錯誤:

Error:(3, 60) error: package (my library package here) does not exist
(...)
Error:(16, 9) error: cannot find symbol class NavigationStructureModel
(...)

超過一個handrued錯誤。 我可以看到我的庫中的所有課程都丟失了。

你需要弄清楚你是否願意

  1. 在庫上運行proguard
  2. 在app上運行proguard(提示:就是這個。)

在庫上運行proguard

那是它到達應用程序之前 您的庫proguard規則負責使所有代碼都可訪問和存在,但您可能會混淆內部類。

這是庫build.gradle:

android {
    defaultConfig {
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    buildTypes {
        release {
            minifyEnabled true // Yes, run proguard on the library itself.
        }
    }
}

如果您將此庫作為開源發布,則不需要此。 如果您不將庫發布為公共,則不需要此。

我收到錯誤,無法找到庫中的包/符號。

Proguard構建了類之間的依賴關系圖。 此時,庫是一個獨立的單元,因此如果您沒有提供任何規則,則不會使用任何類,因此proguard會將它們全部刪除。

在應用程序上運行proguard

讓消費者(應用程序)知道要保留哪些類庫。

這是庫build.gradle:

android {
    defaultConfig {
        // Here's what proguard on the app should do on the library's behalf.
        consumerProguardFiles 'proguard-consumer-rules.pro' 
    }
    buildTypes {
        release {
            minifyEnabled false // No, don't proguard the library itself.
        }
    }
}

proguard如何工作

您需要告訴proguard要保留哪些代碼以及要保留的名稱。 Proguard會刪除所有未使用的代碼並拼寫您不想留下的名稱。

你不告訴proguard要刪除什么,你告訴proguard要保留什么。

好的,既然proguard可能正在吃掉你的課程,那么在app的proguard-rules.pro文件中嘗試這樣的事情:

keepclass my.library.package.name.** { *;}

應該告訴ProGuard保存所有類新的my.library.package.name所以希望他們不會丟失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM