如何让android gradle项目更喜欢JAR上的库依赖AAR?

时间:2018-04-17 00:22:25

标签: android gradle

我有一个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的系统。 Android应用程序声明它们在gradle文件中依赖于这个安卓库,就像在gradle文件中一样:

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

但是这些Android应用程序正在拾取JAR文件而不是AAR,从而错过了AAR中的proguard.txt文件,该文件放在那里使用类似于库gradle文件中的声明:

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

android 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 repos中的许多其他Android应用程序都可以访问android库。它出现在我的库build.gradle文件的顶部:

apply plugin: 'com.android.library'
apply plugin: 'android-maven'

group = 'com.mycompany'
version = '1'

repositories {
    mavenLocal()
}

1 个答案:

答案 0 :(得分:0)

由于Gradle Android Maven插件是对标准Maven插件的修改,根据documentation,你可以试试这个:

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