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

时间:2016-06-21 05:15:51

标签: android android-studio gradle android-gradle

我的项目包括一些图书馆项目。库正在使用一些aar文件,其dependecny已在模块: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

在app gradle文件中提到了以下项目

  
    

依赖项{compile project(':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'
    }
}

6 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:5)

  

对于Android studio

请按照以下步骤操作:

第1步:

导入.aar

档案--->新--->新模块---> (选择)导入.JAR / .AAR包--->下一步--->(选择.aar文件然后完成)

现在导入现有项目。

第2步:

添加dependencies

档案--->项目结构---> (现在你将在底部的左侧获得模块列表。)---> (选择app模块)--->选择依赖项选项卡--->点击(+)按钮--->选择模块依赖关系---> (选择你添加的模块)--->好的--->好的

To add dependencies(1)  add dependencies(2)

注意:要添加依赖关系

您的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')
}

答案 2 :(得分:1)

就我而言,以下事情有效:

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

    repositories { 
        flatDir { 
            dirs 'libs' 
        } 
    } 

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

答案 3 :(得分:0)

您需要包含jcenter存储库。在app level build.gradle中:

   repositories {
           jcenter()
    }

dependencies {
      compile 'com.package.youraarpackagename@aar'
}

这些依赖项与其他依赖项不同。

答案 4 :(得分:0)

  

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

你说得对,你的app不应该在build.gradle中定义你的AAR库依赖项。对于像OkHttp,Picasso或RxJava这样的第三方库来说,这是一种常见的做法。事实上,这些库有自己的依赖关系,就像你的AAR库一样。

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

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

Ok Http Maven

你会找到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存储库中。
  2. 您可以使用本地Maven存储库,托管您自己的Maven存储库,或在Maven Central或Bintray上发布您的库。 inthecheesefactory有一个很好的教程。

    1. 为您的库创建一个POM文件。
    2. 部署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. 将您的图书馆分享给您的同行:
      2. 在应用级build.gradle中添加图书馆的GAV

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

        您和您的同行现在应该可以使用yourlibrary

答案 5 :(得分:0)

莫妮卡·穆恩(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'
            }
        }
}

然后在上方显示的“ app”文件夹中。您将拥有以下两个关键资源:

 -- [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文件是为内部硬件构建的内部自定义文件,永远不会在公共仓库中出现。