Back to Hippy

Hippy Android 3.x SDK升级指引

docs/development/android-3.0-upgrade-guidelines.md

3.4.08.0 KB
Original Source

Hippy Android 3.x SDK升级指引

这篇教程,主要介绍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针对终端引擎接入,部分类及接口调用方式上做了以下调整:

  1. 引擎初始化完成callback回调线程调整

    为了提升引擎初始化效率,3.0中引擎初始化完成callback onInitialized直接在子线程回调并继续执行loadModule。2.0在onInitialized中如果有对hippyRootView挂载等相关的UI操作,需要开发者自己增加UI线程的切换逻辑来保证。

  2. 引擎销毁调用方式与顺序调整

    3.0中destroyModule增加了回调接口,destroyEngine需要等destroyModule执行完成回调以后才能调用,否则可能有CRASH的风险,新的释放流程流程参照以下代码示例:

    java
    fun destroyEngine(hippyEngine: HippyEngine?, hippyRootView: ViewGroup?) {
        hippyEngine?.destroyModule(hippyRootView,
                Callback<Boolean> { result, e -> hippyEngine.destroyEngine() })
    }
    
  3. 废弃引擎初始化参数HippyImageLoader

    HippyImageLoader在2.0中作为引擎初始化必设项是不合理的,在3.0中已经废弃,开发者需要在引擎初始化中移除HippyImageLoader相关的设置参数与实现。</br> 3.0图片资源拉取会和其它所有IO相关的资源一样统一走VFS模块进行分发,远程网络资源请求最终会由VFS模块会分发到HttpAdapter进行处理。

  4. 废弃HippyInstanceContext定义及其相关实现

    随着3.0 framework和renderer两个子模块的解耦,我们发现HippyInstanceContext设计过于臃肿,已经不再适用于最新的3.0架构,所以我们在最新的3.0版本中废弃了HippyInstanceContext,改用更加轻量化的NativeRenderContext取代。

  5. UI Component事件发送

    3.0 UI Component事件的发送,开发者需要统一使用使用3.0新增工具类EventUtils中封装的事件发送接口:

    java
    @MainThread
    public static void sendComponentEvent(@Nullable View view, 
                                          @NonNull String eventName,
                                          @Nullable Object params);
    
  6. 自定义事件controller属性注册方式变更

    由于3.0事件名称从2.0的驼峰写法统一转换为全小写命名,会导致之前开发者自定义事件无法接收到属性设置,需要在事件属性注解中将defaultType值改为HippyControllerProps.EVENT:

    java
    @HippyControllerProps(name = "onMyEvent", defaultType = HippyControllerProps.EVENT, defaultBoolean = false)
    public void setMyEvent(HippyScrollView scrollView, boolean isEnable) {
    
    }
    
  7. module注解HippyNativeModule中取消了线程属性的自定义

    3.0中非JSI module调用将统一走hippy-module-Thread线程调用module对应接口,开发者可以根据自己的需要自行切换线程。

</br>

组件变更

3.0针对部分组件做了相应的重构,如果开发者基于老组件扩展了自定义组件,需要做以下适配:

  1. 废弃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

</br>

接口定义变更

3.0对部分接口定义及参数了做了调整,如果开发者有使用到以下接口需要做相应适配:

  1. ModuleListener接口定义变更

    • onLoadCompleted回调接口移除了root view参数的返回
    • 增加onFirstViewAdded接口回调,返回第一view挂载到Hippy root view的回调时机
    • 增加onFirstContentfulPaint接口回调,返回FCP节点渲染时机(3.3.3版本新增)
  2. HippyEngineContext类中部分接口调整

    • 新增findViewById(int nodeId),可以通过node id查找对应的view
    • 移除getDomManager()与getRenderManager()两个接口
    • getEngineId()接口转移至HippyEngine类下
    • 废弃getInstance(int id)接口,由新增getRootView()接口替代
  3. 废弃HippyRootView中getLaunchParams接口

    使用HippyEngineContext下面getJsParams接口来替代。

  4. HippyEngine类中接口参数调整

    为尽量减少接入方对SDK的耦合,destroyModule接口参数以及loadModule接口返回值由原来HippyRootView类型改为系统ViewGroup类型替代。

  5. HippyHttpRequest类中接口定义变更

    由于mInitParams参数在HippyHttpRequest创建的时候就作为初始化参数传入,后续一些依赖mInitParams获取参数的逻辑封装在HippyHttpRequest内部更合理,所以我们移除了以下set接口,只保留get接口:

    • public void setMethod(String method)
    • public void setInstanceFollowRedirects(boolean instanceFollowRedirects)
    • public void setBody(String body)
    • public void setNativeParams(Map<String, Object> nativeParams)
    • public void setInitParams(HippyMap initParams)
    • public void setInstanceFollowRedirects(boolean instanceFollowRedirects)
  6. 废弃HippyViewController中onManageChildComplete接口

    统一使用onBatchComplete接口替代,之前2.x列表滚动过程中,view复用后默认都会调用onManageChildComplete,但3.x中为了减少一些无效的调用逻辑进一步提升列表滚动流畅性,列表滚动view复用的时候默认不会调用onBatchComplete,如果想接续接收onBatchComplete调用需要做以下适配:

    (1) 定义自定义组件对应的RenderNode(类名自定义),并Override shouldNotifyNonBatchingChange接口

    java
    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的创建逻辑

    java
    @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);
    }
    
  7. HippyDeviceAdapter中reviseDimensionIfNeed接口参数调整

    由于HippyRootView不再监听onSystemUiVisibilityChange消息,移除shouldUseScreenDisplay和systemUiVisibilityChanged两个无效参数。

</br>

新增特性

3.0中新增以下新特性的支持,开发者可以根据自己的需求进行选择性适配:

  1. 新增统一资源请求处理模块-VFS,具体使用方式可以详见 VFS 特性文档介绍。

  2. 新增ImageDecoderAdapter支持接入自定义图片解码器,具体使用方式可以详见 ImageDecoderAdapter 特性文档介绍。

  3. 新增Render Node缓存特性优化启动速度,具体使用方式可以详见 RenderNode Snapshot 特性文档介绍。

  4. 新增Screenshot截屏特性,具体使用方式可以详见 Screenshot for specific views 特性文档介绍。