android studio生成依赖的aar

bla*_*ury 6 android gradle android-studio

我有一个库项目(A)引用另一个jar文件(B.jar),但是在生成aar文件之后,jar文件(B.jar)没有捆绑在输出aar文件中,当使用这个aar文件时,我得到了a NoClassDefFoundError.

有没有办法让gradle捆绑输出aar文件中的所有依赖类?这是我的build.gradle:

apply plugin: 'com.android.library'

repositories {
    mavenCentral()
}

android {

    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile project(':common')
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
Run Code Online (Sandbox Code Playgroud)

ald*_*dok 7

有没有办法让 gradle 捆绑输出 aar 文件中的所有依赖类?

是的,有办法做到这一点,我以前遇到过这个问题。但这将是一个很长的故事,请耐心等待。

背景

当您在 build.gradle 中指定依赖项时,您是在告诉 Gradle 从 Maven 存储库下载工件(AAR / JAR)。所以,Gradle 需要两件事:

  1. Maven 存储库位置
  2. 依赖本身

您在顶级指定 Maven 存储库 build.gradle

repositories {
    jcenter()
    google()
}
Run Code Online (Sandbox Code Playgroud)

并且您指定对项目级别的依赖 build.gradle

dependencies {
    compile 'com.example:mylibrary:1.0.1'
}
Run Code Online (Sandbox Code Playgroud)

Gradle / Maven 如何知道mylibrary需要其他依赖项?从你的依赖POM 文件

POM 示例

以Square的OkHttp为例,你可以在mvnrepository.com中找到这个神器。

OkHttp神器

OkHttp 有一个 POM 文件。您可以单击该链接以显示完整的 XML,我只向您展示了有趣的部分,即依赖项块。

<project>
   <modelVersion>4.0.0</modelVersion>
   <parent>...</parent>
   <artifactId>okhttp</artifactId>
   <name>OkHttp</name>
   <dependencies>
      <dependency>
         <groupId>com.squareup.okio</groupId>
         <artifactId>okio</artifactId>
      </dependency>
      <dependency>
         <groupId>com.google.android</groupId>
         <artifactId>android</artifactId>
         <scope>provided</scope>
      </dependency>
      <dependency>
         <groupId>com.google.code.findbugs</groupId>
         <artifactId>jsr305</artifactId>
         <scope>provided</scope>
      </dependency>
   </dependencies>
   <build>...</build>
</project>
Run Code Online (Sandbox Code Playgroud)

OkHttp 需要来自其他工件的依赖项。Okio、Android 和 jsr305。但是当您在项目中包含 OkHttp 时,您不必在项目中包含 Okio、Android 和 jsr305。这是为什么?

因为 Gradle / Maven 会查看 POM 文件并为您下载依赖项。没有了NoClassDefFoundError

你的图书馆项目

回到您的问题,如何将您的库项目“组合”成单个 .aar?以下是步骤:

  1. 将您的依赖项(您的 JAR 或 AAR)发布到 Maven 存储库中。

您的依赖项很有可能已经存在于 mvnrepository 上,如果它不存在,您可以在 bintray、mvnrepository 上提交您的依赖项,或者托管您自己的 Maven 存储库。

  1. 为您的 AAR 创建一个 POM 文件。

就像在 OkHttp 依赖项块中一样,您将库依赖项放在那里。

  1. 将您的库 AAR 提交到 Maven 存储库。

您可以使用mvndeploy将您的库提交到 Maven 存储库。

mvn deploy:deploy-file \
    -DgroupId=com.example \
    -DartifactId=your-library \
    -Dversion=1.0.1 \
    -Dpackaging=aar \
    -Dfile=your-library.aar \
    -DpomFile=path-to-your-pom.xml \
    -DgeneratePom=true \
    -DupdateReleaseInfo=true \
    -Durl="https://mavenUserName:mavenPassword@nexus.example.com/repository/maven-releases/"
Run Code Online (Sandbox Code Playgroud)

如果您不想手动执行第 2 步和第 3 步,您可以猜到,“有一个 gradle 插件!”。该插件是android-maven-publish,归功于: wupdigital 使这些过程更容易。

现在您可以使用 gradle 命令来发布您的库:

gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
Run Code Online (Sandbox Code Playgroud)

如何共享您的图书馆项目

下次你的队友要你的图书馆时,你可以给他们两件事:

  1. 包含您的库及其依赖项的 Maven 存储库
  2. 您的库组、工件和版本名称

就是这样!无需将您的依赖项提供给您的同行。

干杯

  • 我认为没有办法,但也许你知道的比我多……是否可以用我的 .aar 添加本地依赖项(我的 libs 文件夹中的文件)?我的意思是,无需将文件上传到 Maven 或其他存储库... (3认同)

Bil*_*ote 0

你想要做的事情是不可能的——至少按照你上面描述的方式是不可能的。