1. 由来
在AndroidStudio中Android模块引用Android模块,不管是直接源码引用还是引用aar包,在最终的打包产物aar 中都不会包含这个被应用模块中的代码。
在SDK开发中,如果涉及到需要提供两个aar包,并且两个aar包中同时包含着相同的代码时,一种好的做法是将相同的代码抽取到一个基础库中,如果这个基础库使用Android模块,则基础库中的代码不会出现在任意一个aar中,此时可以使用java模块来实现
2. 实现
创建一个java模块,修改build.gradle
plugins {
id 'java-library'
}
def localProps = new Properties()
localProps.load(rootProject.file('local.properties').newDataInputStream())
def sdkDir = localProps['sdk.dir']
def platformsDir = new File(sdkDir, "platforms")
def latestAndroidJar = (platformsDir.listFiles() ?: [])
.collect { dir ->
// 匹配 android-33、android-33-ext4 这类,取出前面的数字 33 def matcher = (dir.name =~ /android-(\d+)/)
if (matcher.find() && new File(dir, "android.jar").exists()) {
int api = matcher.group(1) as int
return [api: api, jar: new File(dir, "android.jar")]
} else {
return null
}
}
.findAll { it != null }
.max { it.api }
?.jar
if (latestAndroidJar == null || !latestAndroidJar.exists()) {
throw new GradleException("在 ${platformsDir} 下没有找到任何 android-*/android.jar,请检查 Android SDK 安装")
}
// 这里选择你要对齐的 Android 平台版本
dependencies {
compileOnly files(latestAndroidJar)
// 还可以有别的 compileOnly 依赖
// compileOnly "androidx.annotation:annotation:1.9.0"
}
java {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}这样java模块就可以直接引用Android中类似Context之类的引用