添加本地.aar文件到我的gradle构build

所以我创build了一个Android库,并成功将其编译到.aar文件中,我称之为aar文件: "projectx-sdk-1.0.0.aar"现在我希望我的新项目依赖于这个aar,所以我做了是遵循这个职位: http : //life.nimbco.us/referencing-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构build文件:

 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 

你把你的flatDir块放在错误的repostories块中。 buildscriptrepositories块告诉Gradle在哪里findAndroid-Gradle插件,但不是其他的依赖关系。 你需要有另外一个顶级的repositories块:

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

我testing了这一点,它在我的设置上工作正常。

使用最新版本的Android Studio,使用1.3进行testing,使用本地.AAR文件,而不是从maven / jcenter存储库获取的文件,只需进入File> New> New module并selectImport .JAR / .AAR Package

你最终会得到的是你的项目中的一个新模块,它包含了非常简单的build.gradle文件,看起来或多或less像这样:

 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') } [...] 

这些天(在这个问题后超过1年)与Android Studio> 1.0,本地依赖确实工作正常:

  • android sdk在默认的本地$ANDROID_HOME/extras/android/m2repository/查找依赖: $ANDROID_HOME/extras/android/m2repository/
  • 在本地库项目中,您可以将aar发布到此目录。 这是一个可以添加到你的模块的build.gradle文件的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./gradlew uploadArchives发布到该目录
  • 在要使用库的应用程序项目中,将依赖项添加到您的项目/ app / build.gradle。 compile 'your.package:sdk-name:1.0-SNAPSHOT'

对于本地依赖,下一个gradle构build应该find以前部署的归档, 就是这样!


在我的情况下,我使用上述的本地开发,但也有一个竹连续集成服务器的图书馆,每个构build发布到共享的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存储库下载,我在项目/ build.gradle的“存储库”块中的jcenter()之上添加了内部的Nexus maven仓库

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

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

似乎添加.aar文件作为本地依赖尚不支持(计划在0.5.0testing版中受支持)

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