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

178

我知道这个问题:将本地的.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'),但没有成功。

我错过了什么吗?有什么想法吗?

P.S. Android Studio 0.8.2


1
flatDirs + compile(name: 'libname', ext: 'aar') 在我的 Android Studio 8.2.0 和 Gradle 1.12 上可以正常工作,因此你的构建文件肯定有问题。请再次检查或者贴出更多代码。 - Than
15个回答

303

在Josiah的回答基础上,这是我如何使其工作。

按照他的说明(在编辑下)(文件-> 新建-> 新模块-> 导入 .JAR/.AAR ),并导入您的 .AAR。

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

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

请注意,项目名称(Name-Of-Your-Project)应与导入AAR文件后添加的文件夹名称相匹配(即位于最高级别文件夹下的app/.idea同级)。或者换句话说...

MyApplication
  .idea
  app
  build.gradle (在此处将compile project(':ProjectName')添加到依赖部分)
  ProjectName(在导入后自动添加,名称与您的aar文件相匹配)
  build
  gradle
  etc

这在Android Studio 0.8.0上对我有效。在执行此操作后,不要忘记同步gradle(使用工具栏按钮或在文件->同步中进行同步)。

(感谢Josiah为我指明了正确的方向)

(注意:在此之前,我尝试将其添加到libs文件夹中,尝试操纵顶级build.gradle和应用程序级别的build.gradle等,但都无法使我的aar文件正常工作——jar文件可以正常工作,但aar文件不行)


1
哎呀!这个方法很管用,感谢您提供详细的解释。在幕后,导入主程序与工具网站上描述的操作是一样的:“另一个选项是创建一个新的Gradle子项目,并使该项目的发布构件成为您想要重用的jar或aar文件。然后,您可以让其他Gradle子项目依赖于这个新的子项目。在这个新的子项目中,只需创建一个build.gradle文件,其中包含以下内容:configurations.create(“default”)artifacts.add(“default”,file('somelib.aar'))”。 - Alex Dmitriev
2
最近的Gradle插件出了问题。解决方案在这里:https://dev59.com/d2Af5IYBdhLWcg3wlDYD#28816265 - Sky Kelsey
我知道这篇帖子有点老了,但这是一个非常好的解决方法;只需要稍微修改一下:在"build.gradle"文件中(这里是将"compile project(':ProjectName')"添加到依赖部分),这个是顶层的,而你之前提到的那个需要编辑的是(正如你在几行前所说)app内部的那个。 - MarcinKwiatkowski
1
请在完成以上所有步骤后进行“Clean Build”。 - Ads
1
compile project(':Name-Of-Your-Project') 这一行中,我用我的 .aar 文件的名称(不包括 .aar 扩展名)替换了 Name-Of-Your-Project。然后它就起作用了。 - Sufian
显示剩余3条评论

190

更新:正如@amram99提到的,自Android Studio v1.3发布以来,问题已经得到解决。

以下规格已测试并验证:

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

现在可用的功能:

  • 现在您可以通过Android Studio v1.3中的选项文件>新建>新建模块>导入 .JAR/.AAR 包导入本地aar文件。

  • 然而,以下答案不管Android Studio的更改如何都是正确和有效的,因为它基于gradle脚本。


旧答案:最近一次更新中,android团队破坏了通过Android Studio的添加新模块菜单选项包含本地aar文件的功能。请查看此处列出的Issue

无论IDE特性列表中的任何变化如何,下面的方法都适用于使用本地aar文件(今天测试):

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

在模块build.gradle中:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
在项目的build.gradle文件中:
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
这是正确的答案,也是最新的做法。请点赞此回答 ;) - lmo
11
“repositories”部分需要放在一个全局的“build.gradle”文件中,以使其正常工作。而“dependencies”部分则需要放在模块的“build.gradle”文件中。这就是我得到错误的原因。请注意,“repositories”和“dependencies”是Gradle构建系统中的两个重要部分。 - toddmo
即使在 Android Studio 1.4 (Beta4) 中,如果您有多个具有相同包名称(我没有设计这个,叹气...)的 .aar 文件,并且希望根据使用的 flavor 在应用程序中包含其中一个,则似乎这是唯一可行的解决方案。例如,flavor1Compile(...),flavor2Compile(...) 也可以工作。 - Nantoka
@AlexSales:你能具体说一下你那边出了什么问题吗? - Nishant Srivastava
1
谢谢。旧版本对我没用,新的导入方式很好用!Gradle 3.5,groovy 2.4.10。 - Arnold Schrijver
显示剩余13条评论

26

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

旧回答:

尝试这样做:

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

...

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

1
还是不行...看起来这是一个已知的错误,但尚未修复:https://code.google.com/p/android/issues/detail?id=55863 - Alex Dmitriev
3
只要我在AS 8.13 / Gradle 2.1中包含OP中提到的flatDir { dirs 'libs' }块,这个旧答案对我实际上是有效的。 - qix
4
我使用新的导入方法导入了一个 .aar 文件。但是当我输入类名的一半并按下 Ctrl + 空格时,我无法看到库的类名。因此它仍然没有考虑到这个库。有什么想法吗? - MysticMagicϡ
1
编辑后的版本在Android Studio 1.2.1.1上运行良好,无需进行其他gradle脚本编写。您可以像上面描述的那样创建一个新模块。在“创建新模型”对话框中选择库aar文件的路径,例如MyLib\mylibrary\build\outputs\aar。AS将把文件复制到一个新的本地文件夹中。重新构建应用程序项目,新的库模块将显示在项目视图中。现在,您可以将库模块作为应用程序模块(例如'app')的依赖项添加到项目结构中:Project Structure | modules | app | dependencies | Add | Module dependency。 - Christian Schulzendorff
这个可以工作。但是现在我有 /libs/foo.aar 和一个 *module /foo/,其中包含 build.gradle、foo.aar 和 foo.iml 文件。这似乎不好,因为项目中有两个 foo.aar 文件。 - Al Lelopath
显示剩余2条评论

17

我已经在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')
        }
    }
}

App模块的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

11

这个解决方案适用于Android Studio 4.0.1。

除了像上面的解决方案建议的那样创建一个新模块,您也可以尝试此解决方案。

如果您的应用程序中有多个模块,并且想要将aar添加到其中一个模块中,则可以使用此解决方案。

在您的根项目的build.gradle文件中

添加

repositories {
flatDir {
    dirs 'libs'
}}

然后在想要本地添加 .aar 文件的模块中,只需添加以下代码行。

dependencies {
api fileTree(include: ['*.aar'], dir: 'libs')
implementation files('libs/<yourAarName>.aar')

愉快编码 :)


8
现在最简单的方法是将它添加为一个模块。 enter image description here 这将创建一个包含aar文件的新模块,所以你只需要在之后将该模块作为依赖项包含即可。

你有没有想法,为什么在选择导入“JAR/AAR包”后,在“创建新模块”对话框中我的“下一步”按钮变灰了? - Kevin Crain
1
请注意,我已经选择了 .aar 文件并为其命名。 - Kevin Crain
我找到了原因,IDE正在检查路径以确定.aar文件是否在项目目录中,我只是将.aar文件放在桌面上并重试,它就可以工作了,感谢您的解决方案! - Kevin Crain
也许是一个愚蠢的问题,但关于“所以你只需要在之后将该模块作为依赖项包含进来” - 你怎么做呢? - boltup_im_coding
只需在依赖项中添加>compile project(":yourmodule"),或使用模块设置中的助手,即可轻松编译@boltup_im_coding。 - Marian Klühspies
1
@Marian Klühspies 我现在明白了,我不确定在settings.gradle中有include是否足够。我已经让它工作了。谢谢! - boltup_im_coding

7
在我的情况下,我只是将AAR文件放在libs中,并添加:
dependencies {
    ...
    api fileTree(dir: 'libs', include: ['*.aar'])
    ...
}

build.gradle中,它有效。我认为它与默认生成的依赖项类似。
implementation fileTree(dir: 'libs', include: ['*.jar'])

1
"api fileTree(dir: 'libs', include: ['*.aar])" 非常好用。如果我使用 "implementation" 而不是 "api",它就无法工作。我从未能够让 Victor Ude 的解决方案与多个 aar 一起工作。另一个要点是:如果您正在使用资源(例如布局),请确保链接的 aar 不包含与 apk 中相同名称的资源。这可能会导致错误,在布局中找不到其中一个 id。问题在于它在 aar 布局中使用了错误的命名空间。 - Tom Rutchik
1
在我的情况下,“implementation fileTree”这行代码完美地运行了。实际上,这是我尝试的唯一一个真正有效的解决方案。 - VictorEspina

7
这是我的结构以及我如何解决的方法:

MyProject/app/libs/mylib-1.0.0.aar

MyProject/app/myModulesFolder/myLibXYZ

build.gradle中,我已经加入了以下代码:

from Project/app/myModulesFolder/myLibXYZ

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

已经完成并且正常工作,我的子模块XYZ依赖于主模块中的某个库。


6

您可以用以下方式进行操作,需要使用maven格式:

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

接下来,您的AAR需要放置在"com.example"组ID的文件夹结构中:

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

然后将其作为依赖项引用:

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

其中version是您的aar文件的版本(例如3.0等)


5
在我的情况下,以上的答案都不起作用!因为我有不同的productFlavors,只需添加以下内容:
repositories {
    flatDir {
         dirs 'libs'
    }
}

没有起作用!我最终需要指定 libs 目录的确切位置:

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

build.gradle 中有不同的产品风味时,应该像这样介绍 flatDirs。


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