【发布时间】:2019-05-13 16:38:54
【问题描述】:
我有一个封闭源代码库的简化项目架构:
- app
> references library1, library2
- library1
- library2
> references library3
- library3
所有 3 个库都会生成 aar 文件,这些文件可以像往常一样在应用依赖项中引用。
dependencies {
implementation project(":library1")
implementation project(":library2")
}
当我想使用混淆的aars(在发布模式下构建)测试我的应用时,问题就开始了。目前 Android 插件忽略了这一点,所以我发现的唯一方法是使用预先构建的 aars 来做到这一点。
dependencies {
//for debug build just use the local project
debugImplementation project(":library1")
debugImplementation project(":library2")
//for release build use manually added aar in libs folder
releaseImplementation (name: 'library1-release', ext: 'aar')
releaseImplementation (name: 'library2-release', ext: 'aar')
//i need to add library3 too otherwise it will not find
//method referenced there because aar are not bundled togheter
//by default
releaseImplementation (name: 'library3-release', ext: 'aar')
}
这很好用。
为此,我创建了一个像这样的小脚本(在 app/scripts/build-aar.sh 中)
//move from scripts folder to root project folder
cd "$(dirname "$BASH_SOURCE")/../../"
//assembleRelease all the aar (which enables Proguard obfuscation)
./gradlew clean assembleRelease --info &&
//copy them in the app libs folder
cp -rf library1/build/outputs/aar/library1-release.aar app/libs/library1-release.aar
cp -rf library2/build/outputs/aar/library2-release.aar app/libs/library2-release.aar
cp -rf library3/build/outputs/aar/library3-release.aar app/libs/library3-release.aar
这种方法的问题是我需要对 git 中的所有 aar 进行版本控制,否则当我选择“发布”作为构建变体时应用程序无法编译。
虽然我会在应用程序搜索它的依赖项之前对 libs 文件夹中的所有 aar 进行 gitignore 并即时构建它们。
我尝试过这样的事情:
applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
variant.preBuildProvider.configure {
dependsOn(buildReleaseAar)
}
}
}
task buildReleaseAar {
dependsOn (
':library1:assembleRelease',
':library2:assembleRelease',
':library3:assembleRelease'
)
doLast {
//copy the aars from build folders in app/libs folder
}
}
但是之前检查了依赖项,所以如果没有 libs 文件夹中的 aars,我什至无法再同步项目。
解决这个问题的伪逻辑应该是:
1) 为 (obfuscatedAar) 之类的依赖项制定新任务
2) 有此任务检查 libs 文件夹中是否有 aars,如果没有则在所有 3 个库上运行 assembleRelease 并将生成的 AARs 复制到那里
类似这样的:
configurations {
releaseObfuscatedAar
}
dependencies {
//other implementations libs
//for debug build just use the local project
debugImplementation project(":library1")
debugImplementation project(":library2")
releaseObfuscatedAar('library1')
releaseObfuscatedAar('library2')
releaseObfuscatedAar('library3')
}
//and some other task that build the aar before checking if
//dependency is present
问题:
- 这可能吗?
- 这是测试我在库项目中添加的 proguard 规则的好方法吗(并确保我没有破坏公共 API 混淆功能是否开启)?
【问题讨论】:
标签: android gradle groovy android-gradle-plugin