productFlavors Android产品风味自定义、多渠道打包配置、应用瘦身

18 篇文章 0 订阅
3 篇文章 0 订阅

Android gradle提供了productFlavors(产品风味)可以让开发者自定义和区分多种产品风味,其中常用的功能包含了可以配置多个渠道分别指定不同的维度,指定自定义参数字符串,指定签名等配置方式

第一步:通常情况下,首先我们需要先在app下的build.gradle中提前预设好产品所需要的维度

//flavor(产品风味)配置
    flavorDimensions "chip", "oem"  //这是维度,是针对某一种类型风味的描述词汇

第二步:紧接着维度之下,需要我们添加所有的渠道和对应维度、参数、应用签名等配置

例如下图,_chip_alight3399就是项目中所包含的渠道之一,而dimension表示对应渠道下的纬度,此项为必填项,如果不填编译则会出现报错;signingConfig表示该渠道打包时对应使用的应用签名;buildConfigField表示需要配置的一些参数,图中配置了mmkv的存储路径的字符串(此处根据实际项目需求自行添加)

productFlavors {    //产品风味自定义

        _chip_alight3399 {  //渠道名
            dimension "chip"    //指定维度(必填,不然会报错)
            signingConfig signingConfigs.alight3399 //签名配置
            buildConfigField "String", "MMKV_PATH", "\"/sdcard/Android/data/com.alight.android.aoa_launcher/alight_mmkv\""
            //自定义字符串
        }
        _chip_3399 {
            dimension "chip"
            signingConfig signingConfigs.release_3399
            buildConfigField("String", "MMKV_PATH", "\"/data/media/0/alight_mmkv/\"")
        }

        _chip_3566 {
            dimension "chip"
            signingConfig signingConfigs.release_3566
            buildConfigField("String", "MMKV_PATH", "\"/sdcard/alight_mmkv/\"")

        }

        _oem_self_test {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"test.api.alight-sys.com\"")
        }

        _oem_self_pre {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"pre-api.alight-sys.com\"")
        }

        _oem_self_prod {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"api.alight-sys.com\"")
        }

        _oem_guangfeng_test {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
        }

        _oem_guangfeng_prod {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
        }

    }

第三步,可以使用applicationVariants将项目打包到指定路径下

如下图例子,其中还包含了一些配置应用打包名称、版本号等信息(实际开发中还是根据自身实际项目需求自定义)

//应用变种 copy 到对应的位置
    applicationVariants.all { variant ->
        def oldVersion = variant.versionName;
        String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
        def version_env = "test";
        if (tskReqStr.contains("_pre")) {
            version_env = "pre-release"
        } else if (tskReqStr.contains("_test")) {
            version_env = "test"
        } else if (tskReqStr.contains("_prod")) {
            version_env = "prod-release"
        }
        def versionName = oldVersion + "-" + version_env
        Pattern chip_pattern = Pattern.compile("_chip_(\\w+)(_)")
        Matcher chip_matcher = chip_pattern.matcher(tskReqStr)
        String chip = "3399"
        if (chip_matcher.find()) {
            chip = chip_matcher.group(1)
        }
        def name = "launcher_${chip}_${project.APP_VERSION_CODE}_${versionName}_${project.AOS_VERSION}_${releaseTime()}.apk"
        variant.outputs.each { output ->
            output.versionNameOverride = versionName;
        }
        variant.assemble.doLast {
            variant.outputs.forEach { file ->
                ant.copy file: file.outputFile,
                        tofile: "${project.rootDir}/launcher_build/$name"
            }
        }
    }

补充:应用瘦身

在buildTypes中,可以在打包应用时配置minifyEnabled为true启动混淆,由于混淆后会将一些变量、方法名等转化简写,所以这样一定程度的缩小了应用打包的大小;同时shrinkResources经常和minifyEnabled一起使用,打包时会优先筛查项目中未使用到的文件id,例如图片、raw下的pdf等文件等,开启shrinkResources(shrinkResources设置为true)可以极大程度的缩减打包后的应用大小

buildTypes {//构建类型 默认包含debug release 也可以自定义
        release {
            minifyEnabled false //是否启动混淆
            shrinkResources false //清理多余的图片资源或raw中没有用到的资源等,一般会和混淆同时使用(和混淆都可以起到一定程度apk瘦身的作用)
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable true

        }
        debug {
            signingConfig signingConfigs.debug
        }
    }

上述内容全部代码参考如下:

//flavor(产品风味)配置
    flavorDimensions "chip", "oem"  //这是维度,是针对某一种类型风味的描述词汇
    productFlavors {    //产品风味自定义

        _chip_alight3399 {  //渠道名
            dimension "chip"    //指定维度(必填,不然会报错)
            signingConfig signingConfigs.alight3399 //签名配置
            buildConfigField "String", "MMKV_PATH", "\"/sdcard/Android/data/com.alight.android.aoa_launcher/alight_mmkv\""
            //自定义字符串
        }
        _chip_3399 {
            dimension "chip"
            signingConfig signingConfigs.release_3399
            buildConfigField("String", "MMKV_PATH", "\"/data/media/0/alight_mmkv/\"")
        }

        _chip_3566 {
            dimension "chip"
            signingConfig signingConfigs.release_3566
            buildConfigField("String", "MMKV_PATH", "\"/sdcard/alight_mmkv/\"")

        }

        _oem_self_test {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"test.api.alight-sys.com\"")
        }

        _oem_self_pre {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"pre-api.alight-sys.com\"")
        }

        _oem_self_prod {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"api.alight-sys.com\"")
        }

        _oem_guangfeng_test {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
        }

        _oem_guangfeng_prod {
            dimension "oem"
            buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
        }

    }

    //应用变种 copy 到对应的位置
    applicationVariants.all { variant ->
        def oldVersion = variant.versionName;
        String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
        def version_env = "test";
        if (tskReqStr.contains("_pre")) {
            version_env = "pre-release"
        } else if (tskReqStr.contains("_test")) {
            version_env = "test"
        } else if (tskReqStr.contains("_prod")) {
            version_env = "prod-release"
        }
        def versionName = oldVersion + "-" + version_env
        Pattern chip_pattern = Pattern.compile("_chip_(\\w+)(_)")
        Matcher chip_matcher = chip_pattern.matcher(tskReqStr)
        String chip = "3399"
        if (chip_matcher.find()) {
            chip = chip_matcher.group(1)
        }
        def name = "launcher_${chip}_${project.APP_VERSION_CODE}_${versionName}_${project.AOS_VERSION}_${releaseTime()}.apk"
        variant.outputs.each { output ->
            output.versionNameOverride = versionName;
        }
        variant.assemble.doLast {
            variant.outputs.forEach { file ->
                ant.copy file: file.outputFile,
                        tofile: "${project.rootDir}/launcher_build/$name"
            }
        }
    }
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值