我不是诗人,写不出厦门的美;我不是歌手,唱不出厦门的情;我不是画家,画不出厦门的景。

我只是一名程序员,我只能用我的眼,我的心去看去感受,那久违的海风吹拂着脸颊,好似内心那一份烦躁与沉重也随着海风飘向了远方 . . . . . .

一、Gradle多渠道打包之缘由

时间要追溯到两年前,当时我还在使用 eclipse 开发工具。兄弟事业部有款产品需要封包(使用webview打包成app),并提出了相关的需求:

  • 针对不同商家地址(webview加载url),App名称,应用图标,欢迎页背景,状态栏颜色(背景同色)都不同,以及版本号不同。

  • 针对不同的商家都必须打包成独立的App,不会出现覆盖安装。

针对以上的需求每次打包都需要替换App名称,应用图标,背景等资源,还必须修改包名(带来的一系列报错)。后期又提出了升级功能,又得把资源、包名修改回去,一番折腾真的欲仙欲死。后来我干脆每次都新建项目打包,业务逻辑没有变化只是资源发生了改变,代码是拷贝了一份又一份,而且商家一多,维护起来真的是找得死去活来的,加之客户提出新功能,我每个商家都需要撸一遍 . . . 神啊,谁来拯救我啊

二、自我拯救之路

在后来接触到AndroidStudio(简称AS),逐渐的转到了AS开发,确实比 eclipse高效快速方便。 gradle 构建功能真心非常强大,默认有 debug ,release 版本,我们可以针对不同版本做不同配置,这不正好解决我所遇到的问题。gradle提供了productFlavors节点针对不同的版本做不同的配置。

比如有【四季易购】【仁仁家】【库乐购】商家需要打包。

我在每个分支下面都重新配置applicationId这个属性,从而使打包出来的apk的包名不一样,避免了覆盖安装。

当然针对不同的商家 App名称,图标不一样。这个时候我们就需要配置manifestPlaceholders属性,manifestPlaceholders是一个类似HashMap的容器,因此在manifestPlaceholders可以配置多个属性。如下我们可以这样配置:

gradle配置:

AndroidManifest配置:

注意:节点 meta-data 的配置。

${icon}${app_name} 引用 manifestPlaceholders 容器中 iconapp_name 的值。

客户的需求不仅仅更改App名称与图标,还需要修改webview加载地址,欢迎页背景图片等等,具体配置如下图:

注意:新增的配置同样需要在清单文件中添加 meta-data节点。

        <meta-dataandroid:name="welcome_bg"android:value="${welcome_bg}"/><meta-dataandroid:name="tint_color"android:value="${tint_color}"/><meta-dataandroid:name="load_url"android:value="${load_url}"/>

我们可以通过 Java 代码获取到 meta-data节点下 android:value的值。

一般在 MyApplication 获取节点的值:

    ApplicationInfo info = null;try {info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);int tintColor = info.metaData.getInt("tint_color");String loadUrl=info.metaData.getString("load_url");String welcomePath = info.metaData.getString("welcome_bg");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}

注意:设置welcome_bg:"@mipmap/klg_welcome",我这里以int welcomeRes = info.metaData.getInt("welcome_bg");去取值,每次都返回0,但tint_color的值就正常。按正常思维@mipmap/klg_welcome返回的是 int 值,后来我换成getString还真获取到了值:res/mipmap-hdpi-v4/sjyg_welcome.png。获取到路径值,背景的图片资源就不能直接使用。

那么我们把路径资源转换成int资源,这里就用到了 Java 的反射。具体代码如下:

    Class c = R.mipmap.class;Field[] fields = c.getFields();for (Field field : fields) {if (field.getName().equals(welcomePath.substring(welcomePath.lastIndexOf("/") + 1,welcomePath.lastIndexOf(".")))) {this.welcomeBgRes = (int) field.get(c.newInstance());break;}}

截取路径字符串获取图片的【名称】,根据【名称】在【R.mipmap.class】类中查找,找到则返回该属性的值。

这样我们就把不同的配置信息保存到了MyApplication中,使用的时候直接调用。

还有一种方式在Java代码中可以方便获取到gradle配置文件的数据:

通过代码:context.getResources().getString(R.string.key);获取值。

注意通过此方式 strings.xml 文件下不能有同名的 key 属性。不然会报相同资源引用错误。

三、生成APK

如果你想生成所有渠道的包:

Terminal命令输入如下指令:

gradlew assembleRelease

构建成功请在以下目录查看:

如果你想针对某个渠道打包:

方式一:

配置不同渠道基础信息。

方式二:

更改 applicationId ,添加 manifestPlaceholders集合。

多渠道打包,并不需要更改百度、高德等第三方的key

多渠道打包,解决了以往深深的忧伤。

源码地址

厦门之旅第一篇Gradle多渠道打包(动态设定App名称,应用图标,背景图片,状态栏颜色)相关推荐

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

    最近有个需求一次要打包多个类型的App,而且常量和String.xml都有变量.虽然之前也是一直存在变量,但是每次也仅仅只打包一个.这让我每次改变量,打包9个.要是以后每次都打包9次,我得疯了. 根据 ...

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

    // 多渠道/多环境 的不同配置 productFlavors { dev { // 每个环境包名不同 applicationId "com.lyl.dev" // 动态添加 st ...

  3. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  4. Android Gradle 多渠道打包、动态配置AppName

    目录 一.简介 二.Gradle多渠道打包 1.普通做法 2.Gradle多渠道打包 一.简介 因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市 ...

  5. 【实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!

    目录 [实战HTML5与CSS3 第一篇]初探水深,美丽的导航,绚丽的图片爆炸!! [实战HTML5与CSS3 第二篇]绚丽的快速导航! [实战HTML5与CSS3 第三篇]我第一个HTML5网页诞生 ...

  6. 实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!

    [实战HTML5与CSS3 第一篇]初探水深,美丽的导航,绚丽的图片爆炸!! [实战HTML5与CSS3 第二篇]绚丽的快速导航! [实战HTML5与CSS3 第三篇]我第一个HTML5网页诞生了(提 ...

  7. Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51508132 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  8. react native开发Android 篇——APP名称、图标、启动页

    react native开发Android 篇--APP名称.图标.启动页 设置APP名称 设置APP图标 设置启动页 隐藏启动页 设置APP名称 编辑 android/app/src/main/re ...

  9. Android开发之Gradle多渠道打包总结

    首先老套路看图:分别是小米的渠道和应用宝的渠道 这是渠道的渠道号的截图 先说下Gradle的多渠道打包,个人更喜欢这样写: 第一步:需要在清单文件添加标识: <meta-dataandroid: ...

最新文章

  1. Asterisk 1.8 sip 协议栈分析
  2. python如何改颜色_python和networkx:如何更改节点的颜色
  3. 数字雕刻中“节奏”的作用
  4. 《每日一题》62. Unique Paths 不同路径
  5. 基于eclipse swt做java浏览器内嵌等功能
  6. 【直观理解】为什么梯度的负方向是局部下降最快的方向?
  7. [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
  8. Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
  9. RDS、DDS和GaussDB理不清?看这一篇足够了!
  10. 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
  11. python公式计算器_Python小白篇(二):Python计算器
  12. installshield2020打包教程
  13. java学科竞赛管理系统_《高校学科竞赛管理系统的web前端设计与实现》文献阅读随笔...
  14. 电子书 杜春雷 ARM体系结构与编程
  15. 机器学习面试题(上)
  16. 查看本机IP地址、测试本机与其他设备是否连通、查本机IP归属地
  17. 雅虎邮箱outlook设置 1 2 3
  18. 读书百客:《双双燕·咏燕》赏析
  19. 腾讯 Tars 开源 Go 版本 Tars-Go,并发性能比 gRPC 高 5 倍
  20. Android滑动头部控件

热门文章

  1. Factorization Machines 因式分解机 论文学习笔记
  2. 软件定义存储2.0,谁领风骚?
  3. 静态电影网站模板A(html+css+js)
  4. Fiddler抓包工具保姆级使用教程(超详细)
  5. 【在web项目jsp页面自动生成二维码功能】
  6. 麦克斯韦方程的积分形式及应用、麦克斯韦方程组的微分形式及应用
  7. ssl证书购买后如何认证签发
  8. 聚合函数——MySQL
  9. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序:
  10. Ubuntu18.04安装wps office