Mar*_*ies 29 android module proguard android-library android-studio
我现在面临一个非常奇怪的问题......
我有一个带有两个模块的Gradle应用程序,一个主模块和一个库模块.
这是第一个问题:即使minifyEnabled在库中为false,它也会被混淆.它完全没有效果,似乎取决于主模块的设置.我现在使用proguard一段时间了,我从来没有经历过这样的行为.
此外,库的proguard-rules.pro似乎完全被忽略了.我在那里声明的并不重要,它没有被使用,结果总是相同的(总是反编译为查看结果).它使用默认设置进行模糊处理.
我使用了一个无效的proguard文件名来查看该文件是否被触摸,并且确实存在错误名称的错误,并且它还抱怨了proguard文件中的语法错误...
我不知道它是否与Android Studio的更新有关,因为它还建议我使用"minifyEnabled"而不是"runProguard".
如何管理proguard以使用库的proguard-rules.pro?
编辑:
我做了一个示例项目来澄清我的问题

我的库的proguard配置

我的图书馆的gradle:

最后我得到的结果.我在proguard配置中排除/包含的内容并不重要

如您所见,proguard规则在主模块上运行良好.它做了应有的事情.但它总是完全混淆我的图书馆...
它还完全删除了图书馆的活动,这根本不应该发生
Eri*_*une 87
您通常不应在库项目中启用ProGuard.ProGuard在应用程序项目中将应用程序和库一起处理,这是最有效的方法.
在库项目中,您可以在build.gradle中指定任何特定于库的ProGuard配置,例如:
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
}
Run Code Online (Sandbox Code Playgroud)
然后将此文件打包到库中,proguard.txt并自动应用于应用程序项目中.
如果您确实在库项目中启用ProGuard(可能是因为您要分发库),那么您还必须添加适当的配置来处理库.Android Gradle构建似乎不会自动执行此操作.您可以:
android-sdk/tools/proguard/examples/library.pro到proguard-project.txt您的库项目中.-injars,-outjars,-libraryjars,-printmapping从该文件.Gradle构建过程自动提供这些选项.为库项目和应用程序项目单独启用/禁用ProGuard对我来说很好.
令人惊讶的是,Eric的答案实际上也适用于我!
当然埃里克知道他在说什么,但是我已经[开启和关闭]一直试图找到一种干净的方式在gradle中自动完成这项工作超过一年没有运气直到我今天刚发现这篇文章.
我结合了其他一些SO线程,并提出了这个有效的解决方案,也可以简化.步骤1-4是可选的,但到目前为止它似乎没有受到伤害.
/android-sdk/tools/proguard5.2/android-sdk/tools/proguard到....../android-sdk/tools/proguard4.7ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguardandroid-sdk/tools/proguard/examples/library.pro到库项目文件夹并重命名为proguard-library.proproguard-library.pro并注释掉-injars,-outjars,-libraryjars,和-printmapping线条. 编辑库的build.gradle文件以包括:
defaultConfig {
minifyEnabled true
shrinkResources true
proguardFiles 'proguard-library.pro'
consumerProguardFiles 'proguard-library-consumer.pro'
}
Run Code Online (Sandbox Code Playgroud)
您可以调整它以使发布和调试版本具有不同的行为.
proguard-library-consumer.pro
# include in this file any rules you want applied to a
# consumer of this library when it proguards itself.
-dontwarn junit.**
-dontwarn org.junit.**
# Make crash call-stacks debuggable.
-keepnames class ** { *; }
-keepattributes SourceFile,LineNumberTable
Run Code Online (Sandbox Code Playgroud)对我而言唯一有效的方法是在我的库中定义两个选项:
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18155 次 |
| 最近记录: |