我正在使用这样的项目结构:
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部分移动到根项目以减少代码重复?
答案 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对于密码更简单,这是一种很好的做法。