如何使用Gradle手动包含外部aar包以用于Android?

526

我一直在尝试使用新的Android构建系统,并遇到了一个小问题。我已经编译了自己的ActionBarSherlock aar包,名为'actionbarsherlock.aar'。我想要做的是将这个aar用于构建我的最终APK。如果我将整个ActionBarSherlock库作为android-library模块包含到我的主项目中,使用compile project(':actionbarsherlock'),我可以成功地构建,没有任何问题。

但是我的问题是,我想手动提供这个依赖项作为aar文件包,就像我提供JAR一样,但我似乎无法弄清楚如何正确地将其包含到我的项目中。我尝试使用compile配置,但这似乎不起作用。我一直收到“无法找到符号”的编译错误,这告诉我来自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提出的语法更简单


请查看我的问题和答案,网址为https://dev59.com/Uo3da4cB1Zd3GeqP0HbX#31662782 - mixel
对我来说可以工作。 - Milad Ahmadi
这个回答解决了你的问题吗?Android Studio:如何将jar文件添加为库? - Mahozad
请查看我的这个回答 - Mahozad
这是我见过的最简单的方法。https://dev59.com/M1EG5IYBdhLWcg3wVapJ#67724530 - Abdullah Tutun
显示剩余2条评论
26个回答

785

请按照以下步骤进行操作以使其正常工作(我在Android Studio 2.2上测试过)。

假设您有一个.aar文件在libs文件夹中(例如cards.aar)。

然后在应用的build.gradle中指定以下内容,并单击与Gradle文件同步项目

打开项目级别的build.gradle,并添加以下代码:flatDir {dirs("libs")},如下所示:

allprojects {
    repositories {
        jcenter()

        flatDir {
            dirs("libs")
        }
    }
}

打开应用级别的 build.gradle 文件并添加 .aar 文件:

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

如果您正在使用 Kotlin 并且有一个 build.gradle.kts 文件:

dependencies {
    implementation(name = "cards", ext = "aar")
}
如果一切顺利的话,您将看到库项已添加到build -> exploded-aar中。还要注意,如果您从另一个具有依赖项的项目导入.aar文件,则还需要在build.gradle中包含这些依赖项。

16
@VipulShah,libs目录在哪里? - StuStirling
3
建议将修改放在应用模块的'build.gradle'文件中,而不是顶层目录的'build.gradle'文件中。 - loloof64
4
我找到了上述问题的答案:不要使用“compile”依赖项,而是添加这两个依赖项:debugCompile(name:'cards-debug', ext:'aar')releaseCompile(name:'cards-release', ext:'aar') - Iftah
6
不要被示例代码所迷惑。第一块代码 allprojects {...} 属于项目级别的 Gradle 文件,第二部分代码 dependencies {...} 应该放在应用级别的 Gradle 文件中。 - Kirill Karmazin
11
警告:配置'compile'已经过时,已被替换为'implementation'和'api'。它将在2018年底被移除。更多信息请参见:http://d.android.com/r/tools/update-dependency-configurations.html。 - B-GangsteR
显示剩余8条评论

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

Open module settings

点击窗口左上角的"+"按钮以添加新模块。

Add new module

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

Import AAR

使用“...”按钮,在“文件名”字段旁找到AAR文件。

Find AAR file

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

Dependencies pane

使用依赖项屏幕上的"+"按钮,并选择"模块依赖项"

Add module dependency

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

Choose module

编辑:Android Studio 4.1中已经移除了截图6中的模块依赖。作为替代方案,请将模块依赖项添加到build.gradle中。

dependencies {
    implementation project(':your_module')
}

编辑:在Android Studio 4.2中,用户界面和工作流程已经发生了很大变化。现在官方文档非常详细地解释了添加依赖项的过程:使用项目结构对话框添加依赖项


5
最佳答案,记得在此之后执行Alt+B,清理并重建项目。为什么Android Studio这么难用!我希望能将NetBeans IDE作为我的Android开发平台。 - java acm
4
每次只想向项目中添加一些 aar 库时创建新模块并不是最佳方案。 - Kirill Karmazin
4
最新版的Android Studio(V4.1)已将“模块依赖项”选项从弹出菜单中移除。 - Prasad Pawar
2
任何基于GUI点击这个和GUI点击那个的方法都不是基于科学方法的。这样做是行不通的。 - daparic
16
在Android Studio 4.2中,从“添加模块”中移除了导入.jar/.aar包的选项,并将其转移到了“项目结构对话框”中。具体操作请参考以下链接: https://developer.android.com/studio/projects/android-library#psd-add-aar-jar-dependency - Hani
显示剩余3条评论

133
你可以从存储库引用aar文件。 Maven是一种选择,但有一个更简单的解决方案:将aar文件放在libs目录中并添加一个目录存储库。
    repositories {
      mavenCentral()
      flatDir {
        dirs 'libs'
      }
    }

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

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


你可以查看Min'an的博客文章以获取更多信息。这里是链接

1
这个方法非常好用,比其他被认可或评分更高的答案更好,因为它更简单,我可以将其包含在版本控制中,而不需要将文件添加到每个开发人员的本地maven repo中(如果我必须这样做,那么为什么要首先使用Gradle呢?)谢谢! - ajpolt
@ajpolt 可能建议设置一个仓库服务器(专为专有依赖项而设),这样您就不必将其放在开发机器或项目的lib文件夹中。如果您只有一个依赖项,请将其放入Maven结构化的Google代码存储库中(作为临时存储库)。 - Lo-Tan
5
在这个答案中最重要的一点是在依赖项末尾提到“@aar”。 - Atharva
1
我认为使用最新的gradle插件这将不再起作用:https://dev59.com/rFIH5IYBdhLWcg3wKJ9U - David
这是唯一一个包含最简单形式的答案,具有所有现代语法,包括implementation等。这是复制粘贴的解决方案。由于Android Build Gradle插件4.0.0现在会抛出错误而不是忽略损坏的.aar路径,因此会有很多新的赞。 - avalancha
如果您正在使用settings.gradle文件,请确保使用app/libs来引用您的libs文件夹下一级。 - Codelicious

79

之前(默认)

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

只需要在include数组中添加'*.aar'

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')

3
虽然这段代码可能回答了问题,但提供有关它如何以及为什么解决问题的额外上下文会提高答案的长期价值。 - Alexander
1
工作正常,如果库很简单,这是正确的方法。但是这里有一个问题: 您需要导入aar文件中导入的所有库才能使其正常工作。 使用此方法不会传播从aar文件导入的内容。 - Tobliug
1
或者,更简单的方式是:implementation fileTree(include: ['*.?ar'], dir: 'libs') - friederbluemle
@friederbluemle 我认为更准确的说法不是简单,而是更短,同时在理论上也不太具体。 - David

59

以下方法适用于Android Studio v0.8.x:

  • aar 文件保存在应用模块的 libs 文件夹下(例如:<项目>/<应用程序>/libs/myaar.aar)。

  • 在您的“app”模块文件夹的 build.gradle 中添加以下内容(不是您的项目根 build.gradle)。请注意,在编译行中的名称为 myaar@aar 而不是 myaar.aar。

 dependencies {
     compile 'package.name.of.your.aar:myaar@aar'
 }

 repositories{
     flatDir{
         dirs 'libs'
     }
 }
  • 点击 工具 -> Android -> 与Gradle文件同步项目


  • 3
    在AS 1.0上完美运行。 - Pablo Johnson
    1
    如果有人需要的话,如果Gradle工作正常但仍然看不到类,请重新启动Android Studio... - htafoya
    1
    这个方案在AS2.2上表现非常出色 - gradle对AAR文件的语法似乎异常挑剔。 - Jim Andreas
    1
    请更新或删除,编译已过时,并且还存在以下问题:https://dev59.com/rFIH5IYBdhLWcg3wKJ9U - David

    53

    只需进行一次设置,将来可以添加库而无需更改任何代码


    在应用级别的build.gradle文件中添加以下行

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

    将项目结构从 Android 改为 Project。

    按照以下步骤导航至 app->libs

    enter image description here

    然后将"aar"粘贴到 libs 文件夹中。

    在 Android Studio 左上角单击 File,然后单击下面的 "Sync Project with Gradle Files"

    enter image description here

    就是这样了。


    3
    实现(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar")))) 用于 kts 文件 - Daniel Wilson

    40

    使用 Android Studio 3.4 和 Gradle 5,您可以简单地这样做

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

    2
    这是最好的答案。依赖关系是明确且非常简单的。 - Nikmoon
    2
    同意这是最佳答案。立即生效,非常适合将.aar依赖项添加到React Native库中。 - Josh Baker
    2
    从gradle插件4开始,这会抛出一个错误:https://dev59.com/rFIH5IYBdhLWcg3wKJ9U - David
    @David 谢谢你的报告,我会尽快测试它。 - m0skit0
    抱歉,David。忘记回答这个问题了。对我来说一切正常。 - m0skit0
    @David,你不能在构建aar时包含aars文件,这是Google工具不支持的,无法绕过此限制。 - m0skit0

    21

    有两种方法:

    第一种方法

    1. 打开 Android Studio,通过 文件 -> 新建 -> 新建模块 导航到 创建新模块 窗口

    enter image description here

    1. 选择 导入 .JAR/.AAR 软件包 选项并单击 下一步 按钮

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

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

    就这些了。

    第二种方法

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

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

    3. 添加以下代码片段

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

    在你的build.gradle文件中,将其放置在应用程序模块中。

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

    就这些。

    如果你能阅读中文,你可以查看博客什么是AAR文件以及如何在Android开发中使用


    这个答案对我非常有帮助。 - Csabi
    当按照第一种方式进行时,aar文件中的类在主项目中无法被检测到,我们需要添加任何额外的配置吗? - Kiran
    请更新或删除,因为答案已经发布,而且“编译”已经过时。 - David
    该方法在当前的Android Studio(2021.2)中已不再适用 - “新建模块”工作流程不再具有导入JAR / AAR包的选项。 - Guss

    21

    当构件是快照时,我没能使它工作,你有什么想法吗? - tbruyelle
    你是用Eclipse还是仅用Android Studio实现了这个功能?使用Eclipse时,“gradle eclipse”会将aar文件添加到类路径中,但Eclipse无法识别其中的类。 - andrej_k
    请检查这个问题:https://dev59.com/VGEi5IYBdhLWcg3w0fJR,如果按照教程操作后你的本地 .aar 文件在 Gradle 1.9 或以上版本中找不到。 - Maragues

    21

    我成功了!

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

    2. build.gradle的最底部添加这些行(应该是app而不是project):

    3. repositories {
         flatDir {
             dirs 'libs'
         }
      }
      dependencies {
          compile 'com.example.lib:mylib:0.1@aar'
      }
      
    4. 到目前为止一切顺利,接下来是最重要的一点:

    除非启用离线模式,否则Gradle需要访问网络以获取依赖项。

    请确保您已通过项目结构/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>
    

    希望这个有效。


    1
    请更新或删除,编译已过时,并且还存在此问题:https://dev59.com/rFIH5IYBdhLWcg3wKJ9U - David

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