如何使用新的Gradle Android Build System手动包含外部aar包


406

我一直在尝试使用新的android构建系统,但遇到了一个小问题。我已经编译了自己的ActionBarSherlock的aar包,我将其称为“ actionbarsherlock.aar”。我想做的实际上是使用此Aar构建最终的APK。如果我使用编译项目(':actionbarsherlock')将整个ActionBarSherlock库作为一个android-library模块包含到我的主项目中,则可以成功构建,而不会出现任何问题。

但是我的问题是我想以手动方式将依赖项作为aar文件包提供,就好像我要使用JAR一样,我似乎也无法弄清楚如何将其正确地包含到我的项目中。我试图使用编译配置,但这似乎不起作用。我一直在编译过程中找不到符号,这告诉我aar包中的classes.jar没有包含在类路径中。

有谁知道手动将aar包作为文件包含的语法?

build.gradle

buildscript {

 repositories {
     mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4'
  }
}
apply plugin: 'android'

repositories {
   mavenCentral()
}
dependencies {
    compile files('libs/actionbarsherlock.aar')
}

android {
    compileSdkVersion 15
    buildToolsVersion "17.0"
}

编辑:所以答案是当前不支持,如果您要跟踪它,这就是问题

编辑:当前,因为仍不直接支持,最好的替代方法似乎是@RanWakshlak提出的解决方案

编辑:通过使用@VipulShah建议的语法也更简单


考虑一下Vipul Shah的回答:从Android Studio 0.5.8开始,它终于对我有用,没有本地maven存储库。
shkschneider 2014年

在这里看看我的问题和答案stackoverflow.com/a/31662782/746347
mixel

如果您使用的是Gradle 3.0.0或更高版本,则此简单的Gradle设置对我
有用

Answers:


670

请按照以下步骤进行操作(我已经在Android Studio 2.2上对其进行了测试)

假设您已将aar文件保存在libs文件夹中。(假设文件名为cards.aar

然后在应用程序中build.gradle指定以下内容,然后单击与Gradle文件同步项目。打开项目级别的build.gradle并flatDir{dirs 'libs'}像下面一样添加

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

现在打开应用程序级别的build.grdle文件并添加.aar文件

    dependencies {
       compile(name:'cards', ext:'aar')
}

如果一切顺利,您会看到库条目是在build-> exploded-aar中创建的

还要注意,如果要从另一个具有依赖项的项目中导入.aar文件,则也需要将其包括在build.gradle中。


5
@VipulShah libs目录在哪里?
StuStirling 2014年

2
也许应该建议将修改放在应用程序模块“ build.gradle”中,而不要放在顶部文件夹“ build.gradle”中。
loloof64 2015年

3
找到上述问题的答案:而不是compile依赖项添加两个依赖项,debugCompile(name:'cards-debug', ext:'aar')以及releaseCompile(name:'cards-release', ext:'aar')
Iftah

2
不要与示例代码混淆。第一块与allprojects {...}进入“项目”级别gradle文件,第二块与一起进入dependencies {...}“应用程序”级别gradle文件。
Kirill Karmazin

8
请更新您的答案:警告:配置“编译”已过时,并已由“实现”和“ api”代替。它将于2018年底删除。有关更多信息,请参见:d.android.com/r/tools/update-dependency-configurations.html
B-GangsteR

248
  1. 右键单击您的项目,然后选择“打开模块设置”

打开模块设置

  1. 单击窗口左上角的“ +”按钮以添加新模块。

添加新模块

  1. 选择“导入.JAR或.AAR包”,然后单击“下一步”按钮。

导入AAR

  1. 使用“文件名”字段旁边的省略号“ ...”找到AAR文件。

查找AAR文件

  1. 保持应用程序的模块处于选中状态,然后单击“ 依赖关系”窗格以将新模块添加为依赖关系。

依赖关系窗格

  1. 使用依赖项屏幕上的“ +”按钮,然后选择“模块依赖项”

添加模块依赖性

  1. 选择模块,然后单击“确定”

选择模块


4
最佳答案,请记住在此之后Alt+B>清理并重建项目。Android Studio为什么让您痛苦不已!我希望将NetBeans IDE用作Android开发人员平台
java acm

@Oliver您太棒了!
ankit purwar

你是最棒的!
codezombie

2
每当您只想aar向项目中添加一些库时,创建一个新模块都不是最好的主意
Kirill Karmazin

你真棒,我的朋友!为此加油。
蒂莫西·马卡里亚

111

您可以从存储库中引用aar文件。一个maven是一个选项,但是有一个更简单的解决方案:将aar文件放在libs目录中并添加目录存储库。

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

然后在依赖项部分中引用该库:

  dependencies {
        implementation 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
}

您可以查看Min'an博客文章了解更多信息。


1
这很有效,并且比公认的/评分更高的答案更好,因为它更简单,我可以将其包含在版本控制中,而无需将文件添加到每个开发人员的本地Maven存储库中(如果必须这样做,为什么要首先使用Gradle ?) 谢谢!
ajpolt 2014年

@ajpolt可能建议改为设置一个回购服务器(对于专有deps),这样您就不必将其放在开发机器上或项目的lib文件夹中。如果只有一个依赖项,请将其扔到Maven结构化的Google代码存储库中(作为临时存储库)
Lo-Tan

4
在此答案中要注意的最重要一点是在依赖项的末尾提及“ @aar”。
Atharva

我想这不会再有最新的插件的gradle工作:stackoverflow.com/questions/60878599/...
大卫

这是包括最简单形式,所有现代语法(包括implementation等等)的唯一答案。这就是复制粘贴解决方案。由于Android Build Gradle插件4.0.0现在引发错误而不是忽略损坏的.aar路径,因此出现了许多新的批评
Patrick

51

以下方法适用于最新的Android Studio(> v0.8.x):

  • 保存aar在应用程序模块的文件libs夹(如:<project>/<app>/libs/myaar.aar

  • 将以下内容添加到“应用”模块文件夹的build.gradle中(而不是项目根目录build.gradle)。注意编译行中的名称,它是myaar @ aar而不是myaar.aar。

    dependencies {
        compile 'package.name.of.your.aar:myaar@aar'
    }
    
    repositories{
        flatDir{
            dirs 'libs'
        }
    }
  • 请点击 Tools -> Android -> Sync Project with Gradle Files


3
在AS 1.0上运行完美
Pablo Johnson

1
万一有人需要它,如果gradle可以正常工作,但您仍然看不到类,请重新启动Android Studio ...
htafoya

1
该解决方案在AS2.2中非常有效-gradle似乎对AAR文件的语法非常挑剔。
吉姆·安德里亚斯

请更新或删除,编译已被废弃,也有这个问题:stackoverflow.com/questions/60878599/...
大卫

49

之前(默认)

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

只需添加'*.aar'include阵列。

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

它在Android Studio 3.x上运行良好。

如果要忽略某些库?做到这一点。

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')

1
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高答案的长期价值。
亚历山大

1
工作正常,如果库很简单,这就是方法。但是它们是一个问题:您需要导入所有在aar文件中导入的库,以使其起作用。从aar文件导入不会使用此方法传播。
Tobliug

或者,甚至更简单:implementation fileTree(include: ['*.?ar'], dir: 'libs')
Friederbluemle

@friederbluemle从理论上讲,我会说更简短,但同时又没有明确性,而不是简单。
大卫

21

我刚刚成功!

  1. mylib-0.1.aar文件复制到libs /文件夹中

  2. 将这些行添加到build.gradle的底部(应该是应用程序,而不是项目):

    repositories {
       flatDir {
           dirs 'libs'
       }
    }
    dependencies {
        compile 'com.example.lib:mylib:0.1@aar'
    }
  3. 到目前为止,一切都很好。这里是最重要的一点:

除非启用了离线模式,否则Gradle需要访问网络以获得依赖关系。

确保已通过“ 项目结构/等级”中的复选框启用了“ 离线工作

- 要么 -

配置代理设置为了访问网络。

要配置代理设置,您必须修改项目的gradle.properties文件,分别配置http和https,如下所示:

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=pass
systemProp.http.nonProxyHosts=localhost
systemProp.http.auth.ntlm.domain=example <for NT auth>

systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user
systemProp.https.proxyPassword=pass
systemProp.https.nonProxyHosts=localhost
systemProp.https.auth.ntlm.domain=example <for NT auth>

希望这行得通。


请更新或删除,编译已被废弃,也有这个问题:stackoverflow.com/questions/60878599/...
大卫

20

当前不支持引用本地.aar文件(由Xavier Ducrochet确认)

相反,您可以做的是建立一个本地Maven存储库(比听起来简单得多),然后从那里引用.aar。

我写了一篇博客文章,详细介绍了如何在这里工作:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds


当工件是快照时,我没有设法使其工作,为什么?
tbruyelle 2013年

您是否仅在Eclipse或Android studio上使用此功能?使用eclipse时,“ gradle eclipse”会将aar文件添加到类路径中,但是eclipse无法识别其中的类。
andrej_k

检查此问题stackoverflow.com/questions/20911665/…如果在遵循教程后未找到您的本地.aar文件(在Gradle 1.9或更高版本上)
Maragues 2014年

请更新或删除,此答案已过时。
大卫

18

aar只需几行代码即可添加多个依赖项。

添加本地flatDir资源库:

repositories {
    flatDir {
        dirs 'libs'
    }
} 

将每个aarin libs目录添加到compile依赖项配置中:

fileTree(dir: 'libs', include: '**/*.aar')
        .each { File file ->
    dependencies.add("compile", [name: file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name }, ext: 'aar'])
}

这行得通,但是如何进行检查,如果该依赖关系已经作为maven依赖项添加,那么我不希望需要添加aar文件,PS:我用它来编写一个插件,该插件会自动将我的aar添加到android项目中并在build.gradle中添加依赖项
Adi

@Adi如果您已经具有Maven依赖项,则不要在libs文件夹中放置相应的aar 。
mixel

感谢您的答复,正如我提到的,向alibs添加aar是由开发中的Android studio插件自动完成的,因此,我想知道该插件添加到build.gradle文件中的依赖项是否已经在前面添加过。
阿迪

我现在没有答案。我认为最好单独提出一个问题。
mixel

15

不幸的是,这里没有解决方案对我有用(我得到了未解决的依赖项)。最终有效并且最简单的恕我直言的方法是:从Android Studio中突出显示项目名称,然后突出显示文件->新模块->导入JAR或AAR包。值得一提的是这篇文章的解决方案


1
应该注意的是,Android Studio在其导入向导中异常模糊。当他们在其中一个步骤中声明“文件名”时,他们实际要的是文件的路径...希望此消息可以使其他人免于头疼。
Tukajo 2015年

13

有两种方法:

第一种方式

  1. 打开您的Android Studio并通过以下方法导航到Create New Module窗口File -> New -> New Module

在此处输入图片说明

  1. 选择Import .JAR/.AAR Package项目并单击Next按钮

  2. build.gradle属于您的app模块的文件中添加一个依赖项。

    dependencies {
        ...
        implementation project(path: ':your aar lib name')
    }

就这样。

第二种方式

  1. libs目录中创建一个文件夹,例如aars

  2. 将您的aar库放到aars文件夹中。

  3. 添加代码段

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

进入您的build.gradle文件属于app模块。

  1. build.gradle属于您的app模块的文件中添加一个依赖项。
dependencies {
    ...
    implementation (name:'your aar lib name', ext:'aar')
}

就这样。

如果您会读中文,则可以查看博客。什么是AAR文件以及如何在Android开发中使用


这个答案对我真的很有帮助
Csabi '19

按照第一种方法,在主项目中未检测到aar文件中的类,我们是否需要添加任何额外的配置?
基兰

请更新或删除,第一个答案已经发布,不建议使用第二个“编译”。
大卫

12

使用Android Studio 3.4和Gradle 5,您可以像这样简单地进行操作

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}

1
这是最好的答案。依赖性是显式的,非常简单。
Nikmoon

1
同意这是最佳答案。立即工作,非常适合将.aar依赖项添加到React Native库。
Josh Baker

1
这将引发与开始的Gradle插件4的错误:stackoverflow.com/questions/60878599/...
大卫

@David感谢您的举报,我将尽快对其进行测试。
m0skit0

10

更新ANDROID STUDIO 3.4

  1. 转到文件 -> 项目结构

在此处输入图片说明

  1. 模块,然后点击+

在此处输入图片说明

  1. 选择导入.aar包

在此处输入图片说明

  1. 查找.aar路线

在此处输入图片说明

  1. 完成应用,然后验证是否添加了软件包

在此处输入图片说明

  1. 现在在应用程序模块中,单击+模块依赖关系

在此处输入图片说明

  1. 检查库包并确定

在此处输入图片说明

  1. 验证添加的依赖项

在此处输入图片说明

  1. 像这样的项目结构

在此处输入图片说明


1
这是我读到的第17个答案,它终于增加了依赖性。eeh
Taras Matsyk,

6

我也有这个问题。此问题报告:https : //code.google.com/p/android/issues/detail? id=55863似乎建议不支持直接引用.AAR文件。

也许现在的替代方法是将actionbarsherlock库定义为项目的父目录下的Gradle库,并相应地进行引用。

语法在此处定义:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


感谢您参考此问题。是的,我知道如何使用Gradle Android Library来实现此功能,但是此选项对于我正在从事的项目并不是真正的最佳选择,但是非常棒!
米格尔·拉维尼

3

我在Android问题跟踪器中找到了解决方法: https //code.google.com/p/android/issues/detail? = c21

诀窍(不是解决办法)是将您的.aar文件隔离到一个子项目中,并将您的库添加为工件:

configurations.create("default")
artifacts.add("default", file('somelib.jar'))
artifacts.add("default", file('someaar.aar'))

更多信息: 处理本地工件的传递依赖关系


没错,这是示例:在github.com/textileio/notes/commit/…中compile project(':mobile')在android / app / build.gradle中,configurations.maybeCreate("default")在android / mobile / build.gradle中,include ':mobile'在android / settings.gradle中
李政

3

就我而言,我的库中有一些缺陷,当我aar从它创建一个库时,由于缺少缺陷而失败了,所以我的解决方案是将lib中的所有缺陷与arr文件一起添加。

所以我的项目级别build.gradle如下:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

allprojects {
    repositories {
        mavenCentral()
        //add it to be able to add depency to aar-files from libs folder in build.gradle(yoursAppModule)
        flatDir {
            dirs 'libs'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(modile app) 所以:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.sampleapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //your project depencies
    ...
    //add lib via aar-depency
    compile(name: 'aarLibFileNameHere', ext: 'aar')
    //add all its internal depencies, as arr don't have it
    ...
}

和图书馆build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //here goes library projects dependencies, which you must include
    //in yours build.gradle(modile app) too
    ...
}

3

我在这里尝试了所有解决方案,但没有一个起作用,然后我意识到我犯了一个错误,我把.aar错误的文件夹放在了错误的文件夹中,如下图所示,我认为我应该将它放在根文件夹中,所以我在libs那里创建了一个文件夹(图片中为1) ),但在app文件夹中已经有一个libs,您应该放第二个libs,希望这对与我有相同问题的人有所帮助:

在此处输入图片说明



2

只是为了简化答案

如果本地存在.aar文件,则将其包含
compile project(':project_directory')在项目的build.gradle依赖项中。

如果远程存在.aar文件,则将其包含 compile 'com.*********.sdk:project_directory:0.0.1@aar'在项目的build.gradle依赖项中。


0

就我而言,当我添加“项目”进行编译时,它就可以工作:

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


dependencies {
   compile project('com.x.x:x:1.0.0')
}

0

您可以执行以下操作:

  1. 将您的本地库(扩展名:.jar,.aar,...)放入“ libs”文件夹(如果需要,也可以放入另一个文件夹)。

  2. 在build.gradle(应用程序级别)中,将此行添加到依赖项中

    实现fileTree(包括:['* .jar','* .aar'],dir:'libs')

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.