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

71

我已经创建了一个 Android 库并成功编译成了 .aar 文件。我将这个 aar 文件命名为:"projectx-sdk-1.0.0.aar"。现在我想让我的新项目依赖于这个 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

我也有一个同样的问题要解决,我正在使用您的解决方案。实际上,我是Android Studio的新手,我有一个疑问,内部称为sdk的模块是什么意思?我无法理解,那么我该如何使用这行代码compile 'com.projectx.photosdk:sdk:1.0.0@aar'?请帮助我解决。 - Manoj
您可以参考这个可行的解决方案 https://stackoverflow.com/a/63029048/4136992 - Kumar Utkarsh
7个回答

72

您将flatDir代码块放在错误的repostories块中。在buildscript内部的repositories块告诉Gradle在哪里找到Android-Gradle插件,但不是其余的依赖项。您需要再添加一个顶级的repositories块,像这样:

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

我测试过了,在我的设置上运行良好。


我对这个工作感到印象深刻!有关于它的官方文档吗? - galex
2
它对我不起作用,我已经添加了flatDir{dirs 'aars'},但在aar的编译行上仍然出现错误.... :( - Richa

43

最近的Android Studio版本(已测试1.3),要使用本地的.AAR文件而不是从maven/jcenter仓库获取的文件,只需转到文件 > 新建 > 新建模块,然后选择导入.JAR/.AAR文件包

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

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

当然,其他项目需要使用常规的< strong>编译项目指令引用这个新模块。所以在使用这个新模块的项目中,它的< strong>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')
}
[...]

不错!如果您对编辑gradle感到害怕(或者懒得写出模块名称),那么双击刚刚添加的新模块,它将打开项目结构窗口。从那里,您可以选择您的应用程序模块,然后单击底部的+图标并选择任何模块。 - user819640
我已经导入了该模块,并且在我的项目中也创建了它,只使用了相同模块的 .aar 文件和一个简单的 gradle 文件,就像答案中描述的那样。它已经被正确导入了吗?如果是的话,如何开始使用其中的类? - Darshan Miskin
这是正确的。这里是文档 - JohnWatsonDev
1
没有“导入.JAR/.AAR包”的选项。 - c0dehunter
这在去年之前是有效的,现在已经无法确定具体时间,但目前已经出现了问题。JAR类被应用程序识别,但不被IDE识别。 - Alberto M

24
在使用gradle 3.0.1的Android Studio 3.1.3中,只需简单添加implementation fileTree(dir: 'libs', include: ['*.aar'])implementation files('libs/app-release.aar')而不使用其他任何flatdir,即可生效。

5

如今(在这个问题提出后一年多),随着Android Studio >1.0版本的推出,本地依赖已经可以正常工作:

  • The android sdk looks for dependencies in a default local repo of: $ANDROID_HOME/extras/android/m2repository/
  • In a local library project you can publish the aar to this directory. Here's a snippet that can be added to your module's build.gradle file (ex: 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'
            }
        }
    }
    
  • In your library project, run ./gradlew uploadArchives to publish the aar to that directory
  • In the application project you want to use the library in, add the dependency to your 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存储库下载,我在项目/build.gradle中的两个“repositories”块中将内部Nexus maven存储库添加到jcenter()之上。
repositories {
    maven {
        url "http://internal-nexus.url/path/"
    }
    jcenter()
}

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

我刚刚尝试了Stan Kurdziel的建议,并成功解决了我的问题:https://dev59.com/RlsW5IYBdhLWcg3w7KxL。 - Anil Gorthy

2

最新的Gradle版本现在有一种稍微更新的方法来实现Stan所建议的内容(请参见maven发布

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

3
他链接的博客文章的整个意思是如何绕过Android-Gradle插件不支持本地AAR的限制,通过创建一个假存储库,在使用Maven坐标式依赖包含时插件可以查找到它。 - Scott Barta

0

这是针对 Kotlin DSL (build.gradle.kts) 的,假设您将文件放在相对于构建文件所在位置的 my-libs 子目录中:

dependencies {
    implementation(
        fileTree("my-libs/") {
            // You can add as many include or exclude calls as you want
            include("my-first-library.aar")
            include("another-library.aar")
            // You can also include all files by using a pattern wildcard
            include("*.jar")
            exclude("the-bad-library.jar")
        }
    )
    // Other dependencies...
}

如需更多实现方式,请参阅Gradle文档此篇文章以及此篇文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接