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

Sus*_*ger 18 java android proguard kotlin

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

我想知道以下内容

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

请指教。

Jee*_*ede 41

我会尽量回答每个问题,即使有什么不合理的地方也请告诉我!

1.即使模块没有指定任何规则,所有模块代码是否会被主要模块亲卫规则的规则混淆?

混淆不是这样工作的。当您在应用模块中启用 minify 属性时,它会尝试混淆应用模块中可用的代码以及它的第 3 方依赖项,并且您的库模块将被视为第 3 方 deps。在这里,但它不会触及您的 3rd party dependency 的任何传递依赖


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

proguard-rules.pro是您为模块及其依赖项声明与 proguard 相关的规则的文件。

consumer-rules.pro是一个文件,您可以在其中声明可以从消费者(任何将您的模块/库用作依赖项,通常由库开发人员使用)应用于您的模块的规则


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

我建议你应该(每个开发人员必须在发布 apk 上做),但要确保一切都按预期工作,因为应用 minify 后底层classes.dex 会发生变化。它有助于减少输出 apk 大小、优化代码、混淆类文件等等...


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

不,基本上库规则是从库模块本身的使用者规则文件中应用的,因此当您在应用程序模块中为库声明这些规则时,它会以与使用者规则相同的方式应用,这基本上表明使用者在缩小时应使用这些规则.

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


我希望这是有道理的!

  • @androiddeveloper 你有多个问题,所以我会尽力一一回答。当您开发库时,最佳实践是同时拥有两个 proguard 文件。库的“proguard-rules.pro”是您为库中使用的任何第三方库声明规则的文件(就像我们为应用程序模块所做的那样)。当您通过任何存储库中心提供库供公众使用时,consumer-rules.pro 文件也会被发送,这样最终消费者就不必手动在自己的 proguard 文件上编写规则。 (3认同)
  • @androiddeveloper 不,两个文件是不同的。像这样考虑,如果您的库具有第三方依赖项,需要您在库项目中添加他们的规则,则消费者规则文件由您的库用户使用,而混淆器规则文件由您的库本身使用。 (2认同)