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

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

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

一、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-data
            android:name="welcome_bg"
            android:value="${welcome_bg}"/>

        <meta-data
            android:name="tint_color"
            android:value="${tint_color}"/>

        <meta-data
            android: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

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

源码地址

时间: 2024-08-05 15:25:08

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

建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期

?团队开发时,每天都需要输出一个apk包给其它部门的同事测试验证.打包几乎是每天必须完成的功课.如果用IDE来输出apk,那速度是非常慢的,如果还需要有不同渠道的apk包,那程序猿都要疯了.当然也有用ant工具的,这个工具可以很快的打包apk,但还是需要自己在命令行中输出,那也不是特别完美.所以建立一个定时打包系统来解救苦逼的程序猿吧. 本篇的主要目的是建立一个可以打多渠道包的环境. 原文地址:http://angrycode.net/article/484.html

Android Studio之Gradle多渠道打包

Android Studio之Gradle多渠道打包 由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID&qu

【转】Android Studio系列教程六--Gradle多渠道打包

原文链接:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ 由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_

Android Studio系列教程六--Gradle多渠道打包

由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的Channel_ID就是渠

Gradle多渠道打包

由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的Channel_ID就是渠

转-Android Studio系列教程六--Gradle多渠道打包

友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的Channel_ID就是渠道标示.我们的目标就是在编译的时候这个值能够自动变化. 第一步 在AndroidManifest.xml里配置PlaceHolder <meta-data android:na

使用gradle多渠道打包

以友盟的多渠道打包为例,如果我们须要打包出例如以下渠道:UMENG, WANDOUJIA, YINGYONGBAO. 第一种方法.是须要创建文件的. 我们在写完我们的代码之后,在app/src以下.分别创建和main同级目录的目录umeng, wandoujia, yingyongbao,这三个目录里面都各仅仅有一个AndroidManifest.xml文件,文件仅仅须要例如以下: [plain] view plaincopy <manifest xmlns:android="http:/

Android Studio + gradle多渠道打包

通过工具栏的Build->Build Apk 好像只能打包第一个Module(eclipse里面是Project的概念),怎么多渠道打包呢?目前好像只能一个一个的打 首先在清单文件里设置个变量: 这个变量可以在Application里这样获得,从而app内就知道是哪个渠道了, 然后在build.gradle里设置productFlavors 如yingyongbao就填充到清单文件里面的CHANEL_NAME变量了 找到Gradle任务单元,进入build单元,右键run,就能生产出该渠道的ap

Gradle多渠道打包[umeng]

前言 国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App! 正文 Umeng多渠道 我们在项目中会使用统计SDK,用的最流行的当属umeng了吧.这里我们就用友盟来说明.用了友盟的App的清单文件AndroidManifest.xml中都会写上meta-data,来区分不同的渠道: <meta-data android:name="UMENG_CHANNEL&quo