基于Weex的跨多端融合方案(二)
调试工具
开发以及测试过程中,开发人员最关心的事除了框架提供的api好不好用之外,就是调试工具的便捷性了。weex官方基于Chrome Debugging Protocol定制了Weex Devtools。而我们封装的跨多端融合方案需要在此基础上再扩展出“整合基础业务以及模拟环境相关”的功能。
出于对安全性考虑,调试相关的工具我们只会在debug包中接入,真正发上线的release包并不会集成调试工具。因此这就要求调试工具对于项目代码是无侵入或者侵入最小化的(如进入调试页面需要通过反射的形式等)。
public static void startDebugActivity(Context context) {
//如果没有集成 debugadapter ,就启动 debugActivity
Class<?> debugActivity = DebugActivity.class;
try {
debugActivity = Class.forName("com.fusion.debug.ExternalDebugActivity");
} catch (Exception e) {
//ignore
}
try {
Intent intent = new Intent(context, debugActivity);
if (!(context instanceof Activity)) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
} catch (Exception ex) {
ex.printStackTrace();
}
}
环境切换
常规的开发及部署流程中,至少会有测试环境、预发环境以及线上环境。那么我们的调试工具第一步即是需要提供一键切换环境的功能。之前说过我们要尽量少甚至是不侵入实际的业务代码,因此我们不能直接将host作为一个全局变量然后去修改它。这里我们暂时使用的方式是将这个host记录在SharePreference中。这样在调试工具里修改以及在项目中获取host就不会有强耦合,当然这么做也不是最靠谱的方式。
bundleJS获取方式
Weex框架或者说任何跨端方案中最核心的api就是如何去加载bundleJS,这个关系到具体的业务模块分发、更新、降级等策略。并且也会影响到最终用户的使用体验。我们目前的策略是:在项目启动时,请求检查资源更新的接口,若有新版本的资源包,则再去下载(资源包通常是zip格式)。zip包中若有bundleJS,那么直接加载本地的bundleJS,若没有则加载在线版本的。出于安全性考虑,通常我们只加载本地的JS,而只在开发调试阶段才去加载在线版本的。
这里顺带一提降级策略,我们现在支持的降级就是当weex页面找不到时就去加载H5页面。因此业务接口所返回的页面url不会直接是bundleJS的地址(如一个列表页接口返回的数据中会有每一项item的跳转),而是一个H5的url,然后我们需要在资源zip包里再加一个config文件,用来映射这个H5的url与bundleJS的关系。降级策略又分为主动降级与被动降级,由于这款我们做的也不是特别完善因此暂且不详细展开。
扫码打开页面
这个功能在调试阶段最常用,实现也比较简单,就是集成一个扫码的sdk,然后打开目标调试页面。这里有一个问题,之前提到过,正式环境下获取bundleJS是通过资源zip包里的config文件映射找到的,但是扫码调试的时候往往是直接拿bundleJS的路径来扫,也就是说这个case下是不需要去通过映射的形式来获取这个bundleJS。但是我们不能修改这个映射逻辑,因此用了一个比较挫的方式绕了过去,就是再加一条映射关系,而key和value都是bundleJS的路径……
Weex Devtools
weex官方的调试工具,具体调用参考官方文档即可(https://github.com/weexteam/weex-devtools-android/blob/master/README-zh.md),这里需要注意的是weex的版本号与调试工具的版本号需要一一对应
白名单
白名单策略可以根据实际的需求场景来,确定好哪些功能需要白名单即可。但这又是一个不可或缺的策略,需要每个项目组自己好好合计合计。