在Android中,consumer-rules.pro和proguard-rules.pro有什么区别?

50

我已经在我的Android应用程序中创建了一个模块,并且似乎有两个文件consumer-rules.pro和proguard-rules.pro。

我想知道以下几点:

  1. 即使模块没有指定任何规则,所有模块的代码是否都将受到主模块pro-guard规则的混淆?
  2. Android中consumer-rules.pro和proguard-rules.pro之间有什么区别?
  3. 是否应该在我的模块中启用minifyEnabled?
  4. 我注意到我可以在主模块中为我的模块添加proguard规则,这是否意味着模块中的pro-guard规则被主模块覆盖?

请给予建议。

2个回答

83

我会尝试回答每一个问题,但如果有些不太清楚,请告诉我!

1. 即使模块未指定任何规则,所有模块代码是否都将遵循主模块pro-guard规则的规定进行混淆?

混淆并不是这样工作的。当你在应用程序模块中启用了 minifyEnabled 属性时,它会尝试混淆从应用程序模块以及其第三方依赖项获取的代码,并且你的库模块将被视为第三方依赖项。但它不会触及任何你的第三方依赖项的传递依赖项


2. Android中的consumer-rules.pro和proguard-rules.pro之间有什么区别?

proguard-rules.pro 是你声明与Proguard相关的规则的文件,适用于你的模块及其依赖项。

consumer-rules.pro 是你声明可以由使用你的模块作为依赖项的用户(通常是库开发人员)应用于你的模块的规则的文件。


3. 我应该在我的模块中启用minifyEnabled吗?

我建议你这样做(每个开发人员都应该在发布APK时这样做),但要确保一切正常,因为应用 minifyEnabled 后底层的 classes.dex 将会发生变化。它有助于减少输出APK大小,优化代码,混淆类文件等等...


4. 我注意到我可以在主模块中为我的模块添加Proguard规则,那么这是否意味着模块中的Proguard规则会被主模块覆盖?

不会。基本上,库规则会应用于库模块中的consumer-rules文件,因此当您在应用模块中声明这些规则以供库使用时,它会从consumer-rules以相同的方式应用,这基本上是表明消费者在最小化时应该使用这些规则。

库的proguard-rules.pro是您为库的第三方依赖项(被视为应用程序模块/主模块的传递依赖项)声明规则的地方,它不会被应用模块的规则覆盖。


希望这能让您理解!


1
感谢您提供详细的答案。关于第二个答案,1)这是否意味着库创建者不应使用consumer-rules.pro,而是为其用户使用? - Dishonered
2
@androiddeveloper 你有多个问题,我会逐一回答。当你开发一个库时,最好的做法是同时拥有两个proguard文件。'proguard-rules.pro'是库中声明任何第三方库规则的文件(就像我们为应用程序模块所做的那样)。当你通过任何仓库中心向公众提供你的库时,consumer-rules.pro文件也会被发送,以便最终用户不必手动编写自己的proguard文件规则。 - Jeel Vankhede
1
@androiddeveloper 不是的,这两个文件是不同的。可以这样考虑,consumer-rules 文件由你的库用户使用,而 proguard-rules 文件由你的库自身使用,如果你的库有第三方依赖项需要你在库项目中添加他们的规则。 - Jeel Vankhede
@JeelVankhede 好的,我现在到了这个点:https://dev59.com/TcDqa4cB1Zd3GeqPYDOc - android developer
1
@androiddeveloper 感谢您提出这个问题,让我看看如何帮助您。 :) - Jeel Vankhede
显示剩余9条评论

3
如果您正在开发一个库/模块,您可以使用consumer-rules.pro来为您的库的消费者设置规则。一个例子是当我创建了一个包含Moshi + Retrofit并启用了完整模式R8的通用模块时。我需要添加一些规则以使其在消费者的项目中工作,我可以将这个任务留给消费者,或者我可以将它放在库的consumer-rules.pro中,以确保每个使用者或所有使用我的库的消费者在使用/消费我的库时不需要担心在他们的项目中添加这样的规则。

2
如果我说错了,请纠正我。consumer-rules 仅在您向他人提供库以定义所有客户端共同使用的规则时使用。 - hardik9850
消费者需要做任何事情来使用consumer-rules.pro文件吗?如果存在,Android Studio/Gradle会自动识别它吗? - Glaucus
2
@hardik9850 正确 - Bitwise DEVS
1
@Glaucus作为一个库的消费者,你不应该操纵consumer-rules.pro,因为它是由库的创建者准备的。如果你作为消费者需要操纵consumer-rules.pro,比如在你的项目中本地添加库,那么你可能只需要直接在你的模块的常规proguard规则中进行操作。 - Bitwise DEVS
@BitwiseDEVS 谢谢。我的问题更多是关于如何使用它,而不是修改它。所以如果一个库有一个consumer-rules.pro文件,在构建时会自动合并到消费应用的proguard-rules.pro文件中吗? - Glaucus
1
根据我的经验,消费者规则会自动适用。 - Bitwise DEVS

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