docs/development/android-3.0-upgrade-guidelines.md
这篇教程,主要介绍Hippy Android SDK 从2.x升级3.x版本如何进行适配以及2.x和3.x在使用上的一些差异化。
</br>
3.0 SDK集成依赖项相对2.0有所变更,开发者可以参照Hippy Android 3.x SDK集成指引更新自己工程中的依赖项。 </br> </br>
3.0针对终端引擎接入,部分类及接口调用方式上做了以下调整:
引擎初始化完成callback回调线程调整
为了提升引擎初始化效率,3.0中引擎初始化完成callback onInitialized直接在子线程回调并继续执行loadModule。2.0在onInitialized中如果有对hippyRootView挂载等相关的UI操作,需要开发者自己增加UI线程的切换逻辑来保证。
引擎销毁调用方式与顺序调整
3.0中destroyModule增加了回调接口,destroyEngine需要等destroyModule执行完成回调以后才能调用,否则可能有CRASH的风险,新的释放流程流程参照以下代码示例:
fun destroyEngine(hippyEngine: HippyEngine?, hippyRootView: ViewGroup?) {
hippyEngine?.destroyModule(hippyRootView,
Callback<Boolean> { result, e -> hippyEngine.destroyEngine() })
}
废弃引擎初始化参数HippyImageLoader
HippyImageLoader在2.0中作为引擎初始化必设项是不合理的,在3.0中已经废弃,开发者需要在引擎初始化中移除HippyImageLoader相关的设置参数与实现。</br> 3.0图片资源拉取会和其它所有IO相关的资源一样统一走VFS模块进行分发,远程网络资源请求最终会由VFS模块会分发到HttpAdapter进行处理。
废弃HippyInstanceContext定义及其相关实现
随着3.0 framework和renderer两个子模块的解耦,我们发现HippyInstanceContext设计过于臃肿,已经不再适用于最新的3.0架构,所以我们在最新的3.0版本中废弃了HippyInstanceContext,改用更加轻量化的NativeRenderContext取代。
UI Component事件发送
3.0 UI Component事件的发送,开发者需要统一使用使用3.0新增工具类EventUtils中封装的事件发送接口:
@MainThread
public static void sendComponentEvent(@Nullable View view,
@NonNull String eventName,
@Nullable Object params);
自定义事件controller属性注册方式变更
由于3.0事件名称从2.0的驼峰写法统一转换为全小写命名,会导致之前开发者自定义事件无法接收到属性设置,需要在事件属性注解中将defaultType值改为HippyControllerProps.EVENT:
@HippyControllerProps(name = "onMyEvent", defaultType = HippyControllerProps.EVENT, defaultBoolean = false)
public void setMyEvent(HippyScrollView scrollView, boolean isEnable) {
}
module注解HippyNativeModule中取消了线程属性的自定义
3.0中非JSI module调用将统一走hippy-module-Thread线程调用module对应接口,开发者可以根据自己的需要自行切换线程。
3.0针对部分组件做了相应的重构,如果开发者基于老组件扩展了自定义组件,需要做以下适配:
废弃support ui下面RecyclerView及其派生类HippyListView组件
3.0的HippyWaterfallView重构后已经不再依赖support ui相关组件,以下2个目录下所有实现文件已经从sdk中移除 </br> com/tencent/mtt/supportui/views/recyclerview/ </br> com/tencent/mtt/hippy/views/list/ </br> 之前开发者如果基于HippyListView派生了自己定义的list view组件,需要修改并适配为继承于HippyRecyclerView
3.0对部分接口定义及参数了做了调整,如果开发者有使用到以下接口需要做相应适配:
ModuleListener接口定义变更
HippyEngineContext类中部分接口调整
废弃HippyRootView中getLaunchParams接口
使用HippyEngineContext下面getJsParams接口来替代。
HippyEngine类中接口参数调整
为尽量减少接入方对SDK的耦合,destroyModule接口参数以及loadModule接口返回值由原来HippyRootView类型改为系统ViewGroup类型替代。
HippyHttpRequest类中接口定义变更
由于mInitParams参数在HippyHttpRequest创建的时候就作为初始化参数传入,后续一些依赖mInitParams获取参数的逻辑封装在HippyHttpRequest内部更合理,所以我们移除了以下set接口,只保留get接口:
废弃HippyViewController中onManageChildComplete接口
统一使用onBatchComplete接口替代,之前2.x列表滚动过程中,view复用后默认都会调用onManageChildComplete,但3.x中为了减少一些无效的调用逻辑进一步提升列表滚动流畅性,列表滚动view复用的时候默认不会调用onBatchComplete,如果想接续接收onBatchComplete调用需要做以下适配:
(1) 定义自定义组件对应的RenderNode(类名自定义),并Override shouldNotifyNonBatchingChange接口
public class CustomRenderNode extends RenderNode {
public CustomRenderNode(int rootId, int id,
@Nullable Map<String, Object> props,
String className,
ControllerManager componentManager,
boolean isLazyLoad) {
super(rootId, id, props, className, componentManager, isLazyLoad);
}
@Override
protected boolean shouldNotifyNonBatchingChange() {
return !isBatching();
}
}
(2) 在自定义组件Controller中Override createRenderNode接口并增加自定义RenderNode的创建逻辑
@Override
public RenderNode createRenderNode(int rootId, int id,
@Nullable Map<String, Object> props,
@NonNull String className,
@NonNull ControllerManagercontrollerManager,
boolean isLazy) {
return new CustomRenderNode(rootId, id, props, className, controllerManager, isLazy);
}
HippyDeviceAdapter中reviseDimensionIfNeed接口参数调整
由于HippyRootView不再监听onSystemUiVisibilityChange消息,移除shouldUseScreenDisplay和systemUiVisibilityChanged两个无效参数。
3.0中新增以下新特性的支持,开发者可以根据自己的需求进行选择性适配:
新增统一资源请求处理模块-VFS,具体使用方式可以详见 VFS 特性文档介绍。
新增ImageDecoderAdapter支持接入自定义图片解码器,具体使用方式可以详见 ImageDecoderAdapter 特性文档介绍。
新增Render Node缓存特性优化启动速度,具体使用方式可以详见 RenderNode Snapshot 特性文档介绍。
新增Screenshot截屏特性,具体使用方式可以详见 Screenshot for specific views 特性文档介绍。