为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的基本功能,就能实现我们的要求了。

在Ant中支持循环

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

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

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

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

在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的帮助,就可以有一个基本思路。

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

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

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

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

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

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

(0)

相关推荐

  • 基于Android 错误信息捕获发送至服务器的详解

    程序员最头疼的事情就是bug和debug.这次debug长达20天,搞的我心力交瘁.累,因为Android兼容性,不同手机会有不同的bug出来,而且很难复现,所以就上网找了下类似保存错误log到文件再上传到服务器,现把源码也共享出来.上传至服务器的代码我没加.相信大家都有现成的代码了. 先讲下原理,跟JavaEE的自定义异常捕获一样,将错误一直向上抛,然后在最上层统一处理.这里就可以获得Exception Message,进行保存操作异常捕获类如下: 复制代码 代码如下: /**  * @aut

  • android横竖屏切换不重启activity解决方案

    部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性Android:configChanges="orientation|keyboardHidden" 即可,比如 <activity android:name=".android123" android:configChange

  • Android实现将应用崩溃信息发送给开发者并重启应用的方法

    本文实例讲述了Android实现将应用崩溃信息发送给开发者并重启应用的方法.分享给大家供大家参考,具体如下: 在开发过程中,虽然经过测试,但在发布后,在广大用户各种各样的运行环境和操作下,可能会发生一些异想不到的错误导致程序崩溃.将这些错误信息收集起来并反馈给开发者,对于开发者改进优化程序是相当重要的.好了,下面就来实现这种功能吧. (更正时间:2012年2月9日18时42分07秒) 由于为历史帖原因,以下做法比较浪费,但抓取异常的效果是一样的. 1.对于UI线程(即Android中的主线程)抛

  • Android 后台发送邮件示例 (收集应用异常信息+Demo代码)

    上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序.上次说的收集方法主要是把收集的信息通过Http的post请求把相关的异常信息变成请求参数发送到服务器.这个对做过web开发的人来说,服务端处理是很简单.不过对很多没做个web的人来说却是麻烦事.今天介绍个更简单的方法,我们把异常信息收集后,通过后台发送邮件方法,把相关异常信息发送到我们指定的邮箱里面. 这篇文章是实用性文章,不会涉及太多理论分析.主要是让大家看了以后知道怎么在自己的应用里面添加这个功能. 1.第三方库这次发

  • Android编程实现系统重启与关机的方法

    本文实例讲述了Android编程实现系统重启与关机的方法.分享给大家供大家参考,具体如下: 最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是对应一个 Linux 用户都会被分配到一个属于自己的统一的 Linux 用户 ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它). 用户 ID 在应用

  • 总结Android中多线程更新应用的页面信息的方式

    一.runOnUiThread的用法 runOnUiThread是Activity的内部方法,使用时最好指定当前的环境变量(Context). new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { public void run() { Toast.makeText(mainActivity.this,"UI操作...",0).show(); } }); } })

  • Android实现关机重启的方法分享

    实现系统重启的APK需要system的权限,在AndroidManifest.xml中增加android:sharedUserId="android.uid.system",再修改签名即可: 具体方法参考: 点击打开链接 1.使用PowerManager来实现:代码: 复制代码 代码如下: private void rebootSystem(){      PowerManager pManager=(PowerManager) getSystemService(Context.POW

  • Android实现Service重启的方法

    本文实例讲述了Android实现Service重启的方法.分享给大家供大家参考.具体如下: 做APP的时候,我们可能需要一个后台服务一直在运行着,得用到Service组件. 但服务可能在如下情况被杀死: A.用户手动点击停止. B.采用第三方软件(比如360手机卫士)进行清理,当然这样子除了系统服务外,其他的进程肯定也会被杀死,除非跟手机厂商联系. 这时候可能需要重启该服务,上网看了半天,有提到用Timer.AlarmManager去实现间歇性的发送广播启动Service(注册的广播接收后,启动

  • Android实现获取应用程序相关信息列表的方法

    本文所述为Androdi获取手机应用列表的方法,比如获取到Android应用的软件属性.大小和应用程序路径.应用名称等,获取所有已安装的Android应用列表,包括那些卸载了的,但没有清除数据的应用程序,同时在获取到应用信息的时候,判断是不是系统的应用程序,这是一个应用管理器所必需具备的功能. 具体实现代码如下: //AppInfoProvider.java package com.xh.ui; import java.util.ArrayList; import java.util.List;

  • Android中Webview打开网页的同时发送HTTP头信息方法

    众所周知,当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HTTP头信息的. 复制代码 代码如下: public v

  • Android手机获取root权限并实现关机重启功能的方法

    本文实例讲述了Android手机获取root权限并实现关机重启功能的方法,是Android程序设计中非常常见的重要功能.现分享给大家,供大家在Android程序开发中参考之用. 具体功能代码如下: /* * 执行命令 * @param command * 1.获取root权限 "chmod 777 "+getPackageCodePath() * 2.关机 reboot -p * 3.重启 reboot */ public static boolean execCmd(String c

随机推荐