我有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应用程序之间最基本的代码共享形式而言,似乎有很多活动部分。有没有人有更好的解决方案?
答案 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)
你最好的选择是去aar路线并将其发布给maven http://www.vandalsoftware.com/post/52468430435/publishing-an-android-library-aar-to-a-maven