Android库项目瞬态依赖松散AAR类型

Posted

技术标签:

【中文标题】Android库项目瞬态依赖松散AAR类型【英文标题】:Android library project transient dependencies loose AAR type 【发布时间】:2014-11-19 11:41:54 【问题描述】:

我正在开发一个包含两个 android 库项目的项目。当我将这些库上传到我的 Maven 存储库 (Nexus) 时,生成的 pom 不会在依赖项中包含 <type>aar</type> 元素。

这是我的依赖树

* App1
 \
  * lib1
  |\
  | * lib2
  * Other libs

您可以在此图中看到我的app 依赖于lib1,而lib1 又依赖于lib2。这两个库都是 Android 库项目,因此是 AAR。

Lib1/build.gradle

apply plugin: 'com.android.library'
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

android 
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig 
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    provided project(':lib2')

    compile 'com.squareup.picasso:picasso:2.3.3'

Lib2/build.gradle

apply plugin: 'com.android.library'
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

android 
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig 
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
    compile 'com.squareup.retrofit:retrofit:1.6.1'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
    compile 'com.squareup.okhttp:okhttp:2.0.0'

注意Lib1 如何将Lib2 包含为project() 依赖项。

现在,当我使用 Chris Banes 出色的 gradle-mvn-push 插件部署它时,一切都按预期工作。在生成的 pom.xml 中我只注意到一个奇怪的地方。

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>lib2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    ...
</dependencies>

请注意,mavenDeployer 插件在生成 pom 时遗漏了依赖项中的 &lt;type&gt;aar&lt;/type&gt; 元素。

在我的应用项目(这是一个 maven 项目)中,我列出了这个依赖项:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>lib1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>aar</type>
    </dependency>
    ...
</dependencies>

尝试使用 Maven 构建它时,我收到以下错误。

Could not resolve dependencies for project com.example:app:apk:1.0.0-SNAPSHOT: The following artifacts could not be resolved: com.example:lib2:jar:0.0.1-SNAPSHOT

注意它是如何寻找库的 jar 版本的。我相信,由于 mavenDeployer 插件未在生成的 pom 的依赖项列表中生成 &lt;type&gt;aar&lt;/type&gt;,因此 maven 默认会查找 jar。

有人知道如何使用 Gradle 构建包含临时依赖项的 Android 库项目吗?

【问题讨论】:

【参考方案1】:

只需使用任何文本编辑器将 aar 添加到 pom 中。之后,打开一个控制台进入项目的根目录(pom 所在的位置)并运行“mvn clean install”。将生成 aar 工件并将其部署到您的 maven 存储库。

无论如何,使用 Maven 创建 aar 库要容易得多。只需使用任何 android 库原型创建一个 Maven 项目(de.akquinet 非常好,但您必须使用 3.8.2 和 3.9 之间的插件版本,http://mvnrepository.com/artifact/de.akquinet.android.archetypes)。只需创建项目,添加库,然后运行命令“mvn clean install”将它们安装到本地 maven 目录中。之后,只需将它们用作正常的 aar 依赖项即可。

【讨论】:

问题不在于创建库项目,而是依赖于其他 AAR 库的库项目在使用 mavenDeployer (uploadArchives) 部署时不保留 aar pom 中的依赖元素的一部分,因此 maven 尝试将这些临时依赖项解析为 jars(默认)。 我明白了。但是假设 pom 中的其他所有内容都可以,只需添加缺少的类型并手动运行 maven 就会生成 aars。 当然,但那时我正在手动构建我的依赖项,这否定了我使用 maven 的自动依赖项管理优势。我需要能够分发依赖于其他库的库,而无需担心每个用户都需要手动下载依赖项、修改 pom 并在本地构建它们。【参考方案2】:

试试 gradle-fury。它解决了所有这些……嗯……东西。特别是 gradle 生成的无效和/或不准确的 pom。确认发布到 sonatype oss/maven central 的工作解决方案。没有手动 pom 编辑、pgp 签名支持等等。

网站:https://github.com/gradle-fury/gradle-fury

具体来说,您需要为您完成所有工作的 maven-support gradle 脚本。通常在 pom 中的所有东西都存储在 gradle.properties 中。也支持 android 变体、war 文件(很快会修复 distZip)、javadocs 和源 jar 等等。

免责声明,我正在努力

编辑:另一条信息。尽管 fury 确实为 AAR 库注入了依赖项和正确的类型,但 gradle-android 插件(谷歌制作的东西)不尊重依赖项部分并忽略它。基本上不支持 AAR 项目的传递依赖。不知道为什么

【讨论】:

以上是关于Android库项目瞬态依赖松散AAR类型的主要内容,如果未能解决你的问题,请参考以下文章

如何发布带有远程依赖项 (gradle) 的 Android 库 (aar)?

Android将被依赖的库项目打包成aar(非jar)文件

如何在Android主项目中包含库项目中使用的aar文件

Android Gradle 插件Gradle 依赖管理 ⑨ ( implementation project 导入依赖库 Module | 导入aar文件作为依赖 | 先配置仓库再导入依赖 )

android studio aar能加密吗

创建一个包含所有颤振库和依赖项的 aar