Android之友盟多渠道打包与数据统计
文章大纲
一、多渠道打包与数据统计介绍
二、友盟实现多渠道打包实战
三、友盟数据统计实战
四、项目源码下载
五、参考文章
一、多渠道打包与数据统计介绍
多渠道打包,相信很多同学都知道。在android studio中只要经过配置,就能打出对应市场的渠道包。打过包的同学可能都会有这样的感受:散热器疯狂地转、打包速度那叫一个慢。这时候除了无奈,还是无奈。
app上线后,一般公司都希望跟踪app在市场上的使用情况。包括新增用户、活跃用户、渠道信息、错误信息等,还有例如商城类的app,需要跟踪用户最喜欢浏览哪种类型的店铺或商品
针对上面问题,如果我们自己手动去一个个处理,那么会崩溃的,因此已经有相关第三方平台做好了这方面功能,我们进行集成即可。多渠道打包和数据统计的第三方有很多,在此我们使用友盟平台进行实战。
二、友盟实现多渠道打包实战
1. 接入前准备工作
(1)获取appkey
集成【友盟+】sdk之前,您首先需要到 【友盟+】官网注册并且添加新应用,获得appkey。
特别提醒 :我们建议开发者在注册账号时使用企业邮箱,避免使用个人邮箱注册,防止由于个人离职带来的问题,建议使用的账号形式:umeng@企业域名、apps@企业域名、dev@企业域名。
常见问题
问题1 :应用的安卓版和ios版能否共用一个appkey。
答案:不同平台的应用禁止使用相同的appkey,需要分开注册。
问题2 :注册应用时,提示应用名称已存在。
答案 :【友盟+】后台的应用名与实际应用名和包名无关,建议命名为应用名+平台(ios/android)。
(2)build.gradle添加相关配置
在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】sdk 新maven仓库地址
buildscript { repositories { google() jcenter() mavencentral() //添加友盟相关的maven地址 maven { url 'https://dl.bintray.com/umsdk/release' } } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' // note: do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() //添加友盟相关的maven地址 maven { url 'https://dl.bintray.com/umsdk/release' } } } task clean(type: delete) { delete rootproject.builddir }
(3)工程build.gradle配置
//添加友盟依赖 implementation 'com.umeng.sdk:common:latest.integration' implementation 'com.umeng.sdk:analytics:latest.integration'
(4)添加相关权限
<!-- 必须的权限 --> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.read_phone_state" /> <uses-permission android:name="android.permission.internet" /> <!-- 推荐的权限 --> <!-- 添加如下权限,以便使用更多的第三方sdk和更精准的统计数据 --> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.change_wifi_state" /> <uses-permission android:name="android.permission.write_external_storage" />
(5)androidmanifest清单配置文件方式初始化appkey和channel
<!--友盟统计appkey配置--> <meta-data android:value="实际项目在友盟的appkey" android:name="umeng_appkey"/> <meta-data android:value="${umeng_channel_value}" android:name="umeng_channel"/>
(6)自定义application
public class myapplication extends application { @override public void oncreate() { super.oncreate(); /** * 初始化common库 * 参数1:上下文,必须的参数,不能为空 * 参数2:友盟 app key,非必须参数,如果manifest文件中已配置app key,该参数可以传空,则使用manifest中配置的app key,否则该参数必须传入 * 参数3:友盟 channel,非必须参数,如果manifest文件中已配置channel,该参数可以传空,则使用manifest中配置的channel,否则该参数必须传入,channel命名请详见channel渠道命名规范 * 参数4:设备类型,必须参数,传参数为umconfigure.device_type_phone则表示手机;传参数为umconfigure.device_type_box则表示盒子;默认为手机 * 参数5:push推送业务的secret,需要集成push功能时必须传入push的secret,否则传空 */ //如果androidmanifest.xml清单配置中没有设置appkey和channel,则可以在这里设置 // umconfigure.init(this, "58edcfeb310c93091c000be2", "umeng", umconfigure.device_type_phone, "1fe6a20054bcef865eeb0991ee84525b"); umconfigure.init(this, umconfigure.device_type_phone,""); } }
2. 实现多渠道打包代码
(1)添加多渠道打包
//多渠道打包支持 productflavors { alpha { applicationid "info.xinfu.o2o"//设置包名 versioncode 2 versionname "3.1"//设置版本号 }//自己打包测试使用 tencent {}//投放应用宝市场 baidu { versioncode 1 versionname "3.0" }//投放百度市场 wandoujia {}//投放豌豆荚市场 pp {}//投放pp助手市场 qihoo {}//投放pp助手市场 vivo {}//投放vivo市场 oppo {}//投放oppo市场 xiaomi {}//投放小米市场 meizu {}//投放魅族市场 huawei {}//投放华为应用市场 lenovo {}//投放联想市场 letv {}//投放乐视市场 gionee {}//投放金立市场 himarket {}//投放安卓市场 //manifestplaceholders 使用相关的值替换了umeng_channel_value productflavors.all { flavor -> flavor.manifestplaceholders = [umeng_channel_value: name] }
更新项目时候出现异常
当我们更新项目时候,可能会出现以下异常
error:all flavors must now belong to a named flavor dimension. learn more at https://d.android.com/r/tools/flavordimensions-missing-error-message.html
解决办法如下:
defaultconfig { ... //版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了 flavordimensions "versioncode" }
(2)配置完成后project的build.gradle
// top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() mavencentral() //添加友盟相关的maven地址 maven { url 'https://dl.bintray.com/umsdk/release' } } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' // note: do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() //添加友盟相关的maven地址 maven { url 'https://dl.bintray.com/umsdk/release' } } } task clean(type: delete) { delete rootproject.builddir }
(3)配置完成后app的build.gradle
apply plugin: 'com.android.application' android { compilesdkversion 28 defaultconfig { applicationid "com.example.wxc.testpackage" minsdkversion 15 targetsdkversion 28 versioncode 1 versionname "1.0" testinstrumentationrunner "android.support.test.runner.androidjunitrunner" //解决error:all flavors must now belong to a named flavor dimension. learn more at https://d.android.com/r/tools/flavordimensions-missing-error-message.html异常 flavordimensions "versioncode" } buildtypes { release { minifyenabled false proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro' } } //多渠道打包支持 productflavors { alpha { applicationid "info.xinfu.o2o"//设置包名 versioncode 2 versionname "3.1"//设置版本号 }//自己打包测试使用 tencent {}//投放应用宝市场 baidu { versioncode 1 versionname "3.0" }//投放百度市场 wandoujia {}//投放豌豆荚市场 pp {}//投放pp助手市场 qihoo {}//投放pp助手市场 vivo {}//投放vivo市场 oppo {}//投放oppo市场 xiaomi {}//投放小米市场 meizu {}//投放魅族市场 huawei {}//投放华为应用市场 lenovo {}//投放联想市场 letv {}//投放乐视市场 gionee {}//投放金立市场 himarket {}//投放安卓市场 //manifestplaceholders 使用相关的值替换了umeng_channel_value productflavors.all { flavor -> flavor.manifestplaceholders = [umeng_channel_value: name] } } } dependencies { implementation filetree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testimplementation 'junit:junit:4.12' androidtestimplementation 'com.android.support.test:runner:1.0.2' androidtestimplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //添加友盟依赖 implementation 'com.umeng.sdk:common:latest.integration' implementation 'com.umeng.sdk:analytics:latest.integration' }
(4)配置完成后的androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.wxc.testpackage"> <!-- 必须的权限 --> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.read_phone_state" /> <uses-permission android:name="android.permission.internet" /> <!-- 推荐的权限 --> <!-- 添加如下权限,以便使用更多的第三方sdk和更精准的统计数据 --> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.change_wifi_state" /> <uses-permission android:name="android.permission.write_external_storage" /> <application android:name=".myapplication" android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundicon="@mipmap/ic_launcher_round" android:supportsrtl="true" android:theme="@style/apptheme"> <!--友盟统计appkey配置--> <meta-data android:value="5cac9da40cafb2a2bd00148e" android:name="umeng_appkey"/> <meta-data android:value="${umeng_channel_value}" android:name="umeng_channel"/> <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest>
(5)添加多渠道信息统计
即启动数据的统计(包括新增用户、活跃用户、启动次数、使用时长等基本数据)
需要在每个activity的onresume方法中调用 mobclickagent.onresume(context),
onpause方法中调用 mobclickagent.onpause(context),如下:
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mobclickagent.onresume(this); button button = findviewbyid(r.id.checkbutton); button.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { toast.maketext(mainactivity.this, "点击了", toast.length_short).show(); mobclickagent.onevent(mainactivity.this, "checkbutton");//参数二为当前统计的事件id } }); } protected void onpause() { super.onpause(); mobclickagent.onpause(this); } }
温馨提示:
(1)如果activity之间有继承或者控制关系请不要同时在父和子activity中重复添加npause和nresume方法,否则会造成重复统计。例如在baseactivity中添加过,则它的子类就不需要添加了。
(2)当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:setsessioncontinuemillis(long interval) 来自定义这个间隔(参数单位为毫秒)。
(3)如果开发者调用kill或者exit之类的方法杀死进程,请务必在此之前调用onkillprocess(context context)方法,用来保存统计数据。
(6)项目打包
选择generate signed apk
新建一个签名文件
填写信息
补充说明:
(1)android 7.0中引入了apk signature scheme v2,v1呢是jar signature来自jdkv1:应该是通过zip条目进行验证,这样apk 签署后可进行许多修改 - 可以移动甚至重新压缩文件。(2)v2:验证压缩文件的所有字节,而不是单个 zip 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。v1和v2的签名使用:
(4)只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式,只勾选v2签名7.0以下会直接安装完显示未安装,7.0以上则使用了v2的方式验证。同时勾选v1和v2则所有机型都没问题
运行结果如下所示:
(7)运行结果
当我们用手机安装apk后,在友盟后台可看到以下统计
三、友盟数据统计实战
1. 自定义点击事件
自定义事件可以实现在应用程序中埋点来统计用户的点击行为。例如我们的应用需要统计用户是点击了“,还是cheackbutton按钮。自定义事件目前包括"计数事件"和"计算事件",这里主要讲下计数事件。
1、首先需要在友盟后台添加自定义事件:设置-事件-手工添加-添加事件。如下:
在需要统计位置中加入以下代码
button.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { toast.maketext(mainactivity.this, "点击了", toast.length_short).show(); mobclickagent.onevent(mainactivity.this, "checkbutton");//参数二为当前统计的事件id } });
运行程序后,在友盟后台可看到以下结果
2. 错误统计
组件化统计sdk内建jvm层错误统计。sdk通过thread.uncaughtexceptionhandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。
如不需要错误统计功能,可通过此方法关闭:
// isenable: false-关闭错误统计功能;true-打开错误统计功能(默认打开) public static void setcatchuncaughtexceptions(boolean isenable)
参数 含义
isenable 错误统计开关,false-关闭错误统计功能;true-打开错误统计功能(默认打开)。
如果开发者自己捕获了错误,需要手动上传到【友盟+】服务器可以调用下面方法:
代码:复制代码到剪切板 public static void reporterror(context context, string error); //或 public static void reporterror(context context, throwable e);
参数 含义
context 当前宿主进程的applicationcontext上下文。
error 错误内容字符串。
e 错误发生时抛出的异常对象。
3.总结
友盟还提供了其他的统计方法,包括页面统计、账号统计等,具体的功能事情请参考友盟的开发者文档:
https://developer.umeng.com/docs/66632/detail/101848#h2-u9519u8befu7edfu8ba111
四、项目源码下载
链接:https://pan.baidu.com/s/1suksyjunqlj4j65_zxknzq
密码:yvqs