ConsumerProguardFiles与ProguardFiles的区别

44

我尝试构建一个包含La库模块的应用程序,并使用proguard进行混淆,但我注意到该库没有被混淆。我试图弄清楚原因。此时,我的buildType如下:

release {
 minifyEnabled false
 useProguard true
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} 

在一些搜索后,我发现了ConsumerProguardFiles函数,它说明:

用于包含在发布的AAR中的ProGuard规则文件。

这些ProGuard规则文件将被任何使用AAR的应用程序项目使用(如果启用了ProGuard)。

这允许AAR指定缩小或混淆排除规则。

这仅适用于库项目。在应用程序项目中将被忽略。

有了这个,我的库La的buildType如下:

release {
 minifyEnabled false
 useProguard true
 consumerProguardFiles 'proguard-rules.pro'
}

现在我的库La正在使用它自己的proguard规则,库代码已被混淆。

因此,我的问题是:

1)这种不同行为的原因是什么?为什么ProguardFiles不混淆库中的proguarded规则,而是忽略它?

2)我猜ConsumerProguardFiles所做的是将库的规则与主应用程序的proguard规则合并。我的假设正确吗?

3)简而言之:应用程序使用proguardFiles,库使用ConsumerProguardFiles。正确吗?

感谢您阅读!


useProguard true 的目的是什么? - AutonomousApps
基本上,默认情况下启用了 useProguard true。我只是添加它来查看通过显式或隐式方式是否会有任何差异(实际上并没有)。但您可以在 https://developer.android.com/studio/build/shrink-code.html 查看更详细的响应,在“使用即时运行启用代码缩减”下面。 - Peddro
1个回答

34
据我理解,minifyEnabled false的意思是不会对库模块进行混淆/缩小。这正是您所需要的,因为库模块无法知道哪些部分将在应用程序模块中使用。
相反,库模块必须通过consumerProguardFiles向应用程序模块提供其相关的混淆规则,然后应用程序模块将同时运行其自己的规则和库的规则与ProGuard一起来最小化最终应用程序APK。

4
有没有办法覆盖或替换consumerProguardFiles中的proguard? - Daniel Gomez Rico
4
如果我有一个库模块,是不是需要在两个文件(proguard-rules和consumer-rules)中都添加规则,或者只需要将库规则添加到“consumer-rules.pro”中就足够了? - ASP
2
@ASP 将您的规则添加到 consumer-rules.pro 中即可。它将自动应用于应用程序中。 - Ashish

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