69

所以我创建了一个 Android-Library 并成功地将它编译成一个 .aar 文件我称之为这个 aar 文件:"projectx-sdk-1.0.0.aar"现在我希望我的新项目依赖这个 aar 所以我所做的就是关注这个帖子:http://life。 nimbco.us/reference-local-aar-files-with-android-studios-new-gradle-based-build-system/

但是这个帖子让我很困惑,因为我没有得到想要的结果:

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
4

6 回答 6

71

你把你的flatDir块放在错误的repostories块中。里面的repositoriesbuildscript告诉 Gradle 在哪里可以找到 Android-Gradle 插件,而不是其余的依赖项。您需要有另一个像这样的顶级repositories块:

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

我对此进行了测试,它在我的设置中运行良好。

于 2014-02-19T19:53:06.610 回答
43

使用最新版本的 Android Studio,使用 1.3 测试,使用本地 .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'
    compile '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')
}
[...]
于 2015-10-19T12:46:05.020 回答
23

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

于 2018-08-01T19:02:13.567 回答
5

这些天(在这个问题之后 1 年多)使用 Android Studio >1.0,本地依赖确实可以正常工作:

  • android sdk 在默认本地 repo 中查找依赖项:$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 发布到该目录
  • 在您要使用该库的应用程序项目中,将依赖项添加到您的项目/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 服务器获取新工件。

于 2015-05-06T19:16:49.863 回答
2

使用最新的 Gradle 版本,现在有一种稍微更新的方式来执行 Stan 建议的操作(请参阅maving publishing

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")
        }
    }
}
于 2018-01-08T21:01:27.403 回答
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

于 2014-02-19T19:13:26.800 回答