如何在Android主项目中包含库项目中使用的aar文件

Posted

技术标签:

【中文标题】如何在Android主项目中包含库项目中使用的aar文件【英文标题】:How to include aar files used in library projects in main project in Android 【发布时间】: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 谢谢!!!已经有一段时间了,所以不再需要它了。无论如何谢谢:) 【参考方案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 项目中指定库依赖。

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

正确的做法是:

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

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

    为您的库创建一个 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
    与您的同行分享您的图书馆:

在应用级 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 文件是为内部硬件定制的内部定制文件,永远不会出现在公共报告中。

【讨论】:

以上是关于如何在Android主项目中包含库项目中使用的aar文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMakeLists 中包含库头文件

如何在我的项目中包含 Bootstrap 3 和 JQuery 数据表?

Chrome 扩展程序 |如何在 CDN 的内容和后台脚本中包含库

在 Simulink 的自定义代码部分中包含库

如何在一个主项目中包含多个 Xcode 项目

在 Rails 控制器中包含库时,Paypal SDK Ruby 错误