解决不同包要求,不需要通过修改代码来实现(只想看多渠道打包的,直接看三)。
一.在项目级下的build.gradle里面加入如下代码(跟buildscript同级),这个只是为了统一管理:
ext {
compileSdkVersion = 33
buildToolsVersion = "33.0.0"
applicationId = 'com.example.myapplication'
minSdkVersion = 24
targetSdkVersion = 31
versionCode = 1
versionName = '1.0.0'
}
二.在main级下的build.gradle下,引用步骤一里面的ext:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.applicationId
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
…………………………………………………………
}
三.在app级下的build.gradle文件的android级别下加入签名信息,如下代码:
注:必须要,不然打出来的包是安装不了的
android {
…………………………………………………………
signingConfigs {
release {
//自己创建一个key:Build->Generate Signed Bundle / APK——》Next——》里面界面用的那个key
storeFile file("../key/*****")
storePassword "123456"
keyAlias "key0"
keyPassword "123456"
}
}
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
……………………………………………………
}
不知key文件怎么来的,可看一下如图:
四. 在app级下的build.gradle文件的android级别下加入flavorDimensions维度、productFlavors。可以分为只有一个维度(普通情况下用这个)和多维度(需要多种情况组合的)
(1)多维度,也是在android级别下,如下代码:
//不同维度,只有一个时,在productFlavors里面就不需要dimension。多个维度的适合不同场景交叉组合使用其特性。一般情况下只用一个就可以
//会根据city、area进行不同组合,devth、devbb、proth、probb(调换city、area顺序,则就变成thdev)。再跟Debug、Release进行组合,这样子有8个
//存在相同常量类型、名称、值时,谁排前面就以它为准,eg:thPro时,IS_LOG=true,若是维度顺序改成flavorDimensions("city","area"),那就是proTh时,IS_LOG=false
flavorDimensions("city", "area")
//productFlavors:一个应用程序创建不同的版本
productFlavors {
dev {
dimension "city" //属于city维度
// buildConfigField("常量类型","常量名称","常量值")
buildConfigField("boolean", "IS_LOG", "true")//是否打印日志
}
pro {
dimension "city" //属于city维度
buildConfigField("boolean", "IS_LOG", "false")//是否打印日志
}
th {
dimension "area"//属于area维度
buildConfigField("boolean", "IS_LOG", "true")//是否打印日志
buildConfigField("String", "area", '"市区名称含有th字母的"')
}
bb {
dimension "area"//属于area维度
buildConfigField("boolean", "IS_LOG", "false")//是否打印日志
buildConfigField("String", "area", '"市区名称含有bb字母的"')
}
}
(2)一个维度时,也是在android级别下,如下代码:
flavorDimensions "ll"
productFlavors {
dev {
// buildConfigField("常量类型","常量名称","常量值")
buildConfigField("boolean", "IS_LOG", "true")//是否打印日志
}
pro {
buildConfigField("boolean", "IS_LOG", "false")//是否打印日志
}
}
五.自定义apk包名称,这样子一看就知道打的是那种类型的包了
android {
……………………………………………………
applicationVariants.all { variant ->
variant.outputs.all { output ->
//包名的命名:eg:ll_devBb_yyyyMMddHHmmss_release.apk
//flavorName就是productFlavors里面的,有多个维度时进行组合,buildType里面的release或者debug
output.outputFileName = "ll_${variant.flavorName}_${buildData()}_${variant.buildType.getName()}.apk"
}
}
………………………………………………
}
//注意,是跟android同级别了
static def buildData() {
// return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));//获取当前的年月日时分秒
return new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("GMT+8"))//当前时区+8
}
六.打包后的效果
多维度效果图如下:
只有1个时候的效果图如下:
七.在项目里面使用配置,起到开关的作用。刚配置完可能找不到 项目的BuildConfig,直接运行或者assembled一下,就可以找到了
八.也许有人吐槽了,操作那么麻烦就为了个是否打印日志,手动改代码还快?? 其实不是的,这个打印日志好举例,所以才使用它,实际上项目肯定需要配置多个。
避坑1:> No signature of method: build_3qnsfaux9b4b5w49j3n7eqc7z.android() is applicable for argument types: (build_3qnsfaux9b4b5w49j3n7eqc7z$_run_closure1) values: [build_3qnsfaux9b4b5w49j3n7eqc7z$_run_closure1@4fc63527]
明明看着步骤操作的,结果出现这个错误,摸不着头脑。
我的情况是:某个字段打错了,buildConfigField变成了buildConfigFields导致的,在build里面敲代码也会提示,手快就选错了
必坑2: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vd11032612560.tmp/base.apk: Attempt to get length of rull array]
签名的问题(请重新看三)