当前位置: 首页 > 知识库问答 >
问题:

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

张翰海
2023-03-14

我有一个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文件中声明他们依赖于这个Android库,比如在他们的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,但是我如何做到这一点呢?也许有一种方法可以产生一个不同名称的罐子,这样它就不会与AAR冲突了?

更新:

我不能在所有依赖项中指定@aar,因为有些依赖项是使用实现项目(':my-lib')指定项目的库,而gradle在那里不接受@aar。然后,当我尝试将依赖项添加到应用程序时,我得到了这个错误:d8:Program type已经存在带有在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/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个答案

谭富
2023-03-14

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

uploadArchives {
    repositories {
        mavenDeployer {
            pom.packaging = 'aar'
        }
    }
}
 类似资料:
  • 问题内容: 我看到了类似的问题,但未找到可接受的答案。问题-我有一些小功能我自己的android库。我的库使用其他库-fe Hawk(无sql数据库)。我的图书馆gradle文件: 图书馆工作正常。如果我将它用作另一个项目中的项目-它也可以工作。但是当我生成文件(带有-> )并包含到单独的项目中时-失败。项目仅查看我的图书馆的班级。Hawk com.orhanobut.hawk软件包和off其他软

  • 我使用的是Android Studio1.4

  • 问题内容: 摘要: 我有一个依赖于JAR文件的AAR文件,当我构建AAR项目时,它不包含JAR代码。 细节: 我有一个Java SDK库项目,其中包含我们用于Java Web项目的代码,此类库是使用内部Nexus服务器(如JAR)创建的,并驻留在内部。 目的是通过一个AAR库提供此JAR库的“ Android配置”版本,多个Android应用程序可以使用该版本,并最大程度地减少了实现它的工作量(和

  • 摘要: 我有一个AAR文件,它依赖于一个JAR文件,当我构建AAR项目时,它不包含JAR代码。 我的AAR项目包含了Java SDK库(JAR)的gradle依赖项,但在构建时,AAR不包含来自它的任何类。 代码: 这是Java SDK项目的gradle文件: 注意2:我尝试在Android项目中添加到我的AAR依赖项,但这没有解决任何问题,真正的问题是在构建AAR项目时,JAR项目代码没有被捆绑

  • 我写了一些库,其中有一部分UI。此外,这个库使用另一个库。我想提供发行版来在任何应用程序中使用这部分UI。 我得库有下一个依赖项: /home/user/projects/mainapp/app/build/intermediates/explodede-aar/com.my.sdk/sdk/0.0.1/res/values/values.xml:78:21-29:找不到与给定名称匹配的资源:at

  • 问题内容: 当喜欢过? 何时以及何时使用哪种数据结构: 您想要高效的读写 应该具有更少的内存占用 尽管存在类似的问题,但它并没有突出表明应该优先选择哪个事实? 问题答案: 蜘蛛侠鲍里斯(Boris the Spider)已经概述了和之间最明显的区别-前者始终是有界的,而后者可以是无界的。 因此,如果您需要无限制的阻塞队列,或者将其用作工具箱中的最佳选择。 但是,假设您需要一个有限的阻塞队列。最后,