Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gradle api不适用于Android Studio中的多项目设置_Android_Android Studio_Gradle_Aar - Fatal编程技术网

gradle api不适用于Android Studio中的多项目设置

gradle api不适用于Android Studio中的多项目设置,android,android-studio,gradle,aar,Android,Android Studio,Gradle,Aar,我有一个多项目设置。考虑两个单独的应用程序Appa和Appb。AppA有两个库模块modA和modB。modA通过gradleapi依赖于modB 考虑modAbuild.gradle文件 dependencies { api project(":mobB") } dependencies { implementation project(":modA") } modA有一个文件ModASample.kt,看起来像 class ModA

我有一个多项目设置。考虑两个单独的应用程序Appa和Appb。AppA有两个库模块modA和modB。modA通过gradleapi依赖于modB

考虑modA
build.gradle
文件

dependencies {
    api project(":mobB")
}
dependencies {
    implementation project(":modA")
}
modA有一个文件
ModASample.kt
,看起来像

class ModASample{
    fun modASample(){
        println("modASample")
    }
}
class ModBSample{
    fun modBSample(){
        println("modBSample")
    }
}
modB有一个文件
ModBSample.kt
,如下所示

class ModASample{
    fun modASample(){
        println("modASample")
    }
}
class ModBSample{
    fun modBSample(){
        println("modBSample")
    }
}
AppA
build.gradle
文件

dependencies {
    api project(":mobB")
}
dependencies {
    implementation project(":modA")
}
来自appA
AppASample.kt中的类

class AppASample{

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

}
class AppASample{

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

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

当我尝试提取
modA
aar
并尝试在
AppB
中使用此aar时,就会出现问题

AppB有
build.gradle
文件,如下所示

dependencies {
    implementation project(":modA")
}
现在,这一次准备了modA的
aar
,并作为一个单独的模块添加

从类
AppBSample.kt

class AppASample{

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

}
class AppASample{

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

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


任何建议都将不胜感激。

AAR不包含可传递的依赖项,它没有任何pom文件及其依赖项列表。 从我开发的库中检查build.gradle.kts:

您可以定义一个任务,创建一个包含所有源代码的jar文件

由于它是一个kotlin库,而不是Android,因此您应该使用以下内容对其进行更改:

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

我和另一个人一起工作

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


因此,为了将依赖项组合在一起,我们需要显式地将它们打包在一起。在我的例子中,我曾经将依赖项与aar打包在一起。

您将此aar放在modB的何处?您后续问题的上下文不是很清楚。你能补充一下吗?我看了下面的一些评论,似乎你想把modB作为modA的一个依赖项,有点像改造带来了okhttp,这是一个公平的说法吗?代码的目的只是描述这种情况。该库是针对Android的,有其他代码。但我会试试你的建议。如果AAR不包含可传递的依赖项,那么实现范围和api gradle概要文件仅限于多模块设置?这很奇怪。Api和实现只在编译时工作,它们是gradle项目的gradle特性。它们指导您以更好的方式沿多个模块组织代码。一旦构建,您的工件(aar、jar等)就不会有关于模块及其依赖模式(api或实现)的信息