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

Posted

技术标签:

【中文标题】Android中的consumer-rules.pro和proguard-rules.pro有啥区别?【英文标题】:What is the difference between consumer-rules.pro and proguard-rules.pro in Android?Android中的consumer-rules.pro和proguard-rules.pro有什么区别? 【发布时间】:2020-03-26 06:21:39 【问题描述】:

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

我想知道以下事情

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

请指教。

【问题讨论】:

【参考方案1】:

我会尝试回答每个问题,即使有什么不明白的地方请告诉我!

1。 即使模块没有指定任何规则,是否所有模块代码都会被主模块 pro-guard 规则的规则混淆?

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


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 规则在主模块中被覆盖?

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

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


我希望这是有道理的!

【讨论】:

感谢您的详细回答。关于第二个答案,1)这是否意味着库创建者不应使用 consumer-rules.pro 而是供其用户使用? 没错,这就像提供其他人在使用库时可以使用的规则一样。对于库开发,可以使用 proguard-rules 文件来为库声明规则,就像我们在 app 模块中所做的那样。 当你说传递 deps 时,假设 App 模块是 (A):A -> B -> C -> D。这里 A(通常是我们的 app 模块)只会混淆以下代码在 B 中,但 C -> D 不会被触及。它们只会被混淆,因为 B 对它们有保护规则,所以当 B 被混淆时(在每个模块的基础上)它会混淆 C 但 D 不会被混淆等等等等? @androiddeveloper 不,两个文件不同。像这样考虑,如果您的库具有第三方依赖项,需要您在库项目中添加他们的规则,则您的库用户使用 consumer-rules 文件,而您的库本身使用 proguard-rules 文件。 @androiddeveloper 感谢您提出单独的问题,让我来看看如何提供帮助。 :)

以上是关于Android中的consumer-rules.pro和proguard-rules.pro有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

android 6中的android webview youtube视频中的全屏模式问题

android权限--android开发中的权限及含义(上)

FrameLayout 中的 'android:foreground' 和 'android:foregroundGravity' 如何影响其外观?

Android - 将参数传递给 Android 应用程序中的 RESTful URL

Android 中的 ContactsContract 概览

android布局中的tag怎么用