如何让安卓 gradle 项目更喜欢库依赖 AAR 而不是 JAR?



我有一个 android 库项目(称之为 my-lib),它在build.gradle文件中使用此技巧生成 AAR 和 JAR:

android.libraryVariants.all { variant ->
def name = variant.buildType.name
def task = project.tasks.create "jar${name.capitalize()}", Jar
task.dependsOn variant.javaCompile
task.from variant.javaCompile.destinationDir
artifacts.add('archives', task);
}

这个库项目不包含 Android 资源,并且生成了一个 JAR,以便其他一些不使用 maven 或 gradle 的系统使用。声明它们在 gradle 文件中依赖于此 android 库的 Android 应用程序,就像在他们的 gradle 文件中一样:

dependencies {
compile 'com.mycompany:my-lib:VERSION'
}

但是这些 android 应用程序正在选取 JAR 文件而不是 AAR,因此错过了 AAR 中的proguard.txt文件,该文件是使用库 gradle 文件中的声明放置在那里的:

android {
buildTypes.all {
consumerProguardFiles 'proguard-rules.pro'
}
}

安卓 gradle 插件生成的 pom 文件缺少packaging条目,它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-lib</artifactId>
<version>VERSION</version>
</project>

packaging条目应指定aar,以便其他项目获得 AAR 而不是 JAR,但我该怎么做呢?也许有一种方法可以生成具有不同名称的 JAR,这样它就不会与 AAR 冲突?

更新:

我无法在所有依赖项中指定@aar,因为某些依赖项是使用implementation project(':my-lib')指定项目的库,而 gradle 不接受那里@aar。然后,当我尝试将依赖项添加到应用程序时,出现此错误:D8: Program type already present使用my-lib中的类的名称。我确保我所有的依赖项都通过implementation而不是compile引用 my-lib,我看到在依赖库的中间 POM 文件中,引用如下所示:

<dependency>
<groupId>mycompany</groupId>
<artifactId>my-lib</artifactId>
<version>1</version>
<scope>runtime</scope>
</dependency>

所以运行时范围似乎是正确的。

我正在使用 https://github.com/dcendents/android-maven-gradle-plugin/插件将库发布到我的本地 maven 缓存中,以便不同 git 存储库中的许多其他 Android 应用程序可以访问 android 库。这出现在我的库build.gradle文件的顶部:

apply plugin: 'com.android.library'
apply plugin: 'android-maven'
group = 'com.mycompany'
version = '1'
repositories {
mavenLocal()
}

由于 Gradle Android Maven 插件是对标准 Maven 插件的修改,根据文档,您可以尝试:

uploadArchives {
repositories {
mavenDeployer {
pom.packaging = 'aar'
}
}
}

最新更新