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

Ale*_*iev 155 android android-studio build.gradle android-gradle-plugin aar

我知道这个问题:将本地.aar文件添加到我的gradle构建中,但该解决方案对我不起作用.

我尝试将此语句添加到我的build.gradle文件的顶级:

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}
Run Code Online (Sandbox Code Playgroud)

我还把slidingmenu.aar文件放入/libs并在dependencies部分中引用它:compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar'但它根本不起作用.

我也试过compile files('libs/slidingmenu.aar')但没有运气.

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

PS Android Studio 0.8.2

Ash*_*erg 290

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

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

然后在你的项目build.gradle(不是顶级的,'app'下的那个)中添加以下内容(在依赖项部分中):

dependencies {
    compile project(':Name-Of-Your-Project')
}
Run Code Online (Sandbox Code Playgroud)

注意您的项目名称应与导入AAR文件后添加的文件夹名称相匹配(app/.idea与最高级别文件夹下的级别相同).或者用另一种方式......

MyApplication
  .idea
  app
  build.gradle (here's where to add compile project(':ProjectName') to dependency section)
  ProjectName (added automatically after importing, matching the name of your aar file)
  build
  gradle
  etc

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

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

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

  • 最近的gradle插件打破了这一点.解决方案:http://stackoverflow.com/a/28816265/560600 (2认同)

Nis*_*nt. 188

更新:正如@ amram99所述,该问题已在Android Studio v1.3发布时得到修复.

经过测试并通过以下规格验证

  • Android Studio v1.3
  • gradle plugin v1.2.3
  • Gradle v2.4

什么现在有效

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

  • 但是,无论Android Studio的更改如何,下面的答案都是真实有效的,因为这是基于gradle脚本编写的.


旧答案: 在最近的更新中,android的人通过Android Studio的添加新模块菜单选项打破了包含本地aar文件.检查此处列出的问题.无论进入和退出IDE的功能列表,以下方法在处理本地aar文件时都有效.(今天测试过):

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

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }
Run Code Online (Sandbox Code Playgroud)

  • `repositories`部分用于**不同的**`build.gradle`以便工作 - 全局的.`dependencies`部分位于模块的`build.gradle`中.这就是我收到错误的原因. (10认同)

Jos*_*iah 26

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

老答案

试试这个:

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

...

compile(name:'slidingmenu', ext:'aar')
Run Code Online (Sandbox Code Playgroud)

  • 我使用新的导入方法导入了.aar文件.但是当我输入半名时我无法看到库的类名,并按ctrl + space.所以它仍然不考虑库.任何的想法? (4认同)
  • 只要我使用AS 8.13/Gradle 2.1包含OP中提到的`flatDir {dirs'libs'}`块,这个旧答案实际上对我有用. (3认同)

Ric*_*ard 14

我在Android Studio 2.1上工作了.我有一个名为"Native_Ads"的模块,它在多个项目中共享.

首先,我在Native_ads模块中创建了一个名为'aars'的目录,然后将aar文件放在那里.

目录结构:

libs/
aars/    <-- newly created
src/
build.gradle
etc
Run Code Online (Sandbox Code Playgroud)

然后,其他变化:

顶级Gradle文件:

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

App模块的build.gradle文件: - 没有变化

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

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')
Run Code Online (Sandbox Code Playgroud)

Native_Ads模块的Gradle文件:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}
Run Code Online (Sandbox Code Playgroud)

而已.清洁和建造.


小智 12

该解决方案适用于 Android Studio 4.0.1。

除了按照上述解决方案中建议的方式创建新模块之外,您还可以尝试此解决方案。

如果您的应用程序中有多个模块并且只想将 aar 添加到其中一个模块,那么此解决方案会很方便。

在你的根项目build.gradle中

添加

repositories {
flatDir {
    dirs 'libs'
}}
Run Code Online (Sandbox Code Playgroud)

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

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

}

快乐编码:)


Mar*_*ies 7

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

在此输入图像描述

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


luc*_*iel 7

这是我的结构,以及我如何解决这个问题:

MyProject/app/libs/ mylib-1.0.0.aar

我的项目/应用程序/myModulesFolder/myLibXYZ

build.gradle 上

来自项目/应用程序/myModulesFolder/myLibXYZ

我已经把这个:

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

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


Glo*_*rin 7

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

dependencies {
    ...
    api fileTree(dir: 'libs', include: ['*.aar'])
    ...
}
Run Code Online (Sandbox Code Playgroud)

build.gradle成功了。我认为它与默认生成的依赖项类似:

implementation fileTree(dir: 'libs', include: ['*.jar'])
Run Code Online (Sandbox Code Playgroud)


moc*_*dwi 6

如果您已经使用 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
Run Code Online (Sandbox Code Playgroud)

我的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"))))
}
Run Code Online (Sandbox Code Playgroud)
  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")
}
Run Code Online (Sandbox Code Playgroud)

之所以需要它group,是因为它在 kotlin 中是强制性的(非可选/有默认值)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
)
Run Code Online (Sandbox Code Playgroud)

免责声明:使用第一和第二方法的区别flatDirs,我仍然不太了解,您可能需要编辑/评论这个答案。

参考:

  1. /sf/answers/3978027091/
  2. https://github.com/gradle/gradle/issues/9272


agr*_*ner 5

你可以这样做.它需要采用maven格式:

repositories {
  maven { url uri('folderName')}
}
Run Code Online (Sandbox Code Playgroud)

然后你的AAR需要进入组ID"com.example"的文件夹结构:

folderName/
  com/
    example/
       verion/
          myaar-version.aar
Run Code Online (Sandbox Code Playgroud)

然后作为依赖引用:

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

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


Moh*_*eza 5

就我而言,上述答案均无效!因为我有不同的产品口味只是添加

repositories {
    flatDir {
         dirs 'libs'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

repositories{
    flatDir{
        dirs 'src/main/libs'
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜当build.gradle中有不同的 ProductFlavors 时,应该像这样引入 flatDirs