https://www.jianshu.com/p/8d08648d7c24
5分钟实现Android友盟统计的集成与使用
<!-- 作者区域 -->
<div class="author">
<a class="avatar" href="/u/4daed297508e">
<img src="//upload.jianshu.io/users/upload_avatars/5699111/539cf39c-4fec-4cdf-b8dd-d515858c4fde.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">
流船
关注
2018.04.07 18:39*
字数 1422
阅读 3097
喜欢 8
<!-- 文章内容 -->
<div data-note-content="" class="show-content">
<div class="show-content-free">
<h2>前言</h2>
app上线后,一般公司都希望跟踪app在市场上的使用情况。包括新增用户、活跃用户、渠道信息、错误信息等,还有例如商城类的app,需要跟踪用户最喜欢浏览哪种类型的店铺或商品。这些都可以通过集成友盟统计来轻松实现。
(小提示:由于截的都是大图,在简书显示比较模糊,需要查看清晰图片则鼠标点击图片放大即可)
集成
一、获取Appkey
集成友盟SDK之前,首先需要到友盟官网注册并且添加新应用,获取Appkey(一般公司项目不需要自己申请账号,跟项目经理要即可)。每个应用对应的Appkey是唯一的,如下:
二、导入SDK
有两种方法:(本Demo中采用第二种方法)
方法一:下载SDK,将解压出来的jar包复制到工程libs/目录下。
下载地址:http://mobile.umeng.com/custom_sdk
只需要下载Analytics SDK即可,如下:
方法二:添加SDK在maven中心库的线上依赖
1、在app的builde.gradle中添加依赖
compile 'com.umeng.sdk:common:latest.integration'
compile 'com.umeng.sdk:analytics:latest.integration'
如果无法正常集成,则需要在项目的builde.gradle中添加如下配置:
allprojects {
repositories {
mavenCentral()
}
}
三、在AndroidManifest.xml中添加权限、配置Appkey与渠道(Channel)
1、添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
2、配置Appkey
<meta-data android:value="5ac6e5a2b27b0a7200000082" android:name="UMENG_APPKEY"/>
3、配置渠道
由于一般会有多个渠道,所以这里的渠道名称不能写死,应该设置成动态的,如下:
<meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
在app的builde.gradle中配置需要的渠道(这里只测试统计宝),对应上面的渠道名称变量。
productFlavors {
tongjibao{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "tongjibao"]
}
}
完整AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mychina.com.androidtongji_youmeng">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application
android:name=".MyApplication"
android:allowBackup=“true”
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl=“true”
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
<span class="hljs-tag"><<span class="hljs-name">category</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.intent.category.LAUNCHER"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">intent-filter</span>></span>
<span class="hljs-tag"></<span class="hljs-name">activity</span>></span>
<span class="hljs-comment"><!--value的值填写你在友盟后台申请的应用Appkey--></span>
<span class="hljs-tag"><<span class="hljs-name">meta-data</span> <span class="hljs-attr">android:value</span>=<span class="hljs-string">"5ac6e5a2b27b0a7200000082"</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"UMENG_APPKEY"</span>/></span>
<span class="hljs-comment"><!--value的值填写渠道名称,例如yingyongbao。这里设置动态渠道变量--></span>
<span class="hljs-tag"><<span class="hljs-name">meta-data</span> <span class="hljs-attr">android:value</span>=<span class="hljs-string">"${UMENG_CHANNEL_VALUE}"</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"UMENG_CHANNEL"</span>/></span>
</application>
</manifest>
完整app的builde.gradle如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion “26.0.2”
defaultConfig {
applicationId “mychina.com.androidtongji_youmeng”
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
productFlavors {
tongjibao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: “tongjibao”]
}
}
}
dependencies {
compile fileTree(dir: ‘libs’, include: [’*.jar’])
androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2’, {
exclude group: ‘com.android.support’, module: ‘support-annotations’
})
compile ‘com.android.support:appcompat-v7:26.0.0-alpha1’
testCompile ‘junit:junit:4.12’
compile ‘com.umeng.sdk:common:latest.integration’
compile ‘com.umeng.sdk:analytics:latest.integration’
}
四、添加初始化方法
在项目工程的自定义application中的onCreate方法中添加以下方法:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,"");
}
}
通过上面的步骤,友盟统计就已经集成好了,下面来看看它各种统计的使用。
使用
Session统计
即启动数据的统计(包括新增用户、活跃用户、启动次数、使用时长等基本数据)
需要在每个Activity的onResume方法中调用 MobclickAgent.onResume(Context),
onPause方法中调用 MobclickAgent.onPause(Context),如下:
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
确保在所有的Activity中都调用 MobclickAgent.onResume() 和onPause()方法。
如果Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计。例如在BaseActivity中添加过,则它的子类就不需要添加了。
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:setSessionContinueMillis(long interval) 来自定义这个间隔(参数单位为毫秒)。
如果开发者调用kill或者exit之类的方法杀死进程,请务必在此之前调用onKillProcess(Context context)方法,用来保存统计数据。
安装app启动后。在友盟后台就可以看到统计的数据了。如下:
新增用户、启动次数、日活等数据:
渠道分析数据:
自定义事件统计
自定义事件可以实现在应用程序中埋点来统计用户的点击行为。例如我们的应用是商城类的,就需要统计用户是喜欢进入“nike”店铺,还是“new banlance"店铺。自定义事件目前包括"计数事件"和"计算事件",这里主要讲下计数事件。
1、首先需要在友盟后台添加自定义事件:设置-事件-手工添加-添加事件。如下:
2、在需要监听自定义事件的地方添加代码,如下模拟点击进入”nike“店铺。
第二个参数为当前统计的事件ID,需要与友盟后台设置的事件ID一致(即上图的事件ID)。
MobclickAgent.onEvent(this, "nike");
3、运行app,触发该事件后。在友盟后台就可以看到统计的数据了。如下:
其中消息数量即为事件被触发的次数。
错误统计
错误分析是友盟为移动开发者提供的Crash收集和分析工具,帮助开发者监测App在移动设备上的运行状况,及时发现并解决错误,提升App的稳定性。
Android统计SDK从V4.6版本开始内建错误统计,不需要开发者再手动集成。
SDK通过Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。 如不需要错误统计功能,可通过此方法关闭
MobclickAgent.setCatchUncaughtExceptions(false);
如果开发者自己捕获了错误,需要上传到【友盟+】服务器可以调用下面方法:
public static void reportError(Context context, String error)
public static void reportError(Context context, Throwable e)
现在我在demo中模拟一次错误,如下:
public void createError(View view) {
int i = 1 / 0;
}
再到友盟后台查看错误,如下:
其他统计
上面三个统计是比较常用的统计,还有很多统计,例如账号统计、页面统计等就不一一列举了。有需求的可以参考友盟统计集成文档
本文demo源码地址:https://github.com/zhengyu6/AndroidTongJi-YouMeng
</div>
</div>
</div>
<!-- 如果是付费文章,未购买,则显示购买按钮 -->
<!-- 连载目录项 -->
<!-- 如果是付费文章 -->
<!-- 如果是付费连载,已购买,且作者允许赞赏,则显示付费信息和赞赏 -->
<div id="free-reward-panel" class="support-author"><p>小礼物走一走,来简书关注我</p> <div class="btn btn-pay">赞赏支持</div> <div class="supporter"><ul class="support-list"></ul> <!----></div> <!----> <!----></div>
<div class="show-foot">
<a class="notebook" href="/nb/11849755">
<i class="iconfont ic-search-notebook"></i>
<span>日记本</span>
© 著作权归作者所有
<!-- 文章底部作者信息 -->
<div class="follow-detail">
<div class="info">
<a class="avatar" href="/u/4daed297508e">
<img src="//upload.jianshu.io/users/upload_avatars/5699111/539cf39c-4fec-4cdf-b8dd-d515858c4fde.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">
关注
流船
写了 24582 字,被 253 人关注,获得了 802 个喜欢
<div class="meta-bottom">
<div data-v-6ddd02c6="" class="like"><div data-v-6ddd02c6="" class="btn like-group"><div data-v-6ddd02c6="" class="btn-like"><a data-v-6ddd02c6="">喜欢</a></div> <div data-v-6ddd02c6="" class="modal-wrap"><a data-v-6ddd02c6="">8</a></div></div> <!----></div>
<div class="share-group">
<a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
<i class="iconfont ic-wechat"></i>
</a>
<a class="share-circle" data-action="weibo-share" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&url=',e(u),'&title=',e(t||d.title),'&source=',e(r),'&sourceUrl=',e(l),'&content=',c||'gb2312','&pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','', '推荐 流船 的文章《5分钟实现Android友盟统计的集成与使用》( 分享自 @简书 )','https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));" data-original-title="分享到微博">
<i class="iconfont ic-weibo"></i>
</a>
<a class="share-circle" data-toggle="tooltip" id="longshare" target="_blank" data-original-title="" title="">
<div class="qrcode" id="qrcode">
<img src="//cdn2.jianshu.io/assets/web/download-index-side-qrcode-cb13fc9106a478795f8d10f9f632fccf.png" alt="Download index side qrcode">
<p>下载app生成长微博图片</p>
</div>
<i class="iconfont ic-picture"></i>
</a>
<a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
<ul class="share-list">
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=qzone')+'&title='+e('推荐 流船 的文章《5分钟实现Android友盟统计的集成与使用》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-zone"></i><span>分享到QQ空间</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=twitter')+'&text='+e('推荐 流船 的文章《5分钟实现Android友盟统计的集成与使用》( 分享自 @jianshucom )')+'&related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-twitter"></i><span>分享到Twitter</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&display=popup&href=https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-facebook"></i><span>分享到Facebook</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-google"></i><span>分享到Google+</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('https://www.jianshu.com/p/8d08648d7c24?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=douban')+'&title='+e('5分钟实现Android友盟统计的集成与使用')+'&sel='+e(s)+'&v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()"><i class="social-icon-sprite social-icon-douban"></i><span>分享到豆瓣</span></a></li>
</ul>
" data-original-title="" title="">更多分享</a>
</div>
</div>
<a id="web-note-ad-2" target="_blank" href="/p/428251ede1aa"><img src="//cdn2.jianshu.io/assets/web/gupao-b953be49108805c4198258448895344a.jpg" alt="Gupao"></a>
<!--
<div id="note-comment-above-ad-container">
<span id="youdao-comment-ad" class="ad-badge">广告</span>
</div>
-->
<div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/9181952/cd069750-bcd8-4738-9b3b-356d6a52ef4f.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> <textarea placeholder="写下你的评论..."></textarea> <!----></form> <!----></div> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="normal-comment-list" class="normal-comment-list"><div><div><div class="top-title"><span>5条评论</span> <a class="author-only">只看作者</a> <a class="close-btn" style="display: none;">关闭评论</a> <div class="pull-right"><a class="active">按时间倒序</a><a class="">按时间正序</a></div></div></div> <!----> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="comment-27212129" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/8839306a5016" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/1858366/a3a7703f-1bde-4c31-b35c-a1c792fe615a.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/8839306a5016" target="_blank" class="name">心愿宝宝</a> <!----> <!----> <div class="meta"><span>4楼 · 2018.08.08 15:07</span></div></div></div> <div class="comment-wrap"><p>是在所有的activity都去写一个xx.onresume, xx.onpause吗, 我直接在基类里,也不可以吗</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-27212129" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <a class="report"><span>举报</span></a> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-23642969" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/7d03d33a7306" target="_blank" class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/3-9a2bcc21a5d89e21dafc73b39dc5f582.jpg"></a> </div> <!----></div> <div class="info"><a href="/u/7d03d33a7306" target="_blank" class="name">不易啊</a> <!----> <!----> <div class="meta"><span>3楼 · 2018.05.07 11:54</span></div></div></div> <div class="comment-wrap"><p>为什么我的错误统计,后台看不到错误日志?</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-23642969" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <a class="report"><span>举报</span></a> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-27212138" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/8839306a5016" target="_blank">心愿宝宝</a>:
</div> <!----></div> <span>你的解决没有,我也遇到了,什么日志???</span> <!----></p> <div class="sub-tool-group"><span>2018.08.08 15:07</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <a class="report"><span>举报</span></a> <!----></div></div><div id="comment-27293347" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/7d03d33a7306" target="_blank">不易啊</a>:
</div> <!----></div> <span><a href="/u/8839306a5016" class="maleskine-author" target="_blank" data-user-slug="8839306a5016">@心愿宝宝</a> 之前用的是自定义发送的错误日志,现在没用自定义的,可以了,但是崩溃日志有2个多小时的延迟</span> <!----></p> <div class="sub-tool-group"><span>2018.08.10 13:29</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <a class="report"><span>举报</span></a> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-22904496" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/ffe3fef9ee40" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/11675574/cee0056a-894a-41e5-81a3-97571edb8a15?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/ffe3fef9ee40" target="_blank" class="name">善良的脚趾</a> <!----> <!----> <div class="meta"><span>2楼 · 2018.04.17 10:10</span></div></div></div> <div class="comment-wrap"><p>加油</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-22904496" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <a class="report"><span>举报</span></a> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div></div></div> <!----> <div><!----></div></div></div>