How to include aar files used in library projects in main project in Android

前端 未结 6 2082
名媛妹妹
名媛妹妹 2020-12-31 10:56

My project is including some library project. Library is using some aar files and its dependecny is already defined in the module: gradle file. I am facing problem in includ

相关标签:
6条回答
  • 2020-12-31 11:05

    Monika Moon put me on the correct path but I don't have enough rep points to comment inline above. sigh

    So a default Android app built in 2020 with Android Studio 3.5.3 will have the following project structure via the Project View:

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

    In the top level build.gradle files add the 'flatDir' item :

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

    Then in your 'app' folder shown above. You will have these two key resources:

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

    The default project build will already contain a 'libs' include for you but just in case your version doesn't have it this is what you need to add:

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

    This is clean and works as expected.

    The AAR file I'm using is an in-house custom built for internal hardware and will never be on a public repot.

    0 讨论(0)
  • 2020-12-31 11:12

    If I keep duplicate aar files in app->lib and define their dependency in app->gradle file then there is no problem. But it shouldn't be the right approach.

    You're right, your app shouldn't define your AAR library dependencies in build.gradle. That's a common practice for 3rd party libraries like OkHttp, Picasso or RxJava. Those libraries are, in fact, has their own dependencies, just like your AAR library.

    So, how come OkHttp, Picasso or RxJava doesn't ask your App to include their dependencies? Because they have included their dependencies on a POM file. A POM file contains configuration file for your AAR, including your artifact, group name, version, and its dependencies.

    Let's take OkHttp as an example. OkHttp and its dependencies are stored in other people computer. Go to mvnrepository.com and search for OkHttp.

    You will find OkHttp and its POM file.

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

    When you include a library in your build.gradle(), Gradle will search that library on repositories define in top-level build.gradle. For OkHttp it was stored in mavenCentral().

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

    Gradle will download the dependencies automatically, you don't need to specify library dependency on your App project.

    But it shouldn't be the right approach.

    The right approach is:

    1. Store your library and its dependencies in a Maven repository.

    You can use local Maven repository, host your own Maven repo, or publish your library on Maven Central or Bintray. inthecheesefactory has a good tutorial for that.

    1. Create a POM file for your library.

    When you deploy your AAR you have to include POM file. It can be done manually.

    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/"
    

    Or using android-maven-publish Gradle plugin.

    gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
    
    1. Share your library to your peers:

    In app-level build.gradle add the GAV of your library.

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

    You and your peers should be able to use yourlibrary now.

    0 讨论(0)
  • 2020-12-31 11:18

    For Android studio

    Follow this steps:

    Step 1:

    Import .aar

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

    Now your existing project is imported.

    Step 2:

    Add dependencies

    File ---> Project Structure ---> (Now you will get module list in left side at bottom.) ---> (Select app module) ---> select dependencies tab ---> click on (+) button ---> select module dependencies ---> (select module which you added) ---> ok ---> ok

    Note: To check dependency is added

    your build.gradle looks like

    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')
    }
    
    0 讨论(0)
  • 2020-12-31 11:22

    You need to include the jcenter repository. In the app level build.gradle type:

       repositories {
               jcenter()
        }
    
    dependencies {
          compile 'com.package.youraarpackagename@aar'
    }
    

    These dependencies are different from your other ones.

    0 讨论(0)
  • 2020-12-31 11:25

    In my case, following thing worked:

    Put your .aar file in the libs directory(create, if needed), then, add the following code in your build.gradle(app level):

        repositories { 
            flatDir { 
                dirs 'libs' 
            } 
        } 
    
        dependencies { 
            compile fileTree(dir: 'libs', include: ['*.jar']) 
            compile(name:'your_arr_filename', ext:'aar') 
        } 
    
    0 讨论(0)
  • 2020-12-31 11:27

    The aar file doesn't contain the transitive dependencies and doesn't have a pom file which describes the dependencies used by the library.

    It means that, if you are importing a aar file using a flatDir repo you have to specify the dependencies also in your project.

    You should use a maven repository (you have to publish the library in a private or public maven repo), you will not have the same issue.
    In this case, gradle downloads the dependencies using the pom file which will contains the dependencies list.

    0 讨论(0)
提交回复
热议问题