将本地.aar文件添加到我的Gradle构建中


67

因此,我创建了一个Android库并将其成功编译为.aar文件,我将此文件称为aar文件:"projectx-sdk-1.0.0.aar"现在,我希望我的新项目依赖于该aar文件,因此我要做的就是关注这篇文章:http:// life。 nimbco.us/使用Android Studios引用基于本地的Aar文件-新等级基于构建系统/

但是帖子使我感到困惑,因为我没有得到理想的结果:

aar的软件包名称是:com.projectx.photosdk并且其中的模块称为sdk

这是我当前的项目结构:

|-SuperAwesomeApp
|--.idea
|--gradle
|--App
|---aars
|----projectx-sdk-1.0.0.aar
|---build
|---jars
|---src
|---build.gradle

他是我的gradle构建文件:

apply plugin: 'android'

buildscript {
    repositories {
        mavenCentral()
        flatDir {
            dirs 'aars'
        }
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 11
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:gridlayout-v7:19.0.1'
    compile 'com.android.support:support-v4:19.0.1'
    compile 'com.android.support:appcompat-v7:19.0.1'


    compile 'com.projectx.photosdk:sdk:1.0.0@aar'
//    compile files( 'aars/sdk-1.0.0.aar' ) // Does not work either
}

//编辑

我得到的错误:

Failed to refresh Gradle project 'SuperAwesomeApp'
     Could not find com.projectx.photosdk:sdk:1.0.0.
     Required by:
     SuperAwesomeApp:App:unspecified

您遇到什么错误?
Scott Barta 2014年

对不起,忘记附上主题,请检查我在帖子中的编辑。
sn0ep

我也有一个相同的问题要解决,我正在使用您的解决方案,实际上我是android studio的新手,我怀疑您对模块内部所说的sdk表示什么,这意味着我无法理解您的意思。我用这行编译'com.projectx.photosdk:sdk:1.0.0@aar'您能帮我解决吗。
Manoj 2014年

您可以参考此工作解决方案stackoverflow.com/a/63029048/4136992
Kumar Utkarsh

Answers:


71

您将flatDir块放在错误的repostories块中。repositories里面的代码块buildscript告诉Gradle在哪里可以找到Android-Gradle插件,但不能找到其余的依赖项。您需要具有另一个顶层repositories块,如下所示:

repositories {
    mavenCentral()
    flatDir {
        dirs 'aars'
    }
}

我对此进行了测试,并且可以在我的设置上正常运行。


我印象深刻,这项工作!有任何官方文件吗?
galex 2014年

2
它对我不起作用,我添加了flatDir {dirs'aars'},但仍然在aar的编译行中收到错误.... ::
Richa

42

对于经过1.3版测试的最新版本的Android Studio,要使用本地.AAR文件而不是从maven / jcenter存储库中获取的文件,只需转到File> New> New module并选择Import .JAR / .AAR Package即可

您将最终得到的是项目中的一个新模块,其中包含非常简单的build.gradle文件,看起来或多或少像这样:

configurations.create("default")
artifacts.add("default", file('this-is-yours-package-in-aar-format.aar'))

当然,其他项目必须使用常规的编译项目指令来引用此新模块 。因此,在使用此新模块的项目中,该模块很简单,本地.aar文件的build.gradle中包含此文件

[...]
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    ompile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:design:23.1.0'
    [...]

    compile project(':name-of-module-created-via-new-module-option-described-above')
}
[...]

真好!如果您对gradle的编辑感到恐惧(或者可能不愿意写出模块名称),请双击刚刚添加的新模块,这将打开项目结构窗口。从那里,您可以选择您的应用程序模块,然后单击底部的+图标,然后选择所需的任何模块。
user819640 2015年

已经导入了模块,并且在我的项目中也仅使用相同模块的.aar文件和答案中所述的简单gradle文件创建了该文件。是否已正确导入?如果是,那么如何开始使用其中的类?
Darshan Miskin

这是正确的。这是文档
JohnWatsonDev '17

15

在带有gradle 3.0.1的Android Studio 3.1.3中。
只需添加implementation fileTree(dir: 'libs', include: ['*.aar'])implementation files('libs/app-release.aar')不添加任何其他flatdir作品。


3
这个家伙知道gradle。万分感谢!!:D
Naveen Niraula

5

这些天(此问题后超过1年),且Android Studio> 1.0,本地依赖项确实可以正常运行:

  • android sdk在以下默认本地存储中查找依赖项: $ANDROID_HOME/extras/android/m2repository/
  • 在本地图书馆项目中,您可以将aar发布到该目录。这是可以添加到模块build.gradle文件中的代码段(例如:sdk / build.gradle)

    apply plugin: 'maven'
    
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: "file://localhost" + System.getenv("ANDROID_HOME")
                    + "/extras/android/m2repository/")
                pom.version = '1.0-SNAPSHOT'
                pom.groupId = 'your.package'
                pom.artifactId = 'sdk-name'
            }
        }
    }
    
  • 在您的图书馆项目中,运行./gradlew uploadArchives以将aar发布到该目录
  • 在要使用库的应用程序项目中,将依赖项添加到project / app / build.gradle。 compile 'your.package:sdk-name:1.0-SNAPSHOT'

对于本地依赖性,下一个gradle构建应该找到先前部署的存档,仅此而已!


就我而言,我将上面的代码用于本地开发人员,但是对于该库,还有一个Bamboo连续集成服务器,该服务器将每个内部版本发布到共享的Nexus工件存储库中。然后,用于部署工件的完整库代码将变为:

uploadArchives {
    repositories {
        mavenDeployer {
            if (System.getenv("BAMBOO_BUILDNUMBER") != null) {
                // Deploy to shared repository
                repository(url: "http://internal-nexus.url/path/") {
                    authentication(userName: "user", password: "****")
                }
                pom.version = System.getenv("BAMBOO_BUILDNUMBER")
            } else {
                // Deploy to local Android sdk m2repository
                repository(url: "file://localhost" + System.getenv("ANDROID_HOME")
                        + "/extras/android/m2repository/")
                pom.version = '1.0-SNAPSHOT'
            }

            pom.groupId = 'your.package'
            pom.artifactId = 'sdk-name'
        }
    }
}

为了告诉应用程序要从我的内部Nexus存储库下载,我在project / build.gradle的两个“存储库”块中的jcenter()上方添加了内部Nexus maven存储库。

repositories {
    maven {
        url "http://internal-nexus.url/path/"
    }
    jcenter()
}

然后,与应用程序的依赖关系就好像compile 'your.package:sdk-name:45'当我将45版本更新为46时,我的项目将从Nexus服务器上获取新工件。


我刚刚尝试了Stan Kurdziel的建议,就能解决我的问题:< stackoverflow.com/questions/34445399/… >
Anil Gorthy

非常感谢你。
Piyush Malaviya'3

1

使用最新的Gradle版本,现在可以稍微修改一下Stan建议的方式(请参见发布

apply plugin: 'maven-publish'

publishing {
    publications {
        aar(MavenPublication) {
            groupId 'org.your-group-id'
            artifactId 'your-artifact-id'
            version 'x.x.x'

            // Tell maven to prepare the generated "*.aar" file for publishing
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
        }
    }
    repositories {
        maven {
            url("file:" + System.getenv("HOME") + "/.m2/repository")
        }
    }
}

0

似乎添加了.aar文件,因为尚不支持本地依赖关系(计划在0.5.0 Beta中受支持)

https://code.google.com/p/android/issues/detail?id=55863

但是,仅当您的库位于中央Maven存储库或本地Maven存储库中时,才可以使用依赖库的方式。

有关如何使用本地Maven存储库在模块依赖项中使用.aar的信息,请参见此内容。

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds


3
他链接到的博客文章的全部内容是如何通过创建一个伪造的存储库来解决Android-Gradle插件不支持本地AAR的事实,当使用Maven坐标样式依赖项时,它可以查看该存储库。
Scott Barta 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.