用于库的Android Studio consumerProguardFiles不起作用

时间:2017-03-12 21:38:59

标签: android android-studio proguard android-library android-proguard

我想在我的库上使用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
(...)

超过一个手工错误。我可以看到我的所有课程都缺失了。

2 个答案:

答案 0 :(得分:5)

您需要弄清楚是否要

  1. 在库上运行proguard
  2. 在app上运行proguard(提示:就是这个。)
  3. 在库

    上运行proguard

    BEFORE 它到达应用程序。您的库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要保留什么。

答案 1 :(得分:0)

好的,既然proguard可能会耗尽您的课程,请在app的proguard-rules.pro文件中尝试这样的事情:

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

应告诉proguard保存my.library.package.name中的所有classess,所以希望它们不会再丢失了。