懒惰的Android依赖项。如何在gradle依赖关系解析之前构建AAR库

时间:2019-05-13 16:38:55

标签: android gradle groovy android-gradle

我有一个封闭的源库组的简化项目方案:

- 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的一种好方法(并确保在   混淆开始了吗??
  •   

Reference to same question in Gradle Forum

1 个答案:

答案 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缓存),但只说:)