简介
云眼,是国内领先的用户体验优化系统,能够以低成本、高效率的方式实施AB测试,建立闭环改进机制,数据驱动、持续不断的优化用户体验,提高App和Web应用的转化率和留存率,降低迭代风险。
本文介绍Android Kotlin语言在云眼平台进行A/B测试的步骤和具体操作
1. 安装SDK
登录云眼控制台(app.eyeofcloud.com),点击“业务优化”,然后点击“SDK下载与安装”。
从打开的新页面中选择“Android SDK安装”标签,根据提示,下载云眼Android SDK
2. SDK初始化
所有和AB测试相关的接口都是定义在EyeofcloudClient这个类上的,通过这个类才能够版本抽签、触发目标、获取参数从而进行AB测试。同时,SDK还提供了一个EyeofcloudManager类来负责EyeofcloudClient的构造和获取、配置文件(包含AB测试信息)的下载和更新、配置文件的缓存管理等等。 所以,初始化SDK的第一步就是构造一个EyeofcloudManager。建议在Application上设置一个变量保存全局唯一的EyeofcloudManager,并将其属性设置private set。
class MyApplication : Application() { var eyeofcloudManager: EyeofcloudManager? = null private set }
在Application的onCreate方法中,构造EyeofcloudManager并赋值给eyeofcloudManager。
override fun onCreate() { super.onCreate() eyeofcloudManager = EyeofcloudManager.builder(PROJECT_ID).build() }
参数PROJECT_ID可以从“SDK下载与安装”界面中查到。
如果您在使用私有部署的云眼系统,在创建完EyeofcloudManager对象后,还需要调用相关接口设置几个URL。云平台用户则不需要设置。
override fun onCreate() { super.onCreate() eyeofcloudManager = EyeofcloudManager.builder(PROJECT_ID).build() eyeofcloudManager!!.setConfigUrlFormat(CONFIG_URL_FORMAT) eyeofcloudManager!!.setServerHost(SERVER_HOST) }
CONFIG_URL_FORMAT和SERVER_HOST可以在“SDK下载与安装”界面的Android全栈API使用说明中查看。
在构造完EyeofcloudManager对象后,我们需要在整个应用的第一个Activity的onStart方法中调用eyeofcloudManager!!.initialize方法完成初始化(在之后的Activity中调用会出错)。该initialize方法是一个异步的接口,优先使用本地缓存的配置文件(没有就通过网络获取)构造一个EyeofcloudClient对象并将其保存在eyeofcloudManager中。在之后需要使用SDK的地方,通过eyeofcloudManager!!.eyeofcloud方法获取缓存的EyeofcloudClient对象再来调用相关接口。在异步接口的Listener中打开HomeActivity,从而保证初始化过程已经完成。
override fun onStart() { super.onStart() application!!.eyeofcloudManager!!.initialize(this) { try { Thread.sleep(1000) } catch (e: InterruptedException) { e.printStackTrace() } val intent = Intent(application!!.baseContext, HomeActivity::class.java) startActivity(intent) } }
在调用SDK的接口时,需要一个标识(例如username或者userId等)来为用户抽签(也叫分桶或分流)。如果要使用受众功能,还会需要用户的属性值。比如,可以在Application中定义两个变量:userName和attributes,并为它们分别赋值 ,之后在调用云眼API时使用这两个变量。在本文档第7节会看到如果使用这两个变量。
val attributes: Map<String, String> get() { val attributes = HashMap<String, String>() attributes["gender"] = "female" return attributes } val userName: String get() { val sharedPreferences :SharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE) var name = sharedPreferences.getString("userName", null) if (name == null) { name = UUID.randomUUID().toString() sharedPreferences.edit().putString("userName", name).apply() } return name }
3. 创建优化方案
在云眼控制台中点击“业务优化”,等到页面加载完成后点击“创建优化方案”按钮。
平台选择“全栈API”,填写优化方案名称,点击“确认”创建优化方案。创建完成后,点击对应优化方案的“编辑”按钮来打开编辑器。
4.设置流量
在云眼控制台在“版本设置”中根据优化方案设计的情况来添加版本并分配流量,通常情况下均分流量即可。总流量根据实际流量调整,业务流量较大的应用选择部分流量参与测试就足够了。
5.设置目标
根据优化方案设计的情况,将需要用到的衡量指标创建为一个目标。点击“+”号将其添加到优化方案中。
6.设置受众
设置受众可以将优化方案定位到在云眼控制台预先定义的特定受众群体中,云眼将会在激活优化方案时通过属性值评估用户是否满足受众条件,从而决定是否激活优化方案。在云眼控制台中点击“业务优化”,业务优化界面打开后再点击“自定义属性(全栈)”。点击创建自定义属性,输入自定义属性的名称和描述,点击确定按钮。
编辑刚才创建好的优化方案,点击创建受众,输入受众的名称和描述,将右侧已创建好的自定义属性拖拽至受众条件下,点击“保存受众”按钮。
7.简单AB测试
简单方法使用SDK的版本抽签接口得到一个版本名称,依据版本名称编写if-else的分支代码,不同版本执行不同的代码从而产生版本差异。该方案灵活性较差,每次进行新的测试都需要更新应用程序,只有在参数化方案无法满足需求时才推荐使用。
对于简单方案,给出两种常见的使用方式来产生多个版本。
7.1第一种简单AB测试
第一种方式是在打开新的Activity前,进行版本抽签,依据抽签结果创建不同的Intent从而打开不同的Activity形成不同的版本。这种方式比较适合版本差异较大的情况,直接制作多个Activity作为不同的版本。
var application = getApplication() as MyApplication var userName = application!!.userName var attributes = application!!.attributes var eyeofcloud = application!!.eyeofcloudManager!!.eyeofcloud val openButton = findViewById<View>(R.id.button) as Button openButton.setOnClickListener { var intent = Intent(application!!.baseContext, DefaultActivity::class.java) val variation: Variation? = eyeofcloud!!.activate("android-fullstack-activate-intent", userName!!, attributes!!) if (variation != null) { if (variation.key == "优化版本A") { intent = Intent(application!!.baseContext, VariationAActivity::class.java) } else if (variation.key == "优化版本B") { intent = Intent(application!!.baseContext, VariationBActivity::class.java) } } startActivity(intent) }
7.2第二种简单AB测试
第二种方式是在需要体现版本差异的地方进行版本抽签,依据抽签结果进入不同的代码逻辑,从而使得应用的界面或者行为变得不同。例如,通过代码修改界面的样式。
var application = getApplication() as MyApplication var userName = application!!.userName var attributes = application!!.attributes var eyeofcloud = application!!.eyeofcloudManager!!.eyeofcloud val variation :Variation? = eyeofcloud!!.activate("android-fullstack-activate-normal", userName!!, attributes!!) if (variation != null) { if (variation.key == "优化版本A") { //code for variation a } else if (variation.key == "优化版本B") { //code for variation b } }
完成版本差异化的代码之后,添加触发目标的代码。
conversionButton.setOnClickListener { eyeofcloud!!.track("click", userName!!, attributes!!) val intent = Intent(application!!.baseContext, EventConfirmActivity::class.java) startActivity(intent) }
通过eyeofcloudManager!!.eyeofcloud方法得到的EyeofcloudClient对象是在应用启动时创建的。在这之后,本地缓存的配置文件是会自动定时更新的,如果想要从最新的缓存配置文件重新构造EyeofcloudClient对象,可以调用同步的initialize方法。该方法使用本地缓存生成新的EyeofcloudClient对象并将其更新到eyeofcloudManager中。之后就和正常情况下一样通过eyeofcloudManager!!.eyeofcloud方法获取EyeofcloudClient对象就可以了。参数context可以是任意context。
var eyeofcloud: EyeofcloudClient? = eyeofcloudManager.initialize(context)
7.3简单API中使用参数化API
使用简单API方式可以和参数化API进行配合使用,先调用简单API的activate方法激活一个试验得到版本名称,然后调用参数化API getVariableString/getVariableBoolean/getVariableDouble/getVariableFloat来获取在云眼控制台定义的变量值,需要提供3个参数,分别是变量名称、用户ID、布尔值true/false,其中最后一个参数的布尔值代表是否激活试验,我们只需要获取变量的值进行后续的使用而并不需要激活试验,所以我们最后一个参数传递false。在这种情况下,我们使用activate API激活试验得到的是哪个版本,那么使用参数化API获取到的变量就是我们在云眼控制台设置变量中定义的该版本的值。例如:我们用activate激活试验返回的是优化版本,则我们使用参数化API获取到的变量值也是优化版本中的变量值。
var application = getApplication() as MyApplicationvar var userName = application!!.userNamevar var attributes = application!!.attributesvar var eyeofcloud = application!!.eyeofcloudManager!!.eyeofcloudval var variation :Variation? = eyeofcloud!!.activate("android-fullstack-activate-normal", userName!!, attributes!!) var value = eyeofcloud!!.getVariableString(variableName,username!!,attributes,false) //在对应版本中使用获取到的变量值 if (variation != null) { if (variation.key == "优化版本A") { //code for variation a } else if (variation.key == "优化版本B") { //code for variation b } }
8.查看实验结果
当实验运行一段时间后,就可以到云眼控制台查看实验的运行结果。
9、示例程序
付费客户需要Demo,请与客户经理联系…