Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

Posted 架构师必备

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)相关的知识,希望对你有一定的参考价值。

特别声明:本文已获得作者授权转载,版权归作者所有


最近有个需求一次要打包9个类型的App,而且常量和String.xml都有变量。虽然之前也是一直存在变量,但是每次也仅仅只打包一个。这让我每次改变量,打包9个。要是以后每次都打包9次,我得疯了。
根据之前的了解,gradle 应该是可以解决这个问题的。所以就仔细研究了一番。


先放一个完整的 多渠道/多环境 打包的配置,然后再来讲解。


实现了:

  1. 不同环境,不同包名;

  2. 不同环境,修改不同的 string.xml 资源文件;

  3. 不同环境,修改指定的常量;

  4. 不同环境,修改 androidManifest.xml 里渠道变量;

  5. 不同环境,引用不同的 module。


先放一个完整的配置,可以参考:

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)


接下来我们来详细看看修改特定的字段。

不同环境的设置基本都是在 productFlavors 里设置的,
而且在里面你想添加多少个环境都可以。

1. 不同环境,不同包名;

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

这里注意,在 defaultConfig 中,大家应该都是写了个默认的 applicationId 的。
经测试,productFlavors 设置的不同环境包名会覆盖 defaultConfig 里面的设置,
所以我们可以推测,它执行的顺序应该是先执行默认的,然后在执行分渠道的,如果冲突,会覆盖处理,这也很符合逻辑。

2. 不同环境,添加 string.xml 资源文件;

利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
如下就根据不同的类型,添加了不同的 app_name 字段,以及定义了 布尔值,可以通过 R.string.app_name 来引用。

注意,这里是添加,是在 string.xml 里面添加了一个字段app_name,所以在现有的 string.xml 中不能有这个字段,否则会报错!!!

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

通过以上我们大概可以推测出 color、dimen 也可以通过类似的方法添加。

3. 不同环境,动态修改指定的常量;

使用 BuildConfig 的变量。

①定义字段

当我们定义如下字段之后,编译后自动生成文件,在 app/build/source/BuildConfig/dev/com.lyl.dev/BuildConfig 目录,
打开这个文件,我们就能看到我们所定义的字段了。

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

②引用字段

在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

注意:这里有个小细节,看其中第三个参数,是先用了“'”,然后在用了“"”,这种语法在 Java 里可能比较陌生,但是在很多其他语言中,这种用法是很常见的。
它的意思是 "dev" 这个整体是属于一个字符串,至于为什么要这么写,你把单引号去掉,然后去 app/build/source/BuildConfig/dev/com.lyl.dev/BuildConfig 这个文件看一看就知道了。

4. 不同环境,修改 AndroidManifest.xml 里渠道变量

①在 AndroidManifest.xml 里添加渠道变量

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

②在 build.gradle 设置 productFlavors

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

这样我们可以在不同环境使用不同的 key 值。

5. 不同环境,引用不同的 module

这个就很强大了,根据不同的环境,引用对应的 module。
你可以替换大量的图片,string,color,vaule等等。

首先,要建立跟渠道对应的 module,然后再引用。
引用方式如下:

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

xxxCompile 代表 各个渠道的名称。
然后把需要分渠道的文件,放到不同的 module 里面,把主项目的文件删掉。
千万注意:如果这样做了,每次需要引用的时候,在各个渠道的 module 里面都必须要放置文件哦,不然会找不到资源。
通过这种方式可以替换整套素材资源,具体如何使用还得看项目需求。


通过以上方式,我们基本可以 通过 gradle 动态设定应用标题,应用图标,替换常量,设置不同包名,更改渠道等等。

打包编译

最后,做完所有的配置之后,然后就是打包操作了。

打包某一个(日常编译)

因为 buildTypes 里面有两种,所以每个渠道都会有两种模式。

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

打包所有的,就是正常打包流程

如图所示:

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

图片来源网络

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

图片来源网络

 
打包完成之后,然后就可以在我们指定的目录下,看到我们所生成的apk包。

使用 local.properties 存放私密配置

以上就可以基本实现 gradle 的设置,但是如果我们要将我们的项目上传到 Github ,或者要将项目发送给别人。上面有些私密的东西就会被别人看到。比如:.jks 文件的密码。
在项目跟目录下,有个 local.properties 文件,我们可以使用它来存放一些私密的属性,然后在 gradle 中读取,而 local.properties 文件不需要上传。
local.properties 文件里设置如下:

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

在 build.gradle 读取 local.properties 字段信息

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

这样就可以将自己想要隐藏的一些数据隐藏起来。


可能加快 Android Studio 编译的办法

1. 在根目录的 build.gradle 里加上如下代码:

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

2. 在 app 级别下 build.gradle 里 加上



以上是关于Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)的主要内容,如果未能解决你的问题,请参考以下文章

推荐这是我用过最精简的App多渠道打包工具

使用gradle多渠道打包

Android Studio + gradle多渠道打包

Android gradle实现多渠道号打包

Android 根据打包环境不同,显示不同的应用名称

Android 根据打包环境不同,显示不同的应用名称