客户端的AB测试一直蛮恶心的,基本都是要预置代码、if-else入侵原有逻辑、发版前把所有测试方案都想好,新增只能发版。
当然,像RN这种究极方案解决一切由客户端逻辑不能修改带来的问题,还有一个更加简单的方法:基于JS引擎+JS下发的AB测试。
定义一个interface作为为AB测试预留的坑。这个interface可大可小,可以是个StringGetter,也可以是整个presenter。JS和native的交互基于这个interface。
- native层使用Proxy将interface的所有逻辑都代理给JS。这里面包含着一个从interface到JS文件的映射关系,可以全APP只有一个js文件,也可以用class name映射。
- AB测试服务端不再下发测试参数,而是下发实验逻辑(一个command或者是整个页面逻辑)。再也没有奇葩的if-else,不发版能够测试的内容也更加灵活了(当然不如RN)。
核心代码只有十行:
class JSInvocationHandler implements InvocationHandler {
private V8 mEngine = V8.createV8Runtime();
private StringBuilder mBuilder = new StringBuilder();
private Gson mGson = new Gson();
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
if (method.getName().equals("dispose")) {
mEngine.release();
return null;
}
mBuilder.delete(0, mBuilder.length());
mBuilder.append(method.getName()).append("(").append(mGson.toJson(objects)).append(")");
return mEngine.executeScript(mBuilder.substring(0));
}
}
寥寥几行,了了我几年的心结。舒爽。。。