用于多项目构建的全局签名配置

时间:2013-12-22 17:02:25

标签: android gradle

我正在使用这样的项目结构:

root
  |--build.gradle
  |--settings.gradle
  |
  |--child1
  |    |--build.gradle
  |
  |--child2
       |--build.gradle

在两个子项目中,build.gradle包含以下内容:

apply plugin: 'android'

...

android {
    ...

    signingConfigs {
        release {
            storeFile file("release.keystore")
            storePassword "pass"
            keyAlias "alias"
            keyPassword "pass"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
    ...
}

如何将signingConfigs部分移动到根项目以减少代码重复?

4 个答案:

答案 0 :(得分:1)

鉴于所有子项目都是Android项目,您可以将代码移动到根级别构建脚本中定义的subprojects 配置块中。

subprojects {
    apply plugin: 'android'

    android { 
        ...
    }
}

如果需要,您还可以根据特定条件过滤项目列表,并将此配置应用于它们。

答案 1 :(得分:1)

我试过这段代码并且有效。请注意不要在android-library项目中使用signingConfigs。

subprojects {

afterEvaluate {
    def isAndroidProject = project.plugins.hasPlugin('android')
    def isLibraryProject = project.plugins.hasPlugin('android-library')
    if (isAndroidProject || isLibraryProject) {
        android {
            compileSdkVersion 19
            buildToolsVersion 19.0.1

            compileOptions {
                sourceCompatibility JavaVersion.VERSION_1_7
                targetCompatibility JavaVersion.VERSION_1_7
            }

            if (isAndroidProject) {
                signingConfigs {
                    release {
                        storeFile file("${rootDir}/platform.keystore")
                        storePassword "android"
                        keyAlias "platform"
                        keyPassword "android"
                    }
                }

                buildTypes {
                    release {
                        signingConfig signingConfigs.release
                        minifyEnabled true
                        proguardFiles getDefaultProguardFile('proguard-android.txt'), "${project.projectDir}/proguard-project.txt"
                    }
                }

                android.applicationVariants.all { variant ->
                    variant.outputs.each  { output ->
                        def buildType = variant.buildType.name
                        if (buildType.equals('release')) {
                            def fileName = "${project.name}.apk";
                            output.outputFile = new File(output.outputFile.parent, fileName)

                            output.assemble.doLast {
                                copy {
                                    from output.outputFile.getAbsolutePath()
                                    into "../apks/"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

答案 2 :(得分:1)

非常类似于Alans的答案,但我的Gradle接受了。我还没有找到任何缩影:

在根build.gradle中:

import com.android.build.gradle.internal.dsl.SigningConfig

ext {
    mySigningConfigs = [
            release : SigningConfig.newInstance([
                    keyAlias     : 'release',
                    keyPassword  : 'keyPassword',
                    storeFile    : file('release.jks'),
                    storePassword: 'storePassword'
            ]),
            debug: SigningConfig.newInstance([
                    keyAlias     : 'debug',
                    keyPassword  : 'keyPassword',
                    storeFile    : file('debug.jks'),
                    storePassword: 'storePassword'
            ])]
}
子模块中的

build.gradle

android {
    buildTypes {
        release {
            signingConfig mySigningConfigs.release
        }

        debug {
            signingConfig mySigningConfigs.debug
        }
    }
}

答案 3 :(得分:-1)

我意识到这个问题已经过时了,但是对于其他有同样问题的人我终于找到了适合我们的配置:

在您的根build.gradle

ext {
    signingConfigs = {
        release {
            storeFile rootProject.file('keystores/release.keystore')
            storePassword 'pass'
            keyAlias 'alias'
            keyPassword 'pass'
        }

        // Optionally other configs like 'debug' here...
    }

    // Other ext properties here... 
}

然后在单个模块build.gradle文件中(库模块除外):

android {
    // ...

    signingConfigs rootProject.ext.signingConfigs
}

buildTypes {
    release {
        signingConfig signingConfigs.release
        // ...
    }
}

这样至少你不必在任何地方复制密码/商店名称。它还使switch to using environment variables对于密码更简单,这是一种很好的做法。