背景
Android APP发布过程中,因为缺乏统一的管理机制,所以应用商店渠道繁多,为了对各个渠道的应用下载量等进行统计,所以加入了一个渠道的标记,一般做法是在Androidmanifest中添加meta-data 相应的字段。原本我们是通过友盟的渠道打包工具实现的,但是现在友盟已经停止对这个工具进行维护,升级android 的编译版本后,工具不能进行处理了。所以只好自己去发掘另外的途径。
解决办法
-
方法一:最直接的办法是,通过gradle打包,设置不同的任务从而编译出不同渠道的apk,此办法目前网上也有很多资料,不需要赘述,主要的缺点是,每个渠道包都要进行重新的编译,耗时过长,我们的APP基本上每次编译都需要大概1min时间,这样的话,几百个包就需要几个小时,时间成本过高;
-
方法二:直接通过打包的方式来实现过于笨拙,那么就需要另外的一些思路,无非是在已打出的apk安装包里做手脚。通过apktool来进行对apk的反编译,得到Androidmanifest文件,然后修改Androidmanifest中的渠道,再通过apktool重新编译,然后重新签名。经过验证,此方法比方法一效率高一些,但是提升有限,耗时过长;
-
方法三:参考美团网发布的文章 http://tech.meituan.com/mt-apk-packaging.html,在已经生成的apk包中添加空文件,在代码中通过读取此空文件的名称,来获取渠道名,效率很高。但是唯一的问题是需要在代码中添加相应处理,可以作为备选方案。
-
方法四:再次思考方法二,发现主要的时间消耗在apktool对于apk的反编译和编译上,实际上我们需要的只是Androidmanifest文件,不需要对整体进行处理。想到这里,思路就清晰了,通过AXmlPrinter对xml进行解析,得到Androidmanifest的原始文件,修改后重新编译,压缩回apk文件中,必要的话,进行重新签名。但是实施过程中,发现AXmlPrinter只有将文件反编译的功能,没有重新编译的过程。虽说有AXmlPrinter的源码,但是要自己实现这个功能,还是要费一些周折。在不断查找方案的过程中,发现了这篇文章http://www.yrom.net/blog/2015/05/25/the_other_way_to_package_multi_channel_apks/?utm_source=tuicool。原来编译后的xml文件也是可以直接进行操作的,并且文章中已经给出了核心代码,简单经过三个小时的不断实验和验证后,终于实现了这个功能。速度为每个包5s左右时间,时间稍慢,但是在可接受范围内。
-
方法五:Shareinstall免打包渠道统计。它在精准的app分享来源跟踪的技术上,开发了免打包,跨平台的app推广渠道统计功能。 开发者可在shareinstall平台快速创建渠道链接,app通过某一个渠道链接安装后,在shareinstall Android/iOS sdk初始化时,将从shareinstall服务器自动获取到本次安装的渠道编号(无需开发者在代码中手动设置渠道编号重新打包), 同时收集相关信息用于生成渠道报表数据(只包含机型,系统版本,ip等设备相关的信息,不包含任何业务相关的数据)。如需统计注册事件,开发者需结合自身业务,在用户注册成功的情况下调用shareinstall相应的api,发送统计事件;如需更详细评估渠道效果,可使用相应的效果点上报api,使用前需在【效果点管理】页面添加效果点。