活跃用户数量偏少?让我们从代码上分析一下原因!

最近有网友发现友盟的数据统计里面,活跃用户的数量有点不大对劲,跟启动次数相比,严重偏少。sdk的使用方式没啥好说的,就那么简单几步,应该不会是sdk设置的问题。于是就从友盟关于活跃用户的定义开始,着手分析这个问题。

活跃用户的定义:打开应用的用户即为活跃用户,不考虑用户的使用情况。

从上面的文章,了解到Umeng里面对用户的定义:友盟将一个独立的设备视为一个用户,然而每个独立的用户是通过UMID来进行唯一标识的。然而UMID又是神马鬼东西?简单来说就是友盟会在第一次安装的时候生成一个UMID,当ID生成以后友盟会尽量保证这个UMID不会发生变化。

在应用对应的存储目录下面,我们可以找到这个UMID的身影:

ngeIdentity.json这个文件来说,cat一下里面的内容,应该可以看到:

笔者发现公司里多台设备的UMID都居然是一个相同的UMID值,WTF!!!也同样是上面这串神秘的代码:528c8e6cd4a3c6598999a0e9df15ad32。

这个时候就需要查一下UMID的生成方式了,从上面那篇UMID方案解析的文章中,可以了解到Android系统中与UMID相关的几个ID:imei、mac地址、android_id。有了这些关键点,我们就可以开始去反编译友盟的sdk包并进行下一步的搜索了(这里反编译了友盟最新的jar包:umeng-analytics-v6.0.1.jar)。。。果然,使用上面这几个关键字,很快就搜索到了一些关键的代码:

段代码逻辑比较简单(由于笔者所调试系统<23,故省略了一部分代码),首先TelephonyManager.getDeviceId()获取imei,若取不到则调用u(context)函数获取下一个字符串,若再取不到,则获取android_id。其实这里可以猜测到,u()中返回的字符串应该就是mac地址,我们来看下函数u()的逻辑代码:

果然,函数u(context)就是返回wifi的mac地址的。那么,回到刚刚的那个问题,到底那串神秘的UMID是528c8e6cd4a3c6598999a0e9df15ad32根据啥来生成的?看着这格式有点像md5。然后把机器上的imei、mac地址、android_id都打印了出来:

突然发现公司设备上打印出来的mac地址都是00:00:00:00:00:00(因为木有wifi模块,只有ethernet模块,囧!!!),怒将其转为md5,正是上面的串代码。

可是,为啥当mac地址是00:00:00:00:00:00的时候,不去选择android_id呢?回去仔细看代码,发现友盟用的是坑爹的TextUtils.isEmpty()来判断mac地址的有效性,跪了,上面那串明明就是无效的mac地址好么?只能说代码写得不严谨。。。

至此,代码及原因分析完毕。当一些Android平板设备统一返回相同的mac地址,如00:00:00:00:00:00时(有可能是没有wifi模块;也有可能是山寨机出现这种情况的时候),友盟将会将其数据识别成同一用户,并且将会造成严重的MAC地址漂移。

作为比较,我们来看一下友盟的竞争对手shareinstall的渠道统计代码!

首先,我们开看看shareinstall的web集成步骤:

<!-- 建议直接引用下面的js链接,以便得到最及时的更新,我们将持续跟踪各种主流浏览器的变化,为您提供最好的服务-->
<script type="text/javascript" src="//www.shareinstall.com/js/page/shareinstall.min.js"></script>
<script type="text/javascript">
//错误处理:确保app始终能正常的安装
var timer = setTimeout(
function() {
var button = document.getElementById("downloadButton");
button.style.visibility = "visible";
button.onclick = function() {
var ua = navigator.userAgent;
if (ua.indexOf(" MicroMessenger/") > -1) {
//微信中显示遮罩提示在浏览器中打开或进入应用宝
var div = document.createElement("div");
div.innerHTML = "<div style="font-size:2rem;color:#fff;text-align:center;"
+"position:fixed;left:0;top:0;background:rgba(0,0,0,0.5);filter:alpha(opacity=50);"
+"width:100%;height:100%;z-index:10000;">点击右上角在浏览器中打开</div>";
document.body.appendChild(div);
} else {
if (ua.indexOf("Android") > -1) {
//直接下载apk
//window.location="apk地址";
} else if (ua.indexOf("iPhone") > -1 || ua.indexOf("iPad") > -1
|| ua.indexOf("iPod") > -1) {
//直接进入appstore
//window.location="appstore地址";
}
}
}
}, 5000);

//shareinstall初始化,初始化时将与shareinstall服务器交互,应尽可能早的调用
/*web页面向app传递的json数据(json string/js Object),应用被拉起或是首次安装时,通过相应的
 android/ios api可以获取此数据*/
var data = ShareInstall.parseUrlParams();//shareinstall.js中提供的工具函数,解析url中的所有查询参数
new ShareInstall({
    appKey : ‘F6BKAREBHF22EB‘,
    onready : function() {
        //shareinstall已成功回调,清除定时器
        clearTimeout(timer);
        timer = null;

        var m = this, button = document.getElementById("downloadButton");
        button.style.visibility = "visible";

        /*用户点击某个按钮时(假定按钮id为downloadButton),安装app*/
        button.onclick = function() {
            m.wakeupOrInstall();
        }
    }
}, data);

</script>
shareinstall提供完整的javascript api,方便Web开发者实现完全自主的设计。

再开看看shareinstall的代码配置(测试):

如果做测试,获取参数,则必须在Appdelegate.h加上如下测试代码。

#pragma mark 将oc数据类型转成NSString
-(NSString *)DataTOjsonString:(id)object
{
if (!object) {
return null;
}

NSString *jsonString = null;
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:&error];
if (! jsonData) {
    NSLog(@"Got an error: %@", error);
} else {

jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
return jsonString;
}
使用Shareinstall 控制中心提供的渠道统计时,在App用户注册完成后调用,可以统计渠道注册量。

警告:必须在注册成功的时调用[ShareInstallSDK reportRegister] 方法,否则可能导致注册统计不准。

由上比较得知,shareinstall与友盟最大的优胜点就在于首先实现完全自主。这很大一部分是因为它们一开始实现目的就有差别。例如:友盟针对一项SDK下载,需要同时下载3个包,而shareinstall则可以一键完成;而在集成上,友盟面对不同的项目需要不同的操作,过程过于繁琐。而shareinstall通过 URL Scheme 和 Universal Links 实现在不同浏览器中拉起APP,应用集成造成的代码冗余少,集成简单。携参安装实现个性化,渠道统计更精确。

原文地址:https://blog.51cto.com/14686870/2473773

时间: 2024-07-28 13:55:27

活跃用户数量偏少?让我们从代码上分析一下原因!的相关文章

用Redis bitmap统计活跃用户、留存

用Redis bitmap统计活跃用户.留存 Spool的开发者博客,描述了Spool利用Redis的bitmaps相关的操作,进行网站活跃用户统计工作. 原文:http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ Redis支持对String类型的value进行基于二进制位的置位操作.通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value

QlikView报表显示连续若干个月内活跃用户的数量

之前有朋友提到了这样一个需求,要计算三年中每年都有销售记录的客户量,只有最近两年有销售纪录的客户量(假如某个用户2012年和2014年都有记录,在2013年没有则不计算在内),以及最近一年的新增客户数量.这里大概描述一下我的思路. Sales表有两个字段Id, Year,要求除上述结果需要Group by Id,然后算Count(DISTINCT Year)的值要等于Min(Year)和Max(Year)的差+1,比如下面关于记录: Year, Id 2014, 14 2013, 14 2012

支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 摘要:Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃用户,系统日传输tweet更多达4亿条,并已完成了以服务为核心的系统架构蜕变. Twitter如今在世界范围内已拥有1.5亿的活跃用户,为了给用户生成timeline(时间轴)需支撑30万QPS,其firehose每秒同样生成22MB数据.整个系统每天传输tweet 4亿条,并且只需要5分钟就可以让一条twe

通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构

原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html 写于2013年7月8日,译文如下: “可以解决推特所面临的挑战”的玩具般的方案是一个常用在扩展性上的比喻.每个人都觉得推特很容易实现.稍微具备一些系统架构的知识我们就可以构建一个推特,就这么简单.但是根据推特软件开发部门的VP Raffi Krikorian在 Timelin

微信小程序活跃用户破4亿 小程序靠什么能成为实体店引流神器?

2017年12月,以"跳一跳"为代表的微信小游戏让人们认识到了小程序的流量潜力.在微信的流量红利下,小程序生态发展迅速,成为开发者们中炙手可热的新风口.2018年初,小程序做到了日活1.7亿.月活4.3亿,参与开发者100多万. 近日,TalkingData发布2018微信小程序洞察报告--<场景+链接,数据视角下的小程序浪潮>.报告预测,2018年小程序数量将突破250万,数量超越AppStore应用总和. 小程序一季度活跃用户破4亿 游戏类别最"受宠"

程序员如何做到『编程速度又快,Bug 数量又少』?

有网友在 Quora 提问:如何把自己训练得『编程速度又快,Bug 数量又少』?下面是 Glyn Williams 的回复很精彩,4.5 k 赞. 三个程序员被要求穿过一片田地,到达另一侧的房子. 菜鸟程序员目测了一下之间很短的距离,说:"不远!我只要十分钟." 资深程序员看了一眼田地,想了一会,说:"我应该能在一天内过去."菜鸟程序员很惊讶. 大神程序员看了一眼田地,说:"看起来要十分钟,但我觉得十五分钟应该够了." 资深程序员冷笑了一声. 菜

5.2亿活跃用户“不活跃”?有点山寨的美图电商尴尬了

前不久,美图正式上线了独立的电商平台--"美铺". 根据美图公布的信息,美铺被定义为一个时尚分享购物社区.有别于传统的B2C或C2C模式,美铺采取的是B2C2C的买手模式,即通过包括买手.网红.KOL在内的时尚达人来连接品牌商和消费者. 文/张书乐(TMT行业观察者.游戏产业时评人,人民网.人民邮电报专栏作者) 刊载于<计算机应用文摘>2017年5月上旬刊 然而,这并没有多少新鲜感.或者说,这不过是微商式的KOL版. 亦步亦趋学网易?这个可能有 把潮自拍的定制功能单拿了出来

查看服务器在线用户数量专业工具——Query User

作为一名刚入行的服务器管理员,有些东西还得自己学,否则的话日常工作中的一些小事情会浪费掉你很多时间,比如说这个:查看当前某台服务器上目前有多少用户数.刚开始我是这样滴: 方法一:RDP登录进去查看.这种方法费时,费力,建议天天闲的蛋疼的管理员采用这样的方法,有工作量啊!报告老板,我今天查了100台服务器了,我干活很多吧? 方法二:登录我们的一个监控工具去看.这种方法也是用的最多的吧!但是当监控工具死慢死慢的时候,你能怎么办?你能怎么办?我问你,你能怎么办?只能等!!!我等的花儿都卸了.... 这

[PHP]基于Sort Set进行活跃用户统计

作者:zhanhailiang 日期:2014-12-14 参考文章: 使用Redis bitmap进行活跃用户统计 本文提供基于Sort Set进行活跃用户统计的PHP版本: https://github.com/billfeller/billfeller.github.io/blob/master/code/UserTj.php