当前位置: 首页 > news >正文

郑州 网站报价/软文文章

郑州 网站报价,软文文章,怎样使用二维码做网站,陕西建站公司今天写一篇文章来总结下android批量打渠道包美团版本。之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑。特别是赶上项目上线的话,如果给测试提交了正…

今天写一篇文章来总结下android批量打渠道包美团版本。之前项目上一直用的是gradle 批量打包方式,那个速度啊真是令人发指,15个渠道得跑上半个小时,出去吃顿饭回来,还在跑。特别是赶上项目上线的话,如果给测试提交了正式版本1.0,突然发现有小bug要修复,修复后又得重新批量打包半个小时。。。。无语啦。。。真佩服以前的耐心。。。。好了今天来看下打包方案 - 美团多渠道打包方案。至于为撒是美团,应该是这个方案是美团的哪一位大神放出来的吧。

为什么要打渠道包

为什么要渠道打包,一个包不是挺好的吗,一个包也可以发布到各个应用市场嘛?以前刚入门时候也是傻乎乎的这么想的。如果现在你老板提出这样需求场景:亮仔呀,我想知道我们的APP在哪个应用市场渠道下载的最多,我们以后就重点推广这个渠道,用钱砸到排名前面!!! 亮仔傻眼了!!—— 所以不同渠道打包主要用来做统计分析,特别是游戏应用,特别注意哪个渠道推广的最有效。

下面是友盟平台,APP统计各个渠道的分析图:

5d1ad9839c90?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

TIM图片20170620101652.png

从统计图可以看出APP在各个渠道的用户、活跃度、启动次数、活动时长....还是比较详细的,对运营团队有着很大的指导作用哈。

怎么打渠道包

怎么渠道打包呢?亮仔就开始想了:这还不简单,三步搞定:

1.我在Adminifest.xml文件里面配一个meta-data值,这个值写死成某个渠道;

2.在用户安装了我们的APP后,我获取这个写死的渠道值然后上传到后台;

3.我挨个修改meta-data值,改成各个渠道然后编译打包10分钟搞定;

很快亮仔就开始上手,很快实现了老板提出的需求!!! 好景不长... 老板:亮仔啊,我们这个应用下载量不给力啊,推广不够啊,这样我们把我们APP发到市场上所有渠道上,广撒网捕鱼嘛,也不多就100多个渠道吧!!! 亮仔慌了:我擦,我打一个包需要2分钟,100个包 3个多小时啊 这一天光打包了.....

所以基于上面的场景,我们发现主要有两个问题:

打包的本质是将渠道标识传递给后台

这一步已经有第三方平台帮我们做了,实现的思路应该也也差不多,我们集成友盟的渠道统计分析即可。没有必要写一套自己的渠道统计分析。友盟渠道统计接入传送门>>

怎样快速打包

为什么打包会花那么长时间?因为每个渠道打一次包,就要重新编译一次,所以耗时长。其实只要想办法将打好的一个包,替换里面的meta-data值即可。我们来看下美团多渠道打包是怎么做的:

1.首先你需要安装python环境

不要被python环境搭建吓到,其实就跟安装一个普通的exe软件差不多,下一步。。安装后不需要配置什么环境变量之类。 [python下载传送门 >>](https://www.python.org/downloads/)

2.项目中接入友盟统计

2.1 申请友盟的账号

在Adminifest.xml中配置友盟ID和渠道标识

android:name="UMENG_APPKEY"

android:value="***************">

android:name="UMENG_CHANNEL"

android:value="baidu" />

2.2 应用启动时上传渠道标识给友盟

ChannelUtil 是封装的一个获取渠道标识的工具类

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

String channel=ChannelUtil.getChannel(this, "default channel");//获取渠道名

AnalyticsConfig.setChannel(channel);//调用umeng api设置umeng渠道

}

}

ChaneUtil工具类直接偷来的~~

import java.io.IOException;

import java.util.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.content.pm.ApplicationInfo;

import android.content.pm.PackageManager.NameNotFoundException;

import android.preference.PreferenceManager;

import android.text.TextUtils;

public class ChannelUtil {

private static final String CHANNEL_KEY = "cztchannel";

private static final String CHANNEL_VERSION_KEY = "cztchannel_version";

private static String mChannel;

/**

* 返回市场。 如果获取失败返回""

* @param context

* @return

*/

public static String getChannel(Context context){

return getChannel(context, "");

}

/**

* 返回市场。 如果获取失败返回defaultChannel

* @param context

* @param defaultChannel

* @return

*/

public static String getChannel(Context context, String defaultChannel) {

//内存中获取

if(!TextUtils.isEmpty(mChannel)){

return mChannel;

}

//sp中获取

mChannel = getChannelBySharedPreferences(context);

if(!TextUtils.isEmpty(mChannel)){

return mChannel;

}

//从apk中获取

mChannel = getChannelFromApk(context, CHANNEL_KEY);

if(!TextUtils.isEmpty(mChannel)){

//保存sp中备用

saveChannelBySharedPreferences(context, mChannel);

return mChannel;

}

//全部获取失败

return defaultChannel;

}

/**

* 从apk中获取版本信息

* @param context

* @param channelKey

* @return

*/

private static String getChannelFromApk(Context context, String channelKey) {

//从apk包中获取

ApplicationInfo appinfo = context.getApplicationInfo();

String sourceDir = appinfo.sourceDir;

//默认放在meta-inf/里, 所以需要再拼接一下

String key = "META-INF/" + channelKey;

String ret = "";

ZipFile zipfile = null;

try {

zipfile = new ZipFile(sourceDir);

Enumeration> entries = zipfile.entries();

while (entries.hasMoreElements()) {

ZipEntry entry = ((ZipEntry) entries.nextElement());

String entryName = entry.getName();

if (entryName.startsWith(key)) {

ret = entryName;

break;

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (zipfile != null) {

try {

zipfile.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

String[] split = ret.split("_");

String channel = "";

if (split != null && split.length >= 2) {

channel = ret.substring(split[0].length() + 1);

}

return channel;

}

/**

* 本地保存channel & 对应版本号

* @param context

* @param channel

*/

private static void saveChannelBySharedPreferences(Context context, String channel){

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

Editor editor = sp.edit();

editor.putString(CHANNEL_KEY, channel);

editor.putInt(CHANNEL_VERSION_KEY, getVersionCode(context));

editor.commit();

}

/**

* 从sp中获取channel

* @param context

* @return 为空表示获取异常、sp中的值已经失效、sp中没有此值

*/

private static String getChannelBySharedPreferences(Context context){

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

int currentVersionCode = getVersionCode(context);

if(currentVersionCode == -1){

//获取错误

return "";

}

int versionCodeSaved = sp.getInt(CHANNEL_VERSION_KEY, -1);

if(versionCodeSaved == -1){

//本地没有存储的channel对应的版本号

//第一次使用 或者 原先存储版本号异常

return "";

}

if(currentVersionCode != versionCodeSaved){

return "";

}

return sp.getString(CHANNEL_KEY, "");

}

/**

* 从包信息中获取版本号

* @param context

* @return

*/

private static int getVersionCode(Context context){

try{

return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;

}catch(NameNotFoundException e) {

e.printStackTrace();

}

return -1;

}

}

3.运行打包脚本打包

3.1 下载打包脚本

5d1ad9839c90?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

下载解压

3.2 配置渠道

5d1ad9839c90?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

配置渠道

3.3 拷贝apk包到PythonTool目录下(与py同级)

5d1ad9839c90?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

apk包放置目录

3.4 运行py脚本 MultiChannelBuildTool.py即可打包完成。

(生成的渠道apk包在output_** 目录下)

5d1ad9839c90?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

打包完成

ok,写完啦!刚开始练习写总结文章,有讲的不清楚的,欢迎指正!!

4423

搬砖啦

http://www.lbrq.cn/news/1377415.html

相关文章:

  • 滨海县建设局网站/搜索引擎优化的作用是什么
  • 建设英文网站的申请怎么写/长春百度seo公司
  • 郴州宜章疫情最新情况/谷歌seo是指什么意思
  • 无锡企业制作网站/企业查询软件
  • 帮客户做网站挣钱吗/信息流优化师培训机构
  • 网站开发感受/seo是怎么优化上去
  • 域名同时做邮箱和网站/发广告去哪个平台
  • 嘉兴专业做网站/优化推广服务
  • 广西做网站公司有哪些/百度关键词怎么设置
  • 关于 建设 旅游网站 建议/适合奖励自己的网站免费
  • 扬州鼎盛开发建设有限公司网站/个人如何在百度做广告
  • 宣传片拍摄技巧/如何优化网络连接
  • 做网站怎么兼职/竞价推广账户托管费用
  • 做网站的公司没有技术/百度指数查询工具
  • 网站管理系统哪个好/杭州seo网站优化
  • 网站运行费用/seo优化有哪些
  • 济南建设网站 概况/seo课堂
  • 营销型网站优化/程序员培训机构哪家好
  • 广西新增疫情最新消息今天封城了/china东莞seo
  • 手机网站制作公司/优质网站
  • 襄樊网站开发/怎么做推广让别人主动加我
  • 定做网站多少钱/环球资源外贸平台免费
  • 专做宝宝的用品网站/seo综合查询软件排名
  • dede 网站图标/长春网站seo哪家好
  • 老公做赌博网站推广/推广平台的方式有哪些
  • 网站建设专业/福州seo公司排名
  • 设计公司加盟/seo查询站长工具
  • 新疆好地方app谁开发的/太原seo快速排名怎么样
  • 做网站获取手机号码/谷歌优化培训
  • 上海高端网站制作公司/百度云搜索引擎入口盘多多
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • 【Django】-6- 登录用户身份鉴权
  • rabbitmq消息队列详述
  • 【DL学习笔记】计算图与自动求导
  • Typora v1.10.8 好用的 Markdown 编辑器
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络