zoukankan      html  css  js  c++  java
  • 为Android应用增加渠道信息 自动化不同渠道的打包过程

    为什么需要在应用程序中增加渠道信息?

    Android应用的发布需要面对各种各样的市场,我们称之为渠道。有的时候,我们需要知道应用是从哪个渠道下载的。比如,我们可能需要统计哪些市场带来的用户量比较大。再比如,我们可能有一些盈利需要和具体的渠道进行分成。这些都是统计渠道的信息。

    一般如何在应用中加入渠道信息?

    为了统计渠道信息,就不得不在程序的某个地方加入渠道的信息,然后针对不同的渠道打不同的包。一般可以在Manifest文件中加入渠道编号,而不直接写在代码中。这样做的好处是,可以针对不同渠道,自动化去修改Manifest文件中的渠道编号,然后自动为该渠道打包。

    Manifest文件支持Meta Data标签,建议使用这种自定义标签。例如下面的文件片段。

    <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          android:versionCode="X"

          android:versionName="X.X.X"

          package="com.XXX">

          ……

        <application android:icon="@drawable/icon"

                android:label="@string/app_name">

            ……

        <meta-data android:name="CHANNEL" android:value="C_001" />

        </application>

    </manifest>

    在这段代码示例中,我们在Application节点下增加了一个meta-data标签,名称是CHANNEL,值是C_001,是我们规定的一个渠道的编号。

    为不同的渠道打包,就要手工或者自动化修改C_001成为C_002、C_003等等其它我们定义的渠道编号,然后再打不同的包。

    程序如何读取打包的渠道编号?

    在程序代码中,可以读取Manifest文件中定义的meta-data。以下为代码实例。

        public static String getChannelCode(Context context) {

           String code = getMetaData(context, "CHANNEL");

           if (code != null) {

               return code;

           }

           return "C_000";

        }

       

        private static String getMetaData(Context context, String key) {

           try {

               ApplicationInfo  ai = context.getPackageManager().getApplicationInfo(

                      context.getPackageName(), PackageManager.GET_META_DATA);

               Object value = ai.metaData.get(key);

               if (value != null) {

                  return value.toString();

               }

           } catch (Exception e) {

               //

           }

           return null;

        }

    如何自动化打包过程?

    我们想要自动化针对不同渠道打不同包的过程,有两种情况。一种是有源代码的情况,一种是没有源代码只有APK文件的情况。

    有源代码的情况。

    有源代码的情况比较简单。我们可以使用自动化脚本工具进行打包,比如使用Ant。

    使用Ant打包,有两个关键问题:一个是要在Ant中支持For循环,以自动做多次打包动作;一个是如何能够在Ant中修改Manifest文件,以支持不同的市场。只要解决了这两个关键问题,配合Ant的基本功能,就能实现我们的要求了。

    1. 在Ant中支持循环

    在Ant的核心包里没有相关的For循环的Task,要下载相应的扩展包。可以使用开源的Ant-contrib包。

    下载地址:http://ant-contrib.sourceforge.net/

    下载完成后,把ant-contrib里的lib包复制到安装好的Ant库apache-ant-XXX\lib下面,就可以使用了。

    具体如何使用,可以参考ant-contrib的官方网站。

    2. 在Ant中修改Manifest文件

        利用 Ant 扩展任务所提供的 <replaceRegExp> 任务,还可以实现基于正则表达式的替换。

    例如,要将AndroidManifest.xml文件中的行首“C_001”字符串替换为“C_002”,可以使用如下Ant脚本:

    <replaceregexp

            file="AndroidManifest.xml"

            byline="true"

            match="C_001 "

            replace="C_002"

    />

    <replaceRegExp> 任务很强大,这只是一个简单的例子。

    只有APK文件的情况。

    如果没有源代码,只有APK文件,事情相对就稍微复杂一些了。我们知道有一个开源的APKTOOL,可以对APK文件进行反编译,或者重新打包。具体的请参考APKTOOL的官方文件。

    有了APKTOOL的帮助,就可以有一个基本思路。

    1. 先使用APKTOOL对APK文件进行反编译,反编译出来资源文件和AndroidManifest.xml文件。

    2. 使用脚本代码修改AndroidManifest.xml文件中的渠道ID文本。

    3. 使用APKTOOL重新打包成APK文件。

    4. 使用jarsigner工具为APK文件签名。

    只要反复重复2-4步骤,即可对不同的渠道打出不同的APK安装包。

    根据这个思路,具体的实现就相对简单了。可以写成一个BAT脚本文件,也可以写成Java应用程序。

    ---------------------------------------------------------------------------
    GL(arui319)
    http://blog.csdn.net/arui319
    <本文可以转载,但是请保留以上作者信息。谢谢。>

  • 相关阅读:
    java.lang.NoSuchMethodError: org.springframework.util.Assert.state(ZLjava/util/function/Supplier;)V
    数据结构中常见的树
    ConcurrentHashMap原理分析
    Synchronized锁升级
    thread.join() 阻塞原理分析
    mysql数据精度丢失问题深入探讨
    ThreadPoolExecutor线程池原理
    JVM的内存区域划分(jdk7和jdk8)
    多线程AQS
    Centos 的防火墙(firewalld,iptables)
  • 原文地址:https://www.cnblogs.com/tt_mc/p/2790641.html
Copyright © 2011-2022 走看看