使用Gradle在多个Android应用之间共享Android库

时间:2014-01-10 17:05:39

标签: android module gradle shared-libraries android-studio

我有Android应用程序A和B.我想从每个应用程序中提取重复的代码到共享库L.如何使用Gradle执行此操作?我之前看到过这个问题的几个排列,但答案很少。

最接近/最好的问题是这一个:

Multiple Android apps depending on android library with gradle

第一个答案建议一个包含应用程序和库模块的父项目。这种耦合是不可取的,部分是因为A,B和L在他们自己的Git存储库中,但也因为它涉及有一个父项目和构建难以放入源代码控制的文件(或者涉及手动复制其他项目)。因为默认情况下Android Studio喜欢用于单模块项目的父版本......嗯,对于应该是一个简单的家庭来说,它只是很多父母。这似乎是项目之间不必要的耦合,否则完全无关。

第二个答案涉及将AAR发布到repo并引用每个项目中的远程库。我可以使用这种方法,因为我们有一个本地的Nexus存储库,但如果没有手动版本控制/命名和上传文件,这似乎没有一种简单的方法(这是不可持续的)。我正在尝试使用Sonatype gradle-release插件,但它似乎适用于JAR(不是AAR)。

对于Android应用程序之间最基本的代码共享形式而言,似乎有很多活动部分。有没有人有更好的解决方案?

3 个答案:

答案 0 :(得分:2)

根据Android的官方文档(https://developer.android.com/studio/projects/android-library.html):通过导入模块,库模块被复制到您的项目中,因此您可以实际编辑库代码。如果您想维护单个版本的库代码,那么这可能不是您想要的,您应该如上所述导入已编译的AAR文件。

还有另一个选项,即git子模块。您可以让您的应用引用您图书馆的SHA。因此库只有一个副本。每个应用程序仅使用SHA。你应该多关注图书馆的分支管理。请查看详细信息:https://github.com/blog/2104-working-with-submodules

答案 1 :(得分:1)

我能够删除很多SonaType auth的东西,因为我们有自己的Nexus repo不使用它。我的gradle.build文件(模块文件,而不是root文件)最终看起来像这样:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.1'
    }
}
apply plugin: 'android-library'
apply plugin: 'maven'

version = 0.3
group = "com.whatevs.android.commons"

uploadArchives {
    repositories.mavenDeployer {

        repository(url: 'http://nexus.whatevs.net:8081/nexus/content/repositories/internal-release') {
        }

        pom.project {
            packaging 'aar'

            scm {
                url 'scm:git:ssh://git@whatevs.net:7999/Mobile/android-commons.git'
                connection 'scm:git:ssh://git@whatevs.net:7999/Mobile/android-commons.git'
                developerConnection 'scm:git:ssh://git@whatevs.net:7999/Mobile/android-commons.git'
            }
        }
    }
}

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }
    release {
        runProguard false
        proguardFile 'proguard-rules.txt'
        proguardFile getDefaultProguardFile('proguard-android.txt')
    }
}

dependencies {
}

答案 2 :(得分:-1)