前言:在无需修改代码情况下,如何对同一套代码打包成多不同种安装包(这几个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
(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包,至此已满足我们的打不同包需求。
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
总结:
这里介绍了两种打包方式,可以根据自己的需求选择一种或交叉灵活使用即可。