Android Studio对于库的consumerProguardFiles无法工作

7

我希望在我的库中使用Proguard,但是规则文件应该设置在库内部。这意味着我不想在我的应用程序模块中显式设置属于库的规则。

我发现有一些类似于consumerProguardFiles属性的东西。我的设置:

库gradle:

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

应用程式 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
(...)

有超过一百个错误。我发现我的整个库中的所有类都不见了。


请发布错误... - Shark
@Shark已修改。我的库中的所有类都不见了。 - AppiDevo
1
由于您的 proguard-rules 文件都是空的,Proguard "吃掉"或将它们排除了。 - Shark
2个回答

20

您需要明确您想要做什么:

  1. 在库上运行proguard
  2. 在应用程序上运行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

让使用者(应用程序)知道要保留库���哪些类。

下面是library 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要保留什么。


No, don't proguard the library itself. - what do you mean? this is used only if you separately build only the library (directly, without app module), there is nothing wrong to to set it to true, so please do not confuse other programmers! because you can create AAR library for example and it should be release { minifyEnabled true }. If you build app module with source library then this rule doesn't have any effect anyway, just leave it true - user924
minifyEnabled false告诉AGP不要缩小库。”我没有针对开发者,也没有建议你感到糟糕。我会使用一些来自maven仓库的库构建我的应用程序链,因此minifyEnabled在拉取缩小的AAR时确实起到了作用。因此,如果库B依赖于A,并且我选择缩小A并将Android Studio切换为显示“release”构建变体,则希望在处理B时隐藏来自A的剥离代码。如果没有,也许我们应该考虑它是一个错误并报告一个问题? - Eugen Pechanec

0

好的,由于Proguard可能会吞噬您的类,请尝试在您的app的proguard-rules.pro文件中添加以下内容:

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

这应该告诉Proguard保存所有来自my.library.package.name的类,这样它们就不会再丢失了。


如果这使它正常运行,您就可以自由地进一步完善您的Proguard规则集并混淆您需要混淆的内容。 - Shark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接