为Android应用增加渠道信息 自动化不同渠道的打包过程的使用详解
发布时间:2022-06-01 11:38:22
为什么需要在应用程序中增加渠道信息?
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应用程序。


猜你喜欢
- 一.MyBatis简介1)MyBatis 是一款优秀的持久层框架2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结
- 最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线。问题是:底部也会显示分割线,这很影响美观。怎么解决这个问
- 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法。本基于springboot做的测试,主要是构建工程方
- 创建AlertDialog的步骤:1、创建AlertDialog.Builder对象2、调用Builder对象的setTitle
- Android图片的处理工具类BitmapUtils,供大家参考,具体内容如下项目中经常会用到图片,所以在这先简单的总结一下。闲言少叙,上代
- 一、先看下项目结构CodeGenerator:生成器主类resources下的mapper.java.vm:一个模板类,用以在生成dao层时
- Spring bean配置单例或多例模式单例spring bean 默认是单例默认,在对应.xml文件中的配置是:<bean id=&
- Spring security 重写Filter实现json登录在使用SpringSecurity中,大伙都知道默认的登录数据是通过key/
- Mybatis有什么用前两天跟阿里的大牛聊天,他讲到对于性能要求高,需求变化多的互联网项目来说,用在sql优化上的开发时间是大头,有时候代码
- Kotlin中的面向对象面向对象面向对象的含义大家应该并不陌生,通过将事物抽象成对象,大大简化了程序的开发难度。我们常用的Java、Pyth
- 本文实例讲述了C#实现让ListBox适应最大Item宽度的方法。分享给大家供大家参考。具体实现方法如下:private void butt
- SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容。它可以垂直或水平滑动,它有俩个View组成,其一是可以拖
- 概述常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow如果只是展示列表数据或者弹窗列表选择,直接使用Li
- 消息的可靠投递在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用
- 这里我们以拨打电话申请权限来写个小例子,也就是CALL_PHONE,因为拨打电话会涉及用户手机的资费问题,因而被列为了危险权限,在Andro
- 本来项目是用的viewpager实现的轮播滚动,但是客户觉得轮播的效果太大众化了,于是就要我们改成渐变切换的效果。听到这需求,我最先想到是给
- 一、背景有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,一般我们检
- sms4j 2.0 全新来袭即sms-aggregation成功加入dromara之后,很多人向我们反应了项目名称太长不好记,也太绕口, 在
- 前言本文主要给大家介绍了关于Kotlin如何开发Android应用的相关内容,关于kotlin我不过多的介绍了,下面直奔主题。第一步:为An
- 二维码是越来越流行了,很多地方都有可能是使用到。如果是静态的二维码还是比较好处理的,通过在线工具就可以直接生成一张二维码图片,比如:草料二维