【发布时间】:2020-01-07 08:29:57
【问题描述】:
我有一个带有许多模块的 Android Gradle 项目(只有 AAR,没有 APP)。
因为 Google 不支持胖 AAR,所以我需要自己重新打包(我尝试了多个胖 AAR Gradle 插件,但都没有实际工作,支持对我一点帮助都没有)。
所以我必须自己编写重新打包(作为 Groovy 脚本,直接进入我的 Gradle 构建系统)。
为此我需要:
- 构建许多 AAR - 这些是多个 Gradle 模块
- 将所有这些 AAR 重新打包到一个大 AAR 中 - 这是一个特殊的 Gradle 模块(上面的所有 AAR 都设置为此 AAR 的实现依赖项)
- 然后使用 DexGuard 混淆所有内容(没有 ProGuard/R8 - 这些太弱了)
重新包装对我来说很好。但是...
如果我执行此操作以确保干净的发布版本:
./gradlew clean :MbiSdkLibrary:assembleRelease
它首先清理所有内容,然后尝试构建我的 FAT 库。
问题在于 MbiSdkLibrary AAR 构建与依赖 AAR 的构建并行开始,而其他 AAR 的构建尚未完全完成。换句话说,Gradle 在确定构建顺序时似乎忽略了依赖关系。
随后,MbiSdkLibrary(最终的胖 AAR)的重新打包在来自其他(并行)构建的缺失 AAR 上随机失败(这是一场竞赛)。
当然,我可以通过这种方式实现构建(我测试过,效果很好):
- 首先使用单独的 gradle 命令构建依赖项 AAR
- 之后构建最终的胖 AAR(没有 clean 任务)
但是那个解决方案对我来说听起来很愚蠢,我相信 Gradle 不能被限制到无法正确地做这么简单的事情......
我还在 Google 上搜索了很多,并尝试了一些解决方法,例如这个:
- https://stackoverflow.com/a/42349993/8823423
- 由于某种原因它对我不起作用(对其他 Gradle 模块的任务依赖项对我不起作用)
我的问题与这个问题有关:Gradle Module Build Order。
抱歉,由于某种原因,我不被允许在那里交流,所以我不得不用另一个(非常相似的)问题来淹没 SO。
【问题讨论】: