使用gradle作为应用程序的一部分在AAR中生成资源

时间:2019-05-03 16:04:45

标签: android gradle android-glide gradle-kotlin-dsl

我得到了包含一些资源生成功能的库。我有完成生成资源的任务:

val updateWidgetResourcesProvider = tasks.register<Copy>("updateWidgetResources") {
    from("../../widget/")
    include("*.png")
    into("$sharedResLocation/raw")
    rename { "asset_$it".replace("@", "_").toLowerCase() }
}
android.libraryVariants.all {
    android.sourceSets[this.name].res.srcDirs(sharedResLocation)
    mergeResourcesProvider.configure {
        dependsOn(updateWidgetResourcesProvider)
    }
}

我运行:myLibrary:build时一切正常。

我还有一个应用程序,它使用库作为依赖项

dependencies {
    implementation(project(":myLibrary"))
}

问题在我构建:app:build时开始。任务updateWidgetResourcesProvider根本无法执行。如何制作资源生成任务,以便在调用:app:build:myLibrary:build时都能执行。另外,为什么myLibrary的资源合并是:app:build任务的一部分,却没有被调用?

如果我能读懂android gradle任务树,以及当我自己构建AAR或将其作为APK / Bundle的一部分构建库时,为什么会有所不同,我也将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试了不同的方法后,我找到了解决方案。

tasks.create<Copy>("updateWidgetResources") {
    val widgetResLocation = "$buildDir/generated/widgetResources"
    from("../../widget/")
    include("*.png")
    into("$widgetResLocation/raw")
    rename { "asset_$it".replace("@", "_").toLowerCase() }
    val task = this
    android.libraryVariants.all {
        registerGeneratedResFolders(files(widgetResLocation) {
            builtBy(task)
        })
    }
}