【问题标题】:How to include aar files used in library projects in main project in Android如何在Android主项目中包含库项目中使用的aar文件
【发布时间】:2016-10-22 12:14:37
【问题描述】:

我的项目包括一些图书馆项目。库正在使用一些 aar 文件,并且它的依赖已在模块中定义:gradle 文件。我在我的项目中包含这个库时遇到了问题。

如果我在 app->lib 中保留重复的 aar 文件并在 app->gradle 文件中定义它们的依赖关系,那么就没有问题。但这不应该是正确的方法。

请在下方查找错误:

配置项目 ':app' 时出现问题。

Could not resolve all dependencies for configuration ':app:_qaDebugCompile'. Could not find :api-release:. Searched in the following locations:
         https://jcenter.bintray.com//api-release//api-release-.pom
         https://jcenter.bintray.com//api-release//api-release-.aar
         file:/D:/sample/sample-android-app/app/libs/api-release-.aar
         file:/D:/sample/sample-android-app/app/libs/api-release.aar
     Required by:
         sample-android-app:app:unspecified > sample-android-app:misnapworkflow:unspecified

请在下面找到项目结构:

sample
|-- app
|-- misnapworkflow
    |
    |-- lib
        |-- api-release.aar

在应用程序的 gradle 文件中提到了包含项目

依赖项 { 编译项目(':misnapworkflow') }

请在下面找到 misnapworkflow gradle 文件:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 23
        consumerProguardFiles 'proguard-rules.pro'
    }

    lintOptions {
        abortOnError false
    }

    // Publish both debug and release libraries
    publishNonDefault true

    buildTypes {
        debug {
            debuggable true
            jniDebuggable true
            minifyEnabled false
            shrinkResources false
            testCoverageEnabled true
        }

        release {
            signingConfig signingConfigs.debug
            debuggable false
            jniDebuggable false
            minifyEnabled true
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

task grantPermissions(type: Exec, dependsOn: 'installDebugTest') {
    logger.warn('Granting permissions...')
    commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.WRITE_EXTERNAL_STORAGE".split(' ')
    commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.CAMERA".split(' ')
    logger.warn('Permissions granted.')
}

tasks.whenTaskAdded { task ->
    if (task.name.startsWith('connected')
            || task.name.startsWith('create')) {
        task.dependsOn grantPermissions
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.0.1'

    // Add dependency for MiSnap external API
    compile(name: 'api-release', ext: 'aar')

    // Add dependency for MiSnap
    compile(name: 'misnap-release', ext: 'aar') {
        exclude module: 'appcompat-v7'
    }

    // Eventbus dependency
    compile 'de.greenrobot:eventbus:2.4.0'

    // Add OPTIONAL dependency for Manatee
    compile(name: 'manatee-release', ext: 'aar')

    compile(name: 'cardio-release', ext: 'aar')
}

repositories {
    flatDir {
        dirs 'libs'
    }
}

【问题讨论】:

  • 你解决了这个问题吗?我面临着完全相同的问题。如果我不将 aar 文件复制到应用程序模块中,它就不起作用。我确实在他的应用程序 gradle 中有 jcenter 和 flatDir 指令,但没有区别。
  • @Lancelot 我已经在我的项目中解决了这个问题,请查看下面的答案
  • @aldok 谢谢!!!已经有一段时间了,所以不再需要它了。无论如何谢谢:)

标签: android android-studio gradle android-gradle-plugin aar


【解决方案1】:

aar 文件不包含 transitive 依赖项,并且没有描述库使用的依赖项的 pom 文件。

这意味着,如果您使用 flatDir repo 导入 aar 文件您还必须在项目中指定依赖项

您应该使用 ma​​ven 存储库(您必须在私有或公共 maven 存储库中发布库),您不会遇到同样的问题。
在这种情况下,gradle 使用 pom 文件下载依赖项,该文件将包含依赖项列表。

【讨论】:

  • 如果库模块使用了一些 aar 文件,但 app 模块中没有,那么我还需要保留同一个 aar 文件的两个副本吗?请注意,就我而言,库模块是第三方库。所以我不想修改lib模块的gradle文件
  • 能否使用提供的标签实现
  • 您可以使用相同的 aar 文件而无需复制它。在任何情况下,您都不必修改库的 gradle 文件,但您的应用程序 build.gradle 文件中必须有依赖项。
  • 我也做了同样的事情,但是出错了。所有 aar 文件都复制到模块的 lib 文件夹中,并在 lib 的 gradle 文件中提及。现在在我的应用程序模块中,在 gradle 文件中,我已经编写了包含依赖项的 lib 项目以及所有 aar 文件。 Gradle 正在 app:libs 文件夹中搜索它们
  • @Manish 您必须在 flatDir 中指定 aar 的文件夹,还必须在 build.gradle 文件中添加 jcenter repo。
【解决方案2】:

适用于 Android 工作室

按照以下步骤操作:

第 1 步:

导入.aar

File ---> New ---> New Module ---> (select) import .JAR/.AAR package ---> Next --->(select .aar file then)Finish

现在您的现有项目已导入。

第 2 步:

添加dependencies

文件 ---> 项目结构 ---> (现在您将在底部左侧获得模块列表。) ---> (选择 app 模块)---> 选择依赖项选项卡 --->单击(+)按钮--->选择模块依赖项--->(选择您添加的模块)--->确定--->确定

注意:检查依赖是否添加

你的build.gradle 看起来像

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile 'com.squareup.picasso:picasso:2.5.0'
    compile project(':ScreenSharingSDK')
}

【讨论】:

  • 嗨,Pramod,所有项目依赖项都已定义,但库项目本身正在使用一些 aar 文件。这些 aar 文件位于模块文件夹的 lib 文件夹中,但 gradle 正在应用程序的 lib 文件夹中搜索它们
【解决方案3】:

在我的情况下,以下事情起作用了:

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

    repositories { 
        flatDir { 
            dirs 'libs' 
        } 
    } 

    dependencies { 
        compile fileTree(dir: 'libs', include: ['*.jar']) 
        compile(name:'your_arr_filename', ext:'aar') 
    } 

【讨论】:

    【解决方案4】:

    如果我在 app->lib 中保留重复的 aar 文件并在 app->gradle 文件中定义它们的依赖关系,那么就没有问题。但这不应该是正确的方法。

    你是对的,你的 app 不应该在 build.gradle 中定义你的 AAR 库依赖项。这是 OkHttp、Picasso 或 RxJava 等 3rd 方库的常见做法。实际上,这些库有它们自己的依赖项,就像您的 AAR 库一样。

    那么,为什么 OkHttp、Picasso 或 RxJava 不要求您的应用程序包含它们的依赖项?因为他们已经包含了对POM file 的依赖。 POM 文件包含 AAR 的配置文件,包括您的工件、组名、版本及其依赖项。

    我们以 OkHttp 为例。 OkHttp 及其依赖项存储在其他人的计算机中。转到 mvnrepository.com 并搜索 OkHttp。

    你会发现 OkHttp 和它的 POM 文件。

    <project>
       <modelVersion>4.0.0</modelVersion>
       <parent>...</parent>
       <artifactId>okhttp</artifactId>
       <name>OkHttp</name>
       <dependencies>
          <dependency>
             <groupId>com.squareup.okio</groupId>
             <artifactId>okio</artifactId>
          </dependency>
          <dependency>
             <groupId>com.google.android</groupId>
             <artifactId>android</artifactId>
             <scope>provided</scope>
          </dependency>
          <dependency>
             <groupId>com.google.code.findbugs</groupId>
             <artifactId>jsr305</artifactId>
             <scope>provided</scope>
          </dependency>
       </dependencies>
       <build>...</build>
    </project>
    

    当您在 build.gradle() 中包含库时,Gradle 将在顶级 build.gradle 中定义的存储库中搜索该库。对于 OkHttp,它存储在 mavenCentral()

    repositories {
        google()
        mavenCentral()
        jcenter()
    }
    

    Gradle 会自动下载依赖,你不需要在你的 App 项目中指定库依赖。

    但这不应该是正确的方法。

    正确的做法是:

    1. 将您的库及其依赖项存储在 Maven 存储库中。

    您可以使用本地 Maven 存储库,托管您自己的 Maven 存储库,或者在 Maven Central 或 Bintray 上发布您的库。 inthecheesefactory 有一个很好的教程。

    1. 为您的库创建一个 POM 文件。

    部署 AAR 时,您必须包含 POM 文件。可以手动完成。

    mvn deploy:deploy-file \
        -DgroupId=com.example \
        -DartifactId=your-library \
        -Dversion=1.0.1 \
        -Dpackaging=aar \
        -Dfile=your-library.aar \
        -DpomFile=path-to-your-pom.xml \
        -DgeneratePom=true \
        -DupdateReleaseInfo=true \
        -Durl="https://mavenUserName:mavenPassword@nexus.example.com/repository/maven-releases/"
    

    或者使用android-maven-publish Gradle 插件。

    gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
    
    1. 与您的同行分享您的图书馆:

    在应用级 build.gradle 添加您的库的 GAV

    dependencies{
        implementation "com.example:yourlibrary:1.0.1"
    }
    

    您和您的同伴现在应该可以使用yourlibrary了。

    【讨论】:

      【解决方案5】:

      Monika Moon 让我走上了正确的道路,但我没有足够的代表点来评论上面的内联。叹息

      因此,2020 年使用 Android Studio 3.5.3 构建的默认 Android 应用将通过项目视图具有以下项目结构:

      --[yourAppName]
        --[app]
        --[gradle]
        build.gradle <this is the TOP LEVEL one and NOT the one you normally mess with>
      

      在顶层 build.gradle 文件中添加“flatDir”项:

      allprojects {
              repositories {
                  google()
                  jcenter()
      
                  // needed so it picks up my aar files
                  flatDir {
                      dirs 'libs'
                  }
              }
      }
      

      然后在上面显示的“应用程序”文件夹中。您将拥有以下两个关键资源:

       -- [libs] folder where you should drop your aar files
       build.gradle file that is the one you add your aar dependencies to.
      

      默认项目构建将已经包含一个“libs”包含,但以防万一您的版本没有它,这是您需要添加的:

      dependencies {
          implementation fileTree(dir: './libs', include: ['*.jar'])
          implementation(name: 'fileNameBeforeExtension', ext:'aar')
      

      这很干净并且按预期工作。

      我使用的 AAR 文件是为内部硬件定制的内部定制文件,永远不会出现在公共报告中。

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 2015-02-13
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 2014-04-24
        相关资源
        最近更新 更多