使用“ flatDirs”将本地.aar文件添加到Gradle构建中不起作用


159

我知道这个问题:将本地.aar文件添加到我的gradle版本中但是该解决方案不适用于我。

我尝试将以下语句添加到build.gradle文件的顶层:

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

我还将slidingmenu.aar文件放入/libs并在本dependencies节中进行了引用:compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar',并但它根本不起作用。

我试过了 compile files('libs/slidingmenu.aar'),但是没有运气。

我想念什么?有任何想法吗?

PS Android Studio 0.8.2


1
flatDirs + compile(name:'libname',ext:'aar')在Android Studio 8.2.0上适用于我,+ gradle 1.12。因此,您的构建文件一定有问题。再检查一次或发布更多代码

Answers:


293

以约西亚的回答为基础,这就是我如何使它起作用的方法。

按照他的指示(在编辑中)(文件->新建->新模块->导入.JAR / .AAR)并导入.AAR。

然后在您的项目build.gradle中(不是顶层,在“ app”下的顶层)中添加以下内容(在“依赖项”部分中):

dependencies {
    compile project(':Name-Of-Your-Project')
}

注意“您的项目名称”应与导入AAR文件后添加的文件夹名称匹配(与 app/.idea最顶层文件夹。或者换种说法...

我的应用程序
  。理念
  应用程式
  build.gradle(这里是将编译项目(':ProjectName')添加到依赖项的位置)
  ProjectName(导入后自动添加,与您的aar文件的名称匹配)
  建立
  摇动
  等等

这对运行Android Studio 0.8.0的我有用。完成此操作后,不要忘记同步gradle(使用工具栏按钮或在File-> Synchronize中)。

(感谢Josiah让我朝正确的方向前进)

(注意:在此之前,我尝试将其添加到libs文件夹中,尝试操纵顶层build.gradle和应用程序级别build.gradle,但是这些都不适合我的aars文件-jar可以正常使用,但aar文件不能正常工作)


1
kes!这确实有用,谢谢您的详细说明。在后台,导入大师执行与工具站点上所述相同的操作:“另一个选择是创建一个新的Gradle子项目,并使该项目的已发布工件成为要重用的jar或aar文件。然后,可以简单地让其他Gradle子项目依赖于这个新的子项目。在这个新的子项目中,只需使用以下内容创建一个build.gradle:configuration.create(“ default”)artifact.add(“ default”,file ('somelib.aar'))“
Alexey Dmitriev

我收到错误消息:Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.如果使用compile project(name:'mylibrary-debug')..我会缺少什么?
MysticMagicϡ

2
最近的gradle插件打破了这一点。此处的解决方案:stackoverflow.com/a/28816265/560600
Sky Kelsey 2015年

1
完成上述所有步骤后,也请执行Clean Build。
广告

1
在这一行中compile project(':Name-Of-Your-Project'),我替换Name-Of-Your-Project为.aar文件的名称(不带.aar扩展名)。而且有效。
苏菲安

190

更新:如@ amram99所述,此问题已在Android Studio v1.3发行版中得到修复。

经过以下规格测试和验证

  • Android Studio v1.3
  • gradle插件v1.2.3
  • Gradle v2.4

现在有效

  • 现在您可以通过Android Studio v1.3中的File> New> New Module> Import .JAR / .AAR Package选项导入本地aar文件

  • 但是,无论Android Studio的更改是基于Gradle脚本编写的,以下答案都是正确有效的。


旧答案: 在最近的更新中,android的人们通过Android Studio的添加新模块菜单选项打破了对本地aar文件的包含。检查此处列出的问题。不管IDE的功能列表中有没有内容,下面的方法在处理本地aar文件时都有效(今天已对其进行了测试):

将aar文件放在libs目录中(如果需要,请创建它),然后在build.gradle中添加以下代码:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
这是正确的答案,也是最新的做法。请赞成这个答案;)
lmo 2015年

我复制了您的代码,但是您知道为什么我会出现此错误吗?“错误:配置项目':app'时出现问题。>找不到工件'signalr-client-sdk-android-release.aar(:signalr-client-sdk-android-release :)'。在以下位置搜索: jitpack.io//signalr-client-sdk-android-release//...
toddmo

10
repositories部分为了工作而有所不同 build.gradle -全局部分。该dependencies零件进入模块的中build.gradle。这就是为什么我得到错误。
toddmo

@toddmo所以我的答案实际上适用于本地AAR文件。即位于您的libs目录中的.aar文件。
Nishant。

1
谢谢。旧版本对我不起作用,新导入方式效果很好!Gradle 3.5,版本2.4.10
Arnold Schrijver

26

编辑: 使用本地AAR文件作为构建依赖项的正确方法(当前)是使用模块导入向导(文件|新建模块|导入.JAR或.AAR包),该向导将自动将.aar添加为库模块在您的项目中。

旧答案

试试这个:

allprojects {
  repositories {
    jcenter()
    flatDir {
      dirs 'libs'
    }
  }
}

...

compile(name:'slidingmenu', ext:'aar')

1
也不起作用...看来这是一个尚未修复的已知错误:code.google.com/p/android/issues/detail?id=55863
Alexey Dmitriev

我按照您在编辑中所说的做了,但最后没有添加任何内容。在向导中,我选择了AAR文件的路径,指定了模块名称。单击完成后,它正在同步Gradle文件,但没有新文件或build.gradle中的任何行出现(我的Git的工作副本中没有任何更改)。我尝试对AAR和JAR文件使用相同的结果。(我使用的是Android Studio 0.8.1)
Alexey Dmitriev 2014年

3
只要我包含flatDir { dirs 'libs' }OP中使用AS 8.13 / Gradle 2.1
qix 2014年

4
我使用新的导入方法导入了.aar文件。但是,当我输入一半名称并按ctrl +空格时,我看不到库的类名。因此它仍然不考虑库。任何想法?
MysticMagicϡ

1
编辑后的版本适用于Android Studio 1.2.1.1。无需执行其他Gradel脚本。您可以像上面描述的那样创建一个新模块。在“创建新模型”对话框中,选择库aar文件的路径,例如MyLib \ mylibrary \ build \ outputs \ aar。AS会将文件复制到新的本地文件夹。重建您的应用程序项目,新的库模块将显示在项目视图中。现在,您可以将库模块添加为项目结构中应用程序模块(例如“ app”)的依赖项:模块| 应用| 依赖| 添加| 模块依赖性。
Christian Schulzendorff 2015年

15

我在Android Studio 2.1上进行了这项工作。我有一个名为“ Native_Ads”的模块,该模块在多个项目中共享。

首先,我在Native_ads模块中创建了一个名为“ aars”的目录,然后将aar文件放入其中。

目录结构:

libs/
aars/    <-- newly created
src/
build.gradle
etc

然后,其他更改:

顶级Gradle文件:

allprojects {
    repositories {
        jcenter()
        // For module with aar file in it
        flatDir {
            dirs project(':Native_Ads').file('aars')
        }
    }
}

应用模块的build.gradle文件:-不变

Settings.gradle文件(包括模块):

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')

Native_Ads模块的Gradle文件:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}

而已。清洁并建造。


也适用于“ Native_Ads”中的多个aar文件。很好的解决方案!
Christian Schulzendorff

8

现在最简单的方法是将其添加为模块

在此处输入图片说明

这将创建一个包含aar文件的新模块,因此您只需要在以后将该模块包含为依赖项即可


您可能有一个想法,为什么选择“导入”后对话框next上我的按钮显示为灰色?Create New ModuleJAR/AAR Package
凯文·克兰

1
请注意,我选择了.aar文件并给它起了一个名字
-Kevin Crain

我发现了原因,IDE正在检查路径以确定.aar文件是否在项目目录中,我只是将其.aar放在桌面上并重试即可,谢谢您的解决方案!
凯文·克兰

也许这是一个愚蠢的问题,但是关于so you just need to include that module as a dependency afterwards-您如何做到这一点?
boltup_im_coding

1
@MarianKlühspies我现在看到了,我不确定include在里面settings.gradle装足够的东西。我知道了 谢谢!
boltup_im_coding

7

这是我的结构,以及解决方法:

MyProject / app / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

build.gradle上

来自Project / app / myModulesFolder / myLibXYZ

我把这个:

repositories {
   flatDir {
    dirs 'libs', '../../libs'
  }
}
compile (name: 'mylib-1.0.0', ext: 'aar')

做得很好,我的子模块XYZ依赖于主模块中的某个库。


5

您可以这样进行。它需要采用Maven格式:

repositories {
  maven { url uri('folderName')}
}

然后,您的AAR需要进入文件夹结构中,以获得组ID“ com.example”:

folderName/
  com/
    example/
       verion/
          myaar-version.aar

然后引用作为依赖项:

compile 'com.example:myaar:version@aar'

version您的aar文件的版本在哪里(例如3.0等)


3

对于从Android Studio 1.4开始存在此问题的任何人,我都可以通过在项目中创建一个包含2件东西的模块来使其工作。

  1. build.gradle具有以下内容:

    configurations.create("default")

    artifacts.add("default", file('facebook-android-sdk-4.7.0.aar'))

  2. aar文件(在此示例中为“ facebook-android-sdk-4.7.0.aar”)

然后将新库包含为模块依赖项。现在,您可以使用内置的aar,而无需在项目中包含源代码。

归功于Facebook的这种黑客攻击。我在将Android SDK集成到项目中的同时找到了解决方案。


您创建了哪种模块?文件>新建>新建模块>?
Al Lelopath

在这种情况下,如果您使用GUI创建模块,则模块类型为“ Android库”。您可以通过修改模块的build.gradle将现有模块制作为Android库。更改 apply plugin: 'com.android.application'apply plugin: 'com.android.library'
维克多·乌德

是否可以在一个模块中添加多个aar?否则,我将需要创建超过10个gradle模块,以便包含我的aar文件
MarianKlühspies18年

自从我最初编写此答案以来,@MarianKlühspies发生了很大变化。我建议您尝试在项目中加入aar的官方文档:developer.android.com/studio/projects/…–
维克多·乌德

3

就我而言,以上所有答案均无效!因为我有不同的产品repositories{ flatDir{ dirs 'libs' } }

不工作!我最终指定了libs目录的确切位置:

repositories{
flatDir{
    dirs 'src/main/libs'
}

}

当build.gradle中有不同的产品时,猜猜应该引入这样的flatDirs


2

就我而言,我只是将aar文件放入libs,然后添加

dependencies { ... api fileTree(dir: 'libs', include: ['*.aar']) ... }

在build.gradle中,它可以工作。我认为这与默认生成的依赖项相似:

implementation fileTree(dir: 'libs', include: ['*.jar'])


“ api fileTree(dir:'libs',include:['* .aar])”效果很好。如果我使用“实现”而不是“ api”,则它不起作用。我永远无法获得Victor Ude的解决方案来与多个aar一起使用。另一种见解:如果您正在使用资源(例如布局),请确保链接到的aar不包含与apk中名称相同的资源。它可能会给您一个错误,提示您无法在布局中找到ID之一。问题是它在aar布局中为ID使用了错误的名称空间。
Tom Rutchik

1

此行包括文件夹中的全部aarjar文件libs

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/')

0

在应用gradle文件实现项目中添加以下内容(路径:“:项目名称”)


0

如果您已经在使用Kotlin Gradle DSL,则可以通过以下方式使用它:

这是我的项目结构

|-root
|----- app
|--------- libs // I choose to store the aar here
|-------------- my-libs-01.aar
|-------------- my-libs-02.jar
|--------- build.gradle.kts // app module gradle
|----- common-libs // another aar folder/directory
|----------------- common-libs-01.aar
|----------------- common-libs-02.jar
|----- build.gradle.kts // root gradle

我的 app/build.gradle.kts

  1. 使用简单的方法 fileTree
// android related config above omitted...

dependencies {
    // you can do this to include everything in the both directory
    // Inside ./root/common-libs & ./root/app/libs
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(fileTree(mapOf("dir" to "../common-libs", "include" to listOf("*.jar", "*.aar"))))
}
  1. 使用相同的方法,例如从本地/远程Maven存储库中获取 flatDirs
// android related config above omitted...

repositories {
    flatDir {
        dirs = mutableSetOf(File("libs"), File("../common-libs") 
    }
}

dependencies {
   implementation(group = "", name = "my-libs-01", ext = "aar")
   implementation(group = "", name = "my-libs-02", ext = "jar")

   implementation(group = "", name = "common-libs-01", ext = "aar")
   implementation(group = "", name = "common-libs-02", ext = "jar")
}

group需要,由于其强制性的(不可选/有默认值)在科特林implementation,见下图:

// Filename: ReleaseImplementationConfigurationAccessors.kt
package org.gradle.kotlin.dsl

fun DependencyHandler.`releaseImplementation`(
    group: String,
    name: String,
    version: String? = null,
    configuration: String? = null,
    classifier: String? = null,
    ext: String? = null,
    dependencyConfiguration: Action<ExternalModuleDependency>? = null
)

免责声明:使用1号和 flatDirs 2号方法,我还是不太了解,您可能需要编辑/评论此答案。

参考文献:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/9272
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.