Search code examples
androidgradledependenciesandroid-librarytransitive-dependency

Unable to get transitive dependencies of my library in my Android app


I created an Android Library in Android studio, which has some external dependencies(Retrofit, for example). But when i tried to use this Library in an Android app, The app doesn't include the transitive dependencies(the ones included in the library).

I've already tried publishing the library to Bintray, change the 'implementation' keyword in app-gradle file to 'api'. I've also tried setting transitive = true in my app's gradle file

When trying to build the Android app, It shows Resource Linking Failed for CardView which's used in my Library.


Solution

  • I faced the same problem while building a Library for Android. I was trying to directly upload the .aar file from the android studio to the bintray. But appparantly, it was not including the pom.xml file. So I followed this tutorial to generate the zip file. Then create a new version at bintray and then manually upload the zip file using the UI upload option Also, do not forget to check the explode this Archive option while uploading. Your can then, publish the library and use it with all its transitive dependencies. Here's an example build.gradle code:

    def version = 'your.version'
    def localReleaseDest = "${buildDir}/release/${version}"
    uploadArchives {
        repositories.mavenDeployer {
            pom.groupId = 'your.package.name'
            pom.artifactId = 'yourModuleName'
            pom.version = 'your.version'
            // Add other pom properties here if you want (developer details / licenses)
            repository(url: "file://${localReleaseDest}")
        }
    }
    
    task androidJavadocs(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }
    
    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }
    
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }
    
    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
    task zipRelease(type: Zip) {
        from localReleaseDest
        destinationDir buildDir
        archiveName "release-${version}.zip"
    }
    
    task generateRelease {
        doLast {
            println "Release ${version} can be found at ${localReleaseDest}/"
            println "Release ${version} zipped can be found ${buildDir}/release-${version}.zip"
        }
    }
    
    generateRelease.dependsOn(uploadArchives)
    generateRelease.dependsOn(zipRelease)
    

    put this code outside all blocks in your app level gradle after modifying it as needed. Now, sync project and open terminal inside the Android studio, and execute this command:

    ./gradlew clean build generateRelease
    

    this will generate a .zip file in your app/build directory which you can upload to bintray like described above