Android全栈API开发指南

SDK安装

打开云眼控制台(app.eyeofcloud.com),登录后点击“业务优化”,业务优化界面打开后再点击“SDK下载与安装”。

AB测试使用手册-全栈API-安装sdk

在新打开的页面中,选择“FullStack SDK安装”标签,再从下方的标签栏中选择“Android”。根据下方提示完成SDK的安装。

AB测试使用手册-全栈API-安装sdk2

 

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下载与安装”界面中查到。

android全栈api开发指南projectid

如果您在使用私有部署的云眼系统,在创建完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使用说明中查看。

set-url

在构造完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的接口时,会需要一个唯一的userName来标识用户。另外,如果要使用受众功能,还会需要用户的属性值。为了方便,可以在Application中定义两组方法getAttributes、setAttributes和getUserName、setUserName。之后在合适的地方调用setAttributes和setUserName方法来设置好属性和用户名,比如用户登陆拿到了账户信息后。

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;
    }
}

当然,也可以直接使用UUID来标识用户。

public String getUserName() {
    SharedPreferences sharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
    String id = sharedPreferences.getString("userId", null);
    if (id == null) {
        id = UUID.randomUUID().toString();
        sharedPreferences.edit().putString("userId", id).apply();
    }
    return id;
}

 

非参数化AB测试方案

非参数化方法使用SDK的版本抽签接口得到一个版本名称,依据版本名称编写if-else的分支代码,不同版本执行不同的代码从而产生版本差异。该方案灵活性较差,每次进行新的测试都需要更新应用程序,只有在参数化方案无法满足需求时才推荐使用。

设计优化方案

根据想到的假设,设计出AB测试的方案。我们需要考虑好有哪些版本,衡量结果的唯一主目标是什么。设计优化方案时最好提出一种明确的假设,比如“橙色按钮比起黑色按钮更能引起注意从而带来更多注册”,而不是“按钮的颜色可能会影响注册”这种模糊的假设。明确的假设能让测试的成功率更高。

配置优化方案

在云眼控制台中点击“业务优化”,等到页面加载完成后点击“创建优化方案”按钮。平台选择“全栈API”,填写优化方案名称,点击“确认”创建优化方案。创建完成后,点击对应优化方案的“编辑”按钮来打开编辑器。

AB测试使用手册-全栈API-创建优化方案

在“版本设置”中根据优化方案设计的情况来添加版本并分配流量,通常情况下均分流量即可。总流量根据实际流量调整,业务流量较大的应用选择部分流量参与测试就足够了。

AB测试使用手册-全栈API-流量分配

根据优化方案设计的情况,将需要用到的衡量指标创建为一个目标。点击“+”号将其添加到优化方案中。

AB测试使用手册-全栈API-设置目标

启动优化方案,完成配置工作。

AB测试使用手册-全栈API-启动试验

修改应用程序

对于非参数化方案,给出两种常见的使用方式来产生多个版本。

第一种方式是在打开新的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);
            }
        }
        startActivity(intent);
}
});

第二种方式是在需要体现版本差异的地方进行版本抽签,依据抽签结果进入不同的代码逻辑,从而使得应用的界面或者行为变得不同。例如,通过代码修改界面的样式。

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.getEyeofcloud得到的EyeofcloudClient对象是在应用启动时创建的。在这之后,本地缓存的配置文件是会自动定时更新的,如果想要从最新的缓存配置文件重新构造EyeofcloudClient对象,可以调用同步的initialize方法。该方法使用本地缓存生成新的EyeofcloudClient对象并将其更新到eyeofcloudManager中。之后就和正常情况下一样通过eyeofcloudManager.getEyeofcloud方法获取EyeofcloudClient对象就可以了。参数context可以是任意context。

EyeofcloudClient eyeofcloud = eyeofcloudManager.initialize(context);

 

参数化AB测试方案

参数化方案希望的是将应用程序中的一些关键变量动态化,使其不再写死在程序中,而是从一个可变的配置文件中读取对应的值。例如,可以参数化一个广告轮播图的播放速度,通过修改配置文件的内容达到修改应用程序行为的目的。

选择参数和目标

在将应用程序参数化前,需要考虑哪些变量是需要参数化的以及哪些目标是有可能使用到的。所有将来可能进行AB测试的关键地方,都建议将其参数化,比如关键按钮(注册、购买等)的一些属性、控制应用行为的一些关键参数、甚至是推荐算法的一些参数等。这样,当将来要进行AB测试的时候就不再需要发布新本应用了。目标的选择往往是和业务指标相关的一些行为,比如一些按钮的点击,把可能用来衡量结果的目标都考虑进去。

配置优化方案

在选择完参数和目标后,要在编辑器中创建这些选出的参数和目标。目标的创建和上面介绍的一样。下面介绍参数的创建,在设置变量处,点击“创建变量”。

AB测试使用手册-全栈API-设置变量

在弹出的界面中填写变量名称,选择变量类型和默认值,点击“保存”完成创建。

AB测试使用手册-全栈API-设置变量2

修改应用程序

在创建完变量和目标之后,就要修改我们的应用程序了。首先是变量的改动,可以通过调用eyeofcloudClient.getVariableString、getVariableFloat、getVariableBoolean、getVariableInteger这四个方法去获取变量,然后在程序中使用这些得到的变量。通常情况下,getVariableString这类方法的最后一个参数都设置成true即可。

EyeofcloudClient eyeofcloud = myApplication.getEyeofcloudManager().getEyeofcloud();
String userName = myApplication.getUserName();
Map<String,String> attributes = myApplication.getAttributes();
String buttonText = eyeofcloud.getVariableString("buttonText", userName, attributes, true);
if (buttonText == null) {
    buttonText = “defaultText”;
}
//do something with buttonText

目标的设置方法和非参数化方案相同。

设计试验并配置

完成应用程序的参数化并添加触发目标的代码之后,随时都可以在云眼控制台创建优化方案进行AB测试,而这个过程是不需要更新应用程序的。在假设的基础上设计试验后,可以在编辑器的“设置变量”中添加需要使用的变量,并为各个版本填写相应的值,从而产生不同的版本。之后再添加需要的目标并保存就可以完成试验的配置,最后启动试验。

AB测试使用手册-全栈API-设置变量3

 

混淆配置参考

# Eyeofcloud
-keep class com.eyeofcloud.ab.** { *; }

# Gson
-keepnames class com.google.gson.Gson

# Safely ignore warnings about other libraries since we are using Gson
-dontwarn com.fasterxml.jackson.**
-dontwarn org.json.**

# Annotations
-dontwarn javax.annotation.**

# Findbugs
-dontwarn edu.umd.cs.findbugs.annotations.SuppressFBWarnings

# slf4j
-dontwarn org.slf4j.**

# Android Logger
-keep class com.noveogroup.android.log.** { *; }

# MD5
-keep class com.twmacinta.** { *; }

 

Demo代码

下载demo代码(包含三个demo对应文中的三种方式)
AndroidFullStackActivateIntent:非参数化第一种方案
AndroidFullStackActivateNormal:非参数化第二种方案
AndroidFullStackParameter:参数化方案

 

免费试用,转化率提升就是这样简单快速 立即试用