我正在尝试使用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。正确的吗?
感谢您抽出时间阅读!
答案 0 :(得分:10)
据我了解, <PropertyGroup>
<TargetFrameworks>net4.0;net4.6</TargetFrameworks>
<AssemblyName>$(MSBuildProjectName).$(TargetFramework)</AssemblyName>
</PropertyGroup>
表示ProGuard 不运行以缩小/混淆您的库模块。这是您想要的,因为库模块无法知道它将在您的应用程序模块中使用哪些部分。
相反,库模块必须向app模块提供其相关的proguard规则(通过minifyEnabled false
),然后app模块将运行ProGuard,其中包含自己的规则和库的规则,以最小化最终的应用程序APK