如何用AI技术降噪? QCon 广州“音视频架构实践”专场给你答案! 了解详情
写点什么

Sixpack-java:用于 Android 和 Java 应用的 A/B 测试工具

  • 2015 年 8 月 13 日
  • 本文字数:2267 字

    阅读完需:约 7 分钟

SeatGeek 团队日前宣布为Sixpack A/B 测试框架增加了一个新的客户端,也就是Sixpack-java,它的目标是简化Android 和Java 应用的A/B 测试。

A/B 测试通常用来优化 Web 网站。开发者准备好网站的各种不同方案,这些方案在一些次要方面如颜色方案或者按钮标签等存在一些差异。这些不同的方案以预定的比例呈现给用户,然后根据转换率、时间或者数量目标确定更成功的方案。最后将最成功的方案呈现给网站所有用户。

Sixpack 是一个与语言无关的 A/B 测试框架,具有非常易用的 API 和内置的 dashboard。Sixpack 有两个主要的组件,即 Sixpack server 和 Sixpack web。其中 sixpack server 负责收集 experiment 数据并决定要将哪一个可选方案展现给哪些人。Sixpack web 是一个基于 Web 的 dashboard。Sixpack 支持多种语言的客户端,目前包括 PHP Ruby Python JavaScript

借助最新提供的 Java 客户端,可以编写针对 Android 应用的 A/B 测试用例。在使用 Java 客户端之前,需要预先安装并运行 Sixpack server,在该项目的 Github 主页上提供了安装指导

在编写 A/B 测试时,首先需要引入对 Sixpack-java 的依赖,目前它已经发布到了 Sonatype 的快照仓库中,因此可以通过 Gradle 声明依赖:

复制代码
repositories {
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
}
dependencies {
compile 'com.seatgeek:sixpack:0.1-SNAPSHOT'
}

依赖正确解析之后,就能够为应用编写 A/B 测试了,我们需要初始化 Sixpack 客户端,在这个过程中可以使用 SixpackBuilder 来创建新的 Sixpack 实例:

复制代码
Sixpack sixpack = new SixpackBuilder()
.setSixpackUrl("http://api.mycompany.com/sixpack")
.setClientId(getCachedClientId())
.build();

在这里所引用的 getCachedClientId() 方法可能会如下所示:

复制代码
public String getCachedClientId() {
SharedPreferences prefs = context.getSharedPreferences("sixpack", Context.MODE_PRIVATE);
String clientId = prefs.getString("sixpack_client_id");
if (clientId == null) {
clientId = Sixpack.generateRandomClientId();
prefs.edit().put("sixpack_client_id", clientId).apply();
}
return clientId;
}

这里有两件较为重要的事情需要注意:第一,需要将 setSixpackUrl() 方法中的 URL 指向你所部署的 Sixpack server 的地址,第二件事情就是 client id,client id 是 Sixpack server 所使用的一个唯一标识,用来跟踪每个客户端使用了 experiment 中的哪一个可选方案,因此在会话中,这个 client id 不能发生变化。因此,Sixpack 给出的建议是只生成 client id 一次(通过 Sixpack.generateRandomClientId() 所提供的帮助方法),然后将其缓存在 SharedPreferences 中,这样就可以下次继续使用了。

当然,SeatGeek 团队还建议我们借助依赖注入实现,维护一个单例的 Sixpack 实例,他们所使用的依赖实现是 dagger

一切基础工作就绪后,sixpack 提供了一个针对按钮颜色的样例,如下所示:

复制代码
Experiment buttonColor = sixpack.experiment()
.withName("Button Color")
.withAlternative(new Alternative("Red"))
.withAlternative(new Alternative("Green"))
.build();

在这个样例中,创建了名为“Button Color”的 experiment,它包含了两个可选方案,分别为“Red”和“Green”。当客户端参与这个 experiment 的时候,就能够在 Sixpack web 的 dashboard 上看到。

要启动测试话,需要调用 Experiment#participate() 并传入适当的回调方法,使用 Java 8 的 lambda 表达式能够使代码更为简化:

复制代码
buttonColor.participate(
(participatingExperiment) -> {
// success! save the participating instance for later so that we can convert it and set our button color
this.participatingExperiment = participatingExperiment;
button.setBackgroundColor(participatingExperiment.selectedAlternative == redAlternative ? R.color.button_red : R.color.button_green);
},
(experiment, error) -> {
// failure, check network connection and try to participate again, you should also likely fallback to a default
}
);

当用户点击按钮的时候(假设这就是样例所要衡量的行为),那么我们可以将 convert() 信息发送到 Sixpack 上。

通过这样的一个过程,就成功完成了按钮颜色的测试,最终形成的结果在 dashboard 上可能会如下所示:

最后,sixpack 还给出了一些高级的用法,比如将 ParticipatingExperiment 暴露为 RxJava 的 Observables 并缓存结果;除了将单例的 Sixpack 保存在 DI 中以外,还可以将 Experiment 和 ParticipatingExperiment 放到 dagger 模块中,这样它们的生命周期与应用中的其他一些组件就会相互独立;如果在系统中,用户进行了注册,并且有 id 的话,可以使用这个 id 作为 client id,然后使用 Sixpack-server 的 API 将 A/B 测试的结果与应用的用户进行关联。

随着移动应用对用户体验越来越重视,出现了 Splitforce 、sixpack 等可以用在移动应用上的 A/B 测试框架,这些框架将会有助于分析用户的行为,实现更优的用户体验。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015 年 8 月 13 日 05:371958

评论

发布
暂无评论
发现更多内容

【设计模式】第十三篇 - 享元模式 - 连连看的图片共享

Brave

设计模式 享元模式 11月日更

牛掰!阿里P7大佬爆肝半个月,把安卓源码解析编成了508页的PDF

android 程序员 移动开发

模块化开发一:架构搭建

android 程序员 移动开发

深入Android系统Binder-1-导读与简介

android 程序员 移动开发

原来一个 Map 就能搞定注册表了

悟空聊架构

Eureka 源码剖析 注册中心 悟空聊架构 11月日更

深入解析Flutter架构

android 程序员 移动开发

深入学习-Gradle-自动化构建技术(二)Groovy-筑基

android 程序员 移动开发

渣渣二本的辛酸面试之路:从深圳外包到杭州蚂蚁金服,4年小Android的爬坑历程

android 程序员 移动开发

EMQ 获评“最具潜力边缘计算企业”,推动边缘计算生态发展

EMQ映云科技

物联网 IoT mqtt

深度思考:已经开发8年的你,为何跳槽被多家大厂拒绝?为什么会迷茫Android开发还有什么能学习的

android 程序员 移动开发

温故而知新:重新认识Activity的生命周期

android 程序员 移动开发

漫谈MVVM(1)ViewModel_DataBinding核心原理(1)

android 程序员 移动开发

求面试别再问我HashMap原理了——史上最全源码解读,别再说你不知道HashMap 原理

android 程序员 移动开发

炸裂!一次Android实习经历告诉你:老爸不是张一鸣,该用什么技巧进字节

android 程序员 移动开发

深入Android系统Binder-1-导读与简介(1)

android 程序员 移动开发

深度探索 Gradle 自动化构建技术(二、Groovy 筑基篇)

android 程序员 移动开发

滴滴国际化项目 Android 端演进

android 程序员 移动开发

灵魂拷问:Android开发初期之后怎么提升?怎么才能叫精通?方向在哪

android 程序员 移动开发

模板方法模式

android 程序员 移动开发

深入浅出协程、线程和并发问题

android 程序员 移动开发

深入理解HTTPS协议

android 程序员 移动开发

深入理解JobScheduler与JobService的使用

android 程序员 移动开发

混合开发框架最全对比,为什么我更推荐Flutter?

android 程序员 移动开发

源码解析,Glide加载GIF图的原理竟然这么简单

android 程序员 移动开发

漫谈MVVM(1)ViewModel_DataBinding核心原理(2)

android 程序员 移动开发

毕业不到一年的Android 开发陷于迷茫,请求前辈指点一二

android 程序员 移动开发

流媒体协议之WebRTC实现p2p视频通话(二)

android 程序员 移动开发

搞懂钩子方法和模板方法,看完这篇就够了

Tom弹架构

Java 架构 设计模式

深度探索 Gradle 自动化构建技术(四、自定义 Gradle 插件)

android 程序员 移动开发

漫谈MVVM(1)ViewModel_DataBinding核心原理

android 程序员 移动开发

炒冷饭之Https 建立链接

android 程序员 移动开发

「云智公开课」百度沧海·存储

「云智公开课」百度沧海·存储

Sixpack-java:用于Android和Java应用的A/B测试工具_Java_张卫滨_InfoQ精选文章