基于JS的AB测试方案

客户端的AB测试一直蛮恶心的,基本都是要预置代码、if-else入侵原有逻辑、发版前把所有测试方案都想好,新增只能发版。
当然,像RN这种究极方案解决一切由客户端逻辑不能修改带来的问题,还有一个更加简单的方法:基于JS引擎+JS下发的AB测试。

  1. 要在APP中内置一个JS引擎,J2V8蛮不错的,还有一些其他。目前来看,都比较容易集成。

  2. 定义一个interface作为为AB测试预留的坑。这个interface可大可小,可以是个StringGetter,也可以是整个presenter。JS和native的交互基于这个interface。

  3. native层使用Proxy将interface的所有逻辑都代理给JS。这里面包含着一个从interface到JS文件的映射关系,可以全APP只有一个js文件,也可以用class name映射。
  4. 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));
    }
  }

寥寥几行,了了我几年的心结。舒爽。。。

猜你喜欢

转载自blog.csdn.net/pouloghost/article/details/76855392