前言:在无需修改代码情况下,如何对同一套代码打包成多不同种安装包(这几个APP可以同时安装不会覆盖),或打同种但不同环境(如线上、测试)的安装包?
方案:
1、打不同种安装包
(1)build.gradle关键配置
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
flavorDimensions "app"
defaultConfig {
multiDexEnabled = true
}
signingConfigs {
one_store {
storeFile file('../one/one.jks')
storePassword '123456'
keyAlias 'one'
keyPassword '123456'
}
two_store {
storeFile file('../two/two.jks')
storePassword '123456'
keyAlias 'two'
keyPassword '123456'
}
}
productFlavors {
one {
dimension "app"
applicationId "com.lpf.one"
versionCode 1
versionName "1.1.1"
signingConfig signingConfigs.one_store
buildConfigField "String", "BASE_URL", "\"https://www.one.lpf.com/\""
}
two {
dimension "app"
applicationId "com.lpf.two"
versionCode 2
versionName "2.2.2"
signingConfig signingConfigs.two_store
buildConfigField "String", "BASE_URL", "\"https://www.two.lpf.com/\""
}
}
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
这里对不同APP可以使用同一个signingConfig,只要applicationId不同则为不同APP
注:打出的debug类型的安装包,签名文件是系统默认的,非我们配置的,可以通过如下配置解决(附获取签名工具)
buildTypes {
debug {
initWith(buildTypes.release)
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
(2)不同APP名称和log配置
a、创建目录app/src/one/res并在该目录下创建mipmap-xx相关目录来存放logo图片,创建/values/strings定义APP名称
b、创建目录app/src/two/res并在该目录下创建mipmap-xx相关目录来存放logo图片,创建/values/strings定义APP名称
(3)打包命令
gradlew assembleOne 和 gradlew assembleTwo
注意:这里打出来的debug包并没有采用相应APP的签名文件而是使用了系统默认的,但是release包能够正常采用相应签名文件,这个问题也没什么大的影响毕竟我们上线的都是release包,至此已满足我们的打不同包需求。
另外还可以进行组合flavor,如下则会“app”和"api"混合,指令如gradlew assembleOneMinApi23
android {
flavorDimensions ("app", "api")
productFlavors {
one {
dimension "app"
applicationId "com.lpf.one"
versionCode 1
versionName "1.1.1"
signingConfig signingConfigs.one_store
buildConfigField "String", "BASE_URL", "\"https://www.one.lpf.com/\""
}
two {
dimension "app"
applicationId "com.lpf.two"
versionCode 2
versionName "2.2.2"
signingConfig signingConfigs.two_store
buildConfigField "String", "BASE_URL", "\"https://www.two.lpf.com/\""
}
minApi23{
dimension "api"
minSdk 23
}
}
}
2、打不同环境包
(1)build.gradle关键配置
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.lpf.demo"
versionCode 1
versionName "1.0.0"
multiDexEnabled = true
}
signingConfigs {
demo_store {
storeFile file('../demo/demo.jks')
storePassword '123456'
keyAlias 'demo'
keyPassword '123456'
}
}
buildTypes {
developDebug {
minifyEnabled true
debuggable true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.demo_store
buildConfigField "String", "BASE_URL", "\"https://www.develop.one.lpf.com/\""
}
developRelease {
minifyEnabled true
debuggable false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.demo_store
buildConfigField "String", "BASE_URL", "\"https://www.develop.one.lpf.com/\""
}
onlineDebug {
minifyEnabled true
debuggable true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.demo_store
buildConfigField "String", "BASE_URL", "\"https://www.online.one.lpf.com/\""
}
onlineRelease {
minifyEnabled true
debuggable false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.demo_store
buildConfigField "String", "BASE_URL", "\"https://www.online.one.lpf.com/\""
}
}
}
通过debuggable来控制是debug模式还是release模式,最终体现在BuildConfig.java的DEBUG字段上
(2)不同APP名称和log配置(可选)
a、创建目录app/src/developDebug/res并在该目录下创建mipmap-xx相关目录来存放logo图片,创建/values/strings定义APP名称
b、创建目录app/src/onlineDebug/res并在该目录下创建mipmap-xx相关目录来存放logo图片,创建/values/strings定义APP名称
(3)打包命令
gradlew assembleDevelopDebug
gradlew assembleDevelopRelease
gradlew assembleOnlineDebug
gradlew assembleOnlineRelease
总结:
这里介绍了两种打包方式,可以根据自己的需求选择一种或交叉灵活使用即可。