亲测有效包教会配置build实现多渠道打包

解决不同包要求,不需要通过修改代码来实现(只想看多渠道打包的,直接看三)。

一.在项目级下的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]

签名的问题(请重新看三)

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值