首页 文章

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

提问于
浏览
65

所以我创建了一个Android-Library并成功将其编译成.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构建文件:

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
}

// EDIT

我得到的错误:

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

6 回答

  • 41

    您将 flatDir 块放在错误的 repostories 块中 . buildscript 中的 repositories 块告诉Gradle在哪里可以找到Android-Gradle插件,而不是其他依赖项 . 你需要有另一个顶级 repositories 块,如下所示:

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

    我测试了这个,它在我的设置上运行正常 .

  • 5

    最新版本的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'))
    

    当然,其他项目必须使用常规的 compile project 指令引用这个新模块 . 所以在一个使用这个简单的新模块的项目中,一个本地.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')
    }
    [...]
    
  • 0

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

  • 1

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

    • android sdk在默认本地仓库中查找依赖项: $ANDROID_HOME/extras/android/m2repository/

    • 在本地库项目中,您可以将aar发布到此目录 . 这里's a snippet that can be added to your module' s 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'
            }
        }
    }
    

    对于本地依赖,下一个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存储库下载,我在项目/ build.gradle中的两个“存储库”块中的jcenter()上方添加了内部Nexus maven存储库

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

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

  • 69

    使用最新的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")
            }
        }
    }
    
  • 7

    似乎添加了.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

相关问题