如何在我的 Android 库 (AAR) 中包含 proguard 配置

Posted

技术标签:

【中文标题】如何在我的 Android 库 (AAR) 中包含 proguard 配置【英文标题】:How to include a proguard configuration in my Android library (AAR) 【发布时间】:2015-07-23 22:47:30 【问题描述】:

根据AAR file spec,android 库包含一个“proguard.txt”文件。 我的理解是这个文件声明了如何正确地混淆和缩小库。就我而言,我需要保留一些 API 类。

如何在库的 build.gradle 中声明库的 proguard.txt 文件?创建使用我的库的应用程序 (APK) 时会自动读取此文件吗?

我没有在 Android 的 Gradle 插件用户指南中找到此信息。

【问题讨论】:

这似乎是***.com/questions/26983248/…的副本 @kevinpelgrims 这是关于为外部库用户分发带有嵌入式 proguard 配置的 AAR 文件,我不希望答案是相同的,即库类不会在多模块构建。不过问题是相似的。 【参考方案1】:

在 Gradle 文件的默认配置闭包中,使用 consumerProguardFiles 而不是 proguardFiles 指定 Proguard 文件。例如:

defaultConfig 
    consumerProguardFiles 'proguard.txt'

【讨论】:

consumerProguardFiles 应该在defaultConfig 而不是buildTypes/release 中指定,以便在使用应用程序在调试和发布模式下进行保护时它可以工作(例如,避免65k dex 方法限制)。 如果您使用的是 gradle 实验插件(0.7.2),则会导致此错误:原因:org.gradle.api.internal.ExtensibleDynamicObject。 build.gradle 的好例子在这个链接中:github.com/artem-zinnatullin/RxJavaProGuardRules/blob/master/…【参考方案2】:

ProGuard 人工制品

[ProGuard workflow]

人工制品未缩小,消费者自行解决

库是开源的,但作为库开发人员,您可以提供一个 ProGuard 文件,消费者(应用程序)将根据需求(消费者中的minifyEnabled true)考虑该文件。 consumerProguardFiles 在您的库中build.gradle。它在人工制品中添加proguard.txt 文件(与.pro 相同)

例如,您的库是开源的,应用程序开发人员希望缩小所有内容

android 
    defaultConfig 
        //consumerProguardFiles '<file_path>'
        consumerProguardFiles 'proguard-rules.pro'
    

    buildTypes 
        release 
            minifyEnabled false
        
    
    //...

人工制品被缩小

库是封闭源代码 - 您可以使用下一种可能性:

android 

    buildTypes 
        release 
            minifyEnabled true
            //proguardFiles project(':<project_name>').file('<file_path>')
            proguardFiles 'proguard-rules.pro'
        
    
    //...

*请注意:

minifyEnabled trueproguardFiles project 都应该设置。 如果您使用单个 minifyEnabled true&lt;file_path&gt; 是错误的 - classes.jar 是空的。 如果单个proguardFiles project - 无效

关于library - application 示例的构建过程 - 所有.class 文件将合并到具有.dex 扩展名的单个存档中

【讨论】:

“创建库”和“将库作为存档分发”是什么意思?我想在创建库时,它打算用作其他库或应用程序中的依赖项。在那种情况下,它不应该总是 minifyEnabled false,因为这里的“库”模块不知道其他库/应用程序将引用什么函数,并且很难确定要缩小/混淆什么?

以上是关于如何在我的 Android 库 (AAR) 中包含 proguard 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android库AAR中包含第三方JAR,而无需合并代码

Android库项目瞬态依赖松散AAR类型

如何发布带有远程依赖项 (gradle) 的 Android 库 (aar)?

如何在android studio项目中包含共享库?

如何防止 ProGuard 在输出 jar 中包含引用的库

如何在我的 Swift 项目中包含一个库?