【问题标题】:gradle api not working for multi project setup in Android Studiogradle api不适用于Android Studio中的多项目设置
【发布时间】:2021-02-24 18:12:21
【问题描述】:

我有一个多项目设置。考虑两个独立的应用 AppA 和 AppB。 AppA 有两个库模块 modA 和 modB。 modA 通过 gradle API 依赖于 modB。

考虑 modA build.gradle 文件

dependencies {
    api project(":mobB")
}

modA 有一个文件 ModASample.kt,看起来像

class ModASample{
    fun modASample(){
        println("modASample")
    }
}

modB 有一个文件 ModBSample.kt,看起来像

class ModBSample{
    fun modBSample(){
        println("modBSample")
    }
}

AppA build.gradle 文件

dependencies {
    implementation project(":modA")
}

来自 appA 中的一个类 AppASample.kt

class AppASample{

    fun access(){
        val modA = ModASample() //accessible
        val modB = ModBSample() //accessible
    }

}

ModASampleModBSamle 都可以访问,这也是预期的,因为 modB 通过 api 访问在 modA 中使用。

当我尝试提取modAaar 并尝试在AppB 中使用此aar 时,问题出现了。

AppB 有build.gradle 文件,看起来像这样

dependencies {
    implementation project(":modA")
}

这一次,modA 的 aar 已准备好并作为单独的模块添加。

来自班级AppBSample.kt

class AppASample{

    fun access(){
        val modA = ModASample() //accessible
        val modB = ModBSample() // NOT ACCESSIBLE
    }

}

任何人都可以提供一些见解为什么会发生这种情况。我期待 modB 可以访问,但如果使用直接 aar,情况并非如此。

任何建议将不胜感激。

【问题讨论】:

  • 你把这个 aar 放在 modB 的什么位置?
  • 您后续问题的上下文不是很清楚。能否请您添加它。
  • 我查看了下面的一些 cmets,您似乎想将 modB 作为 modA 的依赖项包含在内,有点像改造如何引入 okhttp,这是一个公平的说法吗?

标签: android android-studio gradle aar


【解决方案1】:

AAR 不包含传递依赖项,它没有任何包含其依赖项列表的 pom 文件。 从我开发的库中检查这个 build.gradle.kts:https://github.com/GiuseppeGiacoppo/RemoteConfig/blob/master/build.gradle.kts

您可以做的是定义一个任务来创建一个包含所有源的 jar 文件。

因为它是一个 kotlin 库而不是 Android,你应该用这个来改变它:

val sourcesJar by tasks.creating(Jar::class) {
    archiveClassifier.set("sources")
    from(android.sourceSets.getByName("main").java.srcDirs)
}

【讨论】:

  • 代码的目的只是为了描述情况。该库适用于 Android,除此之外还有其他代码。但我会试试你的建议。如果 AAR 不包含传递依赖项,实现范围和 api gradle 配置文件仅限于多模块设置?这很奇怪。
  • API 和实现仅在编译时工作,它们是您的 gradle 项目的 gradle 功能。它们指导您以更好的方式组织您的代码沿多个模块。构建后,您的工件(aar、jar 等)将不会包含有关模块及其依赖模式(api 或实现)的信息
【解决方案2】:

我让它与另一个 stackoverflow post 合作

我能理解的是,在打包 aar 文件时,提供的依赖声明修饰符(api/implementation)实际上并没有将依赖文件与包一起包含。尽管修饰符(api/implementation)仍然支持它们的预期用途,但它们似乎不负责将依赖项实际移动到包中。

因此,为了将依赖项一起引入,我们需要将它们显式打包在一起。就我而言,我使用maven publish plugin 将依赖项与 aar 一起打包。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多