【问题标题】:Lazy Android dependencies. How to build AARs libraries before gradle dependency resolution懒惰的 Android 依赖项。如何在 gradle 依赖解析之前构建 AARs 库
【发布时间】: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 混淆功能是否开启)?

Reference to same question in Gradle Forum

【问题讨论】:

    标签: android gradle groovy android-gradle-plugin


    【解决方案1】:

    我知道我的回答来晚了。

    我遇到了类似的问题,我依靠本地 maven 存储库解决了这个问题,它是位于 ~/.m2 的默认存储库。

    我一开始的方法基本上是让我的:app:assemble${variant.name} 任务依赖于:my-library:publishToMavenLocal

    这种方法可行,但在库将其aar 置于本地 maven 存储库之前,仍会评估 dependencies {...} 块。此外,如果您只是在 Android Studio/IntelliJ 中同步项目,assemble 任务不会运行。

    所以最后我是这样做的:

    tasks.getByPath(":prepareKotlinBuildScriptModel").dependsOn(":library:publishToMavenLocal")

    这使得本地 maven 存储库在同步项目时被您的 aar 填充,因此对这些 aars 的依赖在后面的步骤中得到满足。

    如果您想尝试一下,请不要忘记在您的 repositories {...} 闭包中添加 mavenLocal()

    当然,这种解决方案是有代价的,即每次同步时都部署本地 maven。就我而言,它相对较快(由于 gradle 缓存),但只是说:)

    【讨论】:

    • 最后我们通过在内部 maven 存储库上发布解决了它,但解决方案与您的类似。对不起,我忘了接受答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2015-02-23
    • 2020-11-17
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多