ConsumerProguardFiles vs ProguardFiles

时间:2017-01-10 15:40:14

标签: android android-gradle android-proguard

我正在尝试使用proguard构建一个包含库模块La的应用程序,我注意到库没有被混淆。试图理解为什么。在这个时刻,这是我的buildType:

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

经过一番搜索后,我遇到了ConsumerProguardFiles函数,该函数声明:

  

ProGuard规则文件将包含在已发布的AAR中。

     

然后,任何应用程序项目都将使用这些proguard规则文件   消耗AAR(如果启用了ProGuard)。

     

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

     

这仅适用于Library项目。这在Application中被忽略   项目

现在我的库buildType的{​​{1}}如下:

La

现在我的图书馆release { minifyEnabled false useProguard true consumerProguardFiles 'proguard-rules.pro' } 正在使用它的程序规则,图书馆代码被混淆了。

所以我的问题是:

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

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

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

感谢您抽出时间阅读!

1 个答案:

答案 0 :(得分:10)

据我了解, <PropertyGroup> <TargetFrameworks>net4.0;net4.6</TargetFrameworks> <AssemblyName>$(MSBuildProjectName).$(TargetFramework)</AssemblyName> </PropertyGroup> 表示ProGuard 运行以缩小/混淆您的库模块。这是您想要的,因为库模块无法知道它将在您的应用程序模块中使用哪些部分。

相反,库模块必须向app模块提供其相关的proguard规则(通过minifyEnabled false),然后app模块将运行ProGuard,其中包含自己的规则和库的规则,以最小化最终的应用程序APK