Android Gradle多渠道打包的实现方法
作者:黄林晴_阿黄哥 发布时间:2023-04-26 17:03:26
一、前言
什么是多渠道打包以及多渠道打包可以做什么,这里就不做介绍了,相信看到这篇文章的你已经了解了,多渠道打包的方式比较多,这里我们用Gradle多渠道打包方式。
和其他文章有什么不同
网上看到的大多数文章都只讲解了
1.如何修改包名
2.如何修改变量的值
3.如何替换string中的资源
4.如何替换AndroidManifest中的资源
本篇文章会在上述知识点上增加
5.不同渠道如何使用不同的java文件
6.Base模块化中如何使用多渠道
新建项目,在app下build.gradle中android下添加如下代码:
productFlavors{
baidu{
applicationId "com.baidu"
buildConfigField "String","BaseApi",'"http://baidu.com"'
resValue "string","tip",'"hello this is form baidu"'
manifestPlaceholders = [
app_name:"百度APP"
]
}
sougou{
applicationId "com.sougou"
buildConfigField "String","BaseApi",'"http://sougou.com"'
resValue "string","tip",'"hello this is form sugou"'
manifestPlaceholders = [
app_name: "搜狗APP"
]
}
}
这里我们定义两个渠道,一个渠道名称是baidu,一个渠道名称是sougou,通过applicationId直接指定应用包名
不同渠道我们使用的请求地址不同,字段是BaseApi,我们可以通过buildConfigField指定BaseApi中的值,通过buildConfigField
指定的值,我们可以在系统生成的BuildConfig中获取,比如我们获取多渠道中定义的BaseApi:
String baseApi = BuildConfig.BaseApi;
我们来看下BuildConfig中的内容
BaseApi是我们自己定义的,其他的都是默认生成的,这里我们可以看到,应用包名也是我们指定的。
resValue我们可以修改变量的值,这个值会生成在string.xml中,比如上面我们定义了一个tip变量,需要注意的是,这个变量不能出现在string.xml中,否则会提示资源重复。
如果要定义在配置文件中使用的值,则需要使用
manifestPlaceholders
我们分别修改app_name的值,在配置文件中使用占位符${} 使用,如下:
android:label="${app_name}"
接下来,我们将tip的值和BaseApi显示在TextView上,分别运行app的baidu渠道版本和sougou渠道版本
baidu渠道运行如下:
sougou渠道运行如下:
从运行结果我们可以看出来,已经达到我们想要的结果了。
如何使用不同的app图标
那么如何修改不同渠道的app图标呢,当然我们可以在manifestPlaceholders中添加图标资源的占位符,但是我们这里使用另一种方法,
有时候我们不仅要替换图标,可能要替换raw下的资源或者assets下的资源,这种情况下我们就需要
使用下面的方式:
在src目录下新建与main同级且与渠道名称一样的文件包名,并且新建res资源目录,放入图标使用的图片资源,必须要与main中的名称相同才可以覆盖,如图所示:
并且在gradle中设置sourceSet
sourceSets{
baidu{
res.srcDirs = ['src/baidu/res','src/baidu/res']
}
sougou{
res.srcDirs = ['src/sougou/res','src/sougou/res']
}
}
我们通过res.srcDirs就指定了不同渠道使用的资源文件,这里从网上随便找了两张截图作为图标(如有侵权,联系删除)
运行两个app,结果显示如下:
moudle中如何配置多渠道
在实际的开发中,我们可能会有一个base模块,不同渠道base模块中引用的资源也不同,我们该如何配置呢?
我们新建basemoudle模块,app依赖basemodule模块
同样,我们在模块的gradl下 配置如下:
productFlavors {
baidu {
buildConfigField "String", "BaseMoudeDesc", '"这是base模块百度的描述"'
resValue "string", "basetip", '"i come form base_baidu"'
}
sougou {
buildConfigField "String", "BaseMoudeDesc", '"这是base模块搜狗的描述"'
resValue "string", "basetip", '"i come form base_baidu"'
}
}
因为我们的base模块也有两个渠道,所以app在依赖的时候,必须分渠道去依赖
baiduCompile project(path:':basemodule',configuration:'baiduRelease')
sougouCompile project(path: ':basemodule',configuration:'sougouRelease')
我们直接编译会出现上面的问题,因为module模块可能没有生成对应的编译资源,因为android的默认编译是debug类型的,所以为了和app主模块同步,我们设置去掉默认的发布类型,需要在module中的gradle中添加:
publishNonDefault true
变量的使用和上面app的使用方式一样,在这里就不展示了。
不同渠道如何使用不同java文件
同不同渠道使用资源文件一样,不过需要注意的是,main文件中就不能存放要替换的java文件了,否则会报资源重复的错误,同样的我们在base模块分别新建baidu和sougou渠道包,并且分别新建MainActivity,如图所示。
设置java资源目录
sourceSets {
baidu {
res.srcDirs = ['src/baidu/res', 'src/baidu/res']
java.srcDirs = ['src/baidu/java','src/baidu/java']
}
sougou {
res.srcDirs = ['src/sougou/res', 'src/sougou/res']
java.srcDirs = ['src/sougou/java','src/sougou/java']
}
}
为了展示两个页面的不同,我们将百度渠道的页面背景设为粉红色,搜狗渠道的页面背景设置蓝色,在app添加按钮并添加监听事件,打开module中的主页面。
运行效果如下所示:
到这里,常用的多渠道打包需要的配置就结束了,如有错误欢迎指正。
来源:https://juejin.im/post/6894117336065212423


猜你喜欢
- 最近学习Spring的源码,发现一个利器BeanPostProcessor。这个后置处理器可以在bean初始化前后对bean进行操作。我们可
- intellij idea是一款非常优秀的软件开发工具,它拥有这强大的插件体系,可以帮助开发者完成很多重量级的功能。今天,我们来学习一下如何
- 前言本文将介绍通过Java编程在PDF文档中添加表格的方法。添加表格时,可设置表格边框、单元格对齐方式、单元格背景色、单元格合并、插入图片、
- 本文介绍了spring整合JMS实现同步收发消息(基于ActiveMQ的实现),分享给大家,具体如下:1. 安装ActiveMQ注意:JDK
- 话不多说,跟着小编一起来看下吧using System;using System.Collections.Generic;using Sys
- 在Unity3d中开发虚拟摇杆方式有比较多,可以使用EasyTouch、FairyGUI等插件来开发。本文给大家介绍使用Unity3d的原生
- 人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示
- turbine是聚合服务器发送事件流数据的一个工具,hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过turbine
- 前言接触Android Stuidio有一阵子了,之前用的时候有很多小问题,不过现在的版本感觉已经很好用了,所以准备彻底从Eclipse转战
- 在项目迁移到Spring Boot之后,发生内存使用量过高的问题。本文介绍了整个排查过程以及使用到的工具,也非常适用于其他堆外内存排查。背景
- 简评:作为一位 Android 开发者,Android Studio 肯定是每天都要打交道的,熟练掌握其中的快捷键等技巧可以提高我们不少的效
- IntelliJ IDEA2022 springboot 热部署 html#pom.xml<dependency>
- 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后
- 一、文件上传的原理分析1、文件上传的必要前提a、表单的method必须是postb、表单的enctype属性必须是multipart/for
- 前言为了解决项目当中的权限管理问题,我们一般会选择引入spring security或者shiro框架来帮助我们更好地更快地构建权限管理体系
- 01: 异步任务02: 定时任务一、SpringBoot--任务:邮件任务1.1 添加依赖(增加邮件支持)pom.xml <depen
- 1、SpringMVC中默认集成SpringMVC已经默认集成了JackSon,如下所示: @RequestMapping(&q
- 类加载所有类加载器,都是ClassLoader的子类。类加载器永远以.class运行的目录为准。读取classpath根目录下的文件有以下几
- Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来
- 本文实例为大家分享了Android Walker登录记住密码页面的具体代码,供大家参考,具体内容如下目标效果: 这一次修改的不多,