痛处:以前项目,每次打不同的版本的包都要把配置文件,日志控制等信息改一遍,然后才能打包。实在是蛋疼,一不小心还会漏改,而且公司配的电脑配置还很低,编译打包就卡机,还得喝杯茶等上个一时半会。
项目要求App提交测试需要提供不同配置信息的安装包,比如测试包、准发布包、发布包等。它们的逻辑代码基本一致,不同的在于每个包加载的配置文件有所不同:域名、日志开关、OTA等。
1、创建多个 properties,每个 properties都配置对应一个包要加载的配置信息。
2、配置 app.gradle的渠道信息
buildTypes {
...
}
// 多种打包方式
productFlavors {
// 线下(测试环境)
Offline {
versionName "offline"
resValue("string", "config_file", "offline.properties")
}
// 准线上(生产环境,比如带日志等)
BeforeOnline {
versionName "beforeonline"
resValue("string", "config_file", "beforeonline.properties")
}
// 线上(发布版本)
Online {
versionName "online"
resValue("string", "config_file", "online.properties")
}
}
}
通过配置 resValue,在具体初始化配置的时候,可以使用 key和 value的方式获取到需要加载的配置文件名。如 getString("config.properties")
3、配置 gradle读取签名文件信息
在 app.gradle 同级目录下新建签名信息配置文件,signing.properties
#STORE_FILE=你的keystore文件位置
#STORE_PASSWORD= 你的keystore文件密码
#KEY_ALIAS= 你的keystore文件用到的别名
#KEY_PASSWORD= 你的keystore文件用到的别名的密码
STORE_FILE = /wush.jks
STORE_PASSWORD = 123456
KEY_ALIAS = key0
KEY_PASSWORD = 123456
在 gradle中读取签名信息
defaultConfig {
// 此处省略部分代码
// 渠道
flavorDimensions "versionCode"
}
// 签名配置
signingConfigs() {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
storeFile
storePassword
keyAlias
keyPassword
v1SigningEnabled true
v2SigningEnabled true
}
}
getSigningProperties()
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release // 此处引用签名
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
// 此处省略部分代码
}
// 读取签名
def getSigningProperties() {
def propFile = file('signing.properties')
if (propFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(propFile))
if (properties != null && properties.containsKey('STORE_FILE') &&
properties.containsKey('STORE_PASSWORD') && properties.containsKey('KEY_ALIAS') &&
properties.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(properties['STORE_FILE'])
android.signingConfigs.release.storePassword = properties['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = properties['KEY_ALIAS']
android.signingConfigs.release.keyPassword = properties['KEY_PASSWORD']
} else {
println 'signing.properties entries is missing'
android.buildTypes.release.signingConfig = null
}
} else {
println 'signing.properties not found'
android.buildTypes.release.signingConfig = null
}
}
4、一键打包
方式1、在 Terminal中通过命令的方式打包。
方式2、Android Studio右上角,app模块下的 build目录,双击需要运行的执行文件
5、调试运行
配置了多个版本打包,那么平时数据线连接 adb调试到底是运行哪一个呢?
Android Studio左下角:
6、附 app build.gradle 文件代码
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.wushaohong.onekeypacking"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
flavorDimensions "versionCode"
}
// 签名配置
signingConfigs() {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
storeFile
storePassword
keyAlias
keyPassword
v1SigningEnabled true
v2SigningEnabled true
}
}
getSigningProperties()
// 自定义输出包名的设置
applicationVariants.all { variant ->
variant.outputs.all {
def fileName = "${variant.versionName}-${variant.versionCode}.apk"
outputFileName = fileName
}
}
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
// 多种打包方式
productFlavors {
// 线下(测试环境)
Offline {
versionName "offline"
resValue("string", "config_file", "offline.properties")
}
// 准线上(生产环境,比如带日志等)
BeforeOnline {
versionName "beforeonline"
resValue("string", "config_file", "beforeonline.properties")
}
// 线上(发布版本)
Online {
versionName "online"
resValue("string", "config_file", "online.properties")
}
}
}
// 项目依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
// 读取签名
def getSigningProperties() {
def propFile = file('signing.properties')
if (propFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(propFile))
if (properties != null && properties.containsKey('STORE_FILE') &&
properties.containsKey('STORE_PASSWORD') && properties.containsKey('KEY_ALIAS') &&
properties.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(properties['STORE_FILE'])
android.signingConfigs.release.storePassword = properties['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = properties['KEY_ALIAS']
android.signingConfigs.release.keyPassword = properties['KEY_PASSWORD']
} else {
println 'signing.properties entries is missing'
android.buildTypes.release.signingConfig = null
}
} else {
println 'signing.properties not found'
android.buildTypes.release.signingConfig = null
}
}