我有一个封闭的源库组的简化项目方案:
- app
> references library1, library2
- library1
- library2
> references library3
- library3
所有3个库都生成aar
文件,这些文件可以照常在应用程序依赖项中引用。
dependencies {
implementation project(":library1")
implementation project(":library2")
}
当我想使用模糊的aar
(在发布模式下构建)测试我的应用时,问题就开始了。目前,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进行版本控制,否则当我选择“ Release”作为构建变体时,应用程序将无法编译。
虽然我想忽略libs文件夹中的所有aar并在应用程序搜索其依赖项之前即时构建它们。
我已经尝试过这样的事情:
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文件夹中的aar,我什至无法再同步项目。
用于解决此问题的伪逻辑应该是:
1)为(obfuscatedAar)之类的依赖项添加新标签
2)执行此任务来检查libs文件夹中是否存在aar,是否不对所有3个库都运行assembleRelease并在其中复制结果aar
类似这样的东西:
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-rules的一种好方法(并确保在 混淆开始了吗??
答案 0 :(得分:0)
我知道我的回答来晚了。
我遇到了类似的问题,我依靠本地的maven存储库(位于~/.m2
中的默认存储库)解决了该问题。
一开始我的方法基本上是使:app:assemble${variant.name}
任务依赖于:my-library:publishToMavenLocal
。
这种方法行之有效,但是在库将其dependencies {...}
放在本地maven存储库之前,仍会评估aar
块。另外,如果仅在Android Studio / IntelliJ中同步项目,则assemble
任务将不会运行。
因此,这就是我最后要做的:
tasks.getByPath(":prepareKotlinBuildScriptModel").dependsOn(":library:publishToMavenLocal")
这使得在同步项目时用您的aar
填充本地Maven存储库,因此在以后的步骤中可以满足对这些aar
的依赖。
如果您想尝试一下,请不要忘记在mavenLocal()
闭包中添加repositories {...}
。
当然,此解决方案附带成本,这是每次同步时本地maven部署的成本。就我而言,它相对较快(由于gradle缓存),但只说:)