【发布时间】:2018-09-14 05:30:11
【问题描述】:
我正在努力寻找一种使用 gradle 一次构建多个 apk 的方法。
我想要一个自定义 gradle 任务,它只考虑带有enviroment = "production" 的变体以及除nonPublishedBrand 和buildtype = "release" 之外的所有品牌(参见下面的代码)。
对于这些变体中的每一个,我需要:
生成签名的apk
使用相关任务
uploadBugsnag${variant.name}-releaseMapping将 prodguard 映射上传到 bugsnag将 apk 重命名为
<brand>-<version>.apk并将其移动到公共文件夹$buildDir/myApks
我只找到了一种让 assemble 任务也运行我的自定义任务的方法,但这并不理想,因为我不想在每次构建生产版本变体时上传映射,但只有在它意味着即启动特定 gradle 任务时才上传.
是否可以使用 gradle 来实现?你能指出我正确的方向吗?
请参阅我的 build.gradle android 部分以供参考:
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 15
targetSdkVersion 27
versionCode 1000000
versionName "1.0.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
storeFile file("keystore/keystore")
storePassword '*******'
keyAlias '*******'
keyPassword '*******'
}
}
buildTypes {
debug {
applicationIdSuffix ".debug"
versionNameSuffix ".debug"
manifestPlaceholders = [buildTypePrefix: "D_"]
}
release {
debuggable false
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
manifestPlaceholders = [buildTypePrefix: ""]
}
}
flavorDimensions "environment", "brand"
productFlavors {
//ENVIRONMENTS
staging {
dimension "environment"
applicationIdSuffix ".staging"
versionNameSuffix ".staging"
buildConfigField("String", "BASE_URL", "\"http://baseurl-staging.com\"")
manifestPlaceholders = [environmentPrefix: "S_"]
}
production {
dimension "environment"
buildConfigField("String", "BASE_URL"l, "\"http://baseurl-prod.com\"")
manifestPlaceholders = [environmentPrefix: ""]
}
//BRANDS
nonPublishedBrand {
dimension "brand"
applicationId "${packageBaseName}.nonpublishedbrand"
manifestPlaceholders = [appName: "Non published brand"]
ext {
facebook_app_id = [
staging: "0000000",
prod : "11111111"
]
}
}
brand1 {
dimension "brand"
applicationId "${packageBaseName}.brand1"
manifestPlaceholders = [appName: "Brand 1"]
ext {
facebook_app_id = [
staging: "22222222",
prod : "33333333"
]
}
}
brand2 {
dimension "brand"
applicationId "${packageBaseName}.brand2"
manifestPlaceholders = [appName: "Brand 2"]
ext {
facebook_app_id = [
staging: "44444444",
prod : "555555555"
]
}
}
}
productFlavors {
applicationVariants.all { variant ->
def isDebug = false
if (variant.buildType.name == "debug") {
isDebug = true
}
def isStaging = false
def flavors = variant.productFlavors
def environment = flavors[0]
if (environment.name == "staging") {
isStaging = true
}
def facebookAppId = ""
if (isStaging){
facebookAppId = flavors[1].facebook_app_id.staging
}else{
facebookAppId = flavors[1].facebook_app_id.prod
}
variant.buildConfigField "String", "FACEBOOK_APP_ID", "\"${facebookAppId}\""
}
}
dataBinding {
enabled = true
}
bugsnag {
autoUpload false
}
}
【问题讨论】:
-
试试 ./gradlew assemble
-
@Rockin
./gradlew assemble生成不同文件夹中的所有 apk,而我只需要一个公共文件夹中的一部分(仅发布,生产变体,不包括nonpublishedbrand),在上传映射文件后重命名遇到问题
标签: android gradle apk build.gradle