简介
云眼,是国内领先的用户体验优化系统,能够以低成本、高效率的方式实施AB测试,建立闭环改进机制,数据驱动、持续不断的优化用户体验,提高App和Web应用的转化率和留存率,降低迭代风险。
本文介绍Android Java语言在云眼平台进行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,再设计一个getEyeofcloudManager的接口将其暴露出来。
public class MyApplication extends Application { private EyeofcloudManager eyeofcloudManager; public EyeofcloudManager getEyeofcloudManager() { return eyeofcloudManager; } }
在Application的onCreate方法中,构造EyeofcloudManager并赋值给eyeofcloudManager。
public void onCreate() { eyeofcloudManager = EyeofcloudManager.builder(PROJECT_ID).build(); }
参数PROJECT_ID可以从“SDK下载与安装”界面中查到。
如果您在使用私有部署的云眼系统,在创建完EyeofcloudManager对象后,还需要调用相关接口设置几个URL。云平台用户则不需要设置。
public void 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.getEyeofcloud方法获取缓存的EyeofcloudClient对象再来调用相关接口。在异步接口的Listener中打开HomeActivity,从而保证初始化过程已经完成。
protected void onStart() { eyeofcloudManager.initialize(this, new EyeofcloudStartListener() { @Override public void onStart(EyeofcloudClient eyeofcloud) { Intent intent = new Intent(myApplication.getBaseContext(), HomeActivity.class); startActivity(intent); } }); }
在调用SDK的接口时,会需要一个唯一的userId来标识用户。另外,如果要使用受众功能,还会需要用户的属性值。为了方便,可以在Application中定义两个属性userName 和attributes 。之后在合适的地方调用这两个属性。
public class MyApplication extends Application { private Map<String,String> attributes; public getAttributes() { return attributes; } public setAttributes(String key, String value) { Attributes.put(key, value); } } public class MyApplication extends Application { private String userName; public getUserName () { return userName; } public setUserName (String userName) { this.userName = userName; } }
3. 创建优化方案
在云眼控制台中点击“业务优化”,等到页面加载完成后点击“创建优化方案”按钮。
平台选择“全栈API”,填写优化方案名称,点击“确认”创建优化方案。创建完成后,点击对应优化方案的“编辑”按钮来打开编辑器。
4.设置流量
在云眼控制台在“版本设置”中根据优化方案设计的情况来添加版本并分配流量,通常情况下均分流量即可。总流量根据实际流量调整,业务流量较大的应用选择部分流量参与测试就足够了。
5.设置目标
根据优化方案设计的情况,将需要用到的衡量指标创建为一个目标。点击“+”号将其添加到优化方案中。
6.设置受众
设置受众可以将优化方案定位到在云眼控制台预先定义的特定受众群体中,云眼将会在激活优化方案时通过属性值评估用户是否满足受众条件,从而决定是否激活优化方案。在云眼控制台中点击“业务优化”,业务优化界面打开后再点击“自定义属性(全栈)”。点击创建自定义属性,输入自定义属性的名称和描述,点击确定按钮。
编辑刚才创建好的优化方案,点击创建受众,输入受众的名称和描述,将右侧已创建好的自定义属性拖拽至受众条件下,点击“保存受众”按钮。
7.简单AB测试
简单方法使用SDK的版本抽签接口得到一个版本名称,依据版本名称编写if-else的分支代码,不同版本执行不同的代码从而产生版本差异。该方案灵活性较差,每次进行新的测试都需要更新应用程序,只有在参数化方案无法满足需求时才推荐使用。
对于简单方案,给出两种常见的使用方式来产生多个版本。
7.1第一种简单AB测试
第一种方式是在打开新的Activity前,进行版本抽签,依据抽签结果创建不同的Intent从而打开不同的Activity形成不同的版本。这种方式比较适合版本差异较大的情况,直接制作多个Activity作为不同的版本。
EyeofcloudClient eyeofcloud = eyeofcloudManager.getEyeofcloud(); String userName = myApplication.getUserName(); Map<String,String> attributes = myApplication.getAttributes(); Button openButton = (Button)findViewById(R.id.button); openButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(application.getBaseContext(), DefaultActivity.class); Variation variation = eyeofcloud.activate("experiment-name", userName, attributes); if (variation != null) { if (variation.getKey().equals("优化版本A")) { intent = new Intent(application.getBaseContext(), VariationAActivity.class); } else if (variation.getKey().equals("优化版本B")) { intent = new Intent(application.getBaseContext(), VariationBActivity.class); } } else { //如果优化方案未启动,该用怎样的代码,例如,用下面的代码: intent = new Intent(application.getBaseContext(), VariationAActivity.class); } startActivity(intent); } });
7.2第二种简单AB测试
第二种方式是在需要体现版本差异的地方进行版本抽签,依据抽签结果进入不同的代码逻辑,从而使得应用的界面或者行为变得不同。例如,通过代码修改界面的样式。
EyeofcloudClient eyeofcloud = eyeofcloudManager.getEyeofcloud(); String userName = myApplication.getUserName(); Map<String,String> attributes = myApplication.getAttributes(); Variation variation = eyeofcloud.activate("experimentName", userName, attributes); if (variation != null) { if (variation.getKey().equals("原始版本")) { //code for variation a } else if (variation.getKey().equals("优化版本#1")) { //code for variation b } } else { //code for default }
完成版本差异化的代码之后,添加触发目标的代码。
conversionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EyeofcloudClient eyeofcloud = eyeofcloudManager.getEyeofcloud(); String userName = myApplication.getUserName(); Map<String,String> attributes = myApplication.getAttributes(); eyeofcloud.track("buy", userName, attributes); } });
通过eyeofcloudManager!!.eyeofcloud方法得到的EyeofcloudClient对象是在应用启动时创建的。在这之后,本地缓存的配置文件是会自动定时更新的,如果想要从最新的缓存配置文件重新构造EyeofcloudClient对象,可以调用同步的initialize方法。该方法使用本地缓存生成新的EyeofcloudClient对象并将其更新到eyeofcloudManager中。之后就和正常情况下一样通过eyeofcloudManager!!.eyeofcloud方法获取EyeofcloudClient对象就可以了。参数context可以是任意context。
EyeofcloudClient eyeofcloud = 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获取到的变量值也是优化版本中的变量值。
EyeofcloudClient eyeofcloud = eyeofcloudManager.getEyeofcloud(); String userName = myApplication.getUserName(); Map<String,String> attributes = myApplication.getAttributes(); Variation variation = eyeofcloud.activate("experimentName", userName, attributes); Var value = eyeofcloud!!.getVariableString(variableName,username!!,attributes,false) //在对应版本中使用获取到的变量值 if (variation != null) { if (variation.getKey().equals("原始版本")) { //code for variation a } else if (variation.getKey().equals("优化版本#1")) { //code for variation b } } else { //code for default }
8.查看实验结果
当实验运行一段时间后,就可以到云眼控制台查看实验的运行结果。