From 2b0cdb65e2809552d859965148732e4496c755db Mon Sep 17 00:00:00 2001 From: maxli Date: Thu, 7 Nov 2024 16:57:52 +0800 Subject: [PATCH] fix(doc): update android v8 and module document --- docs/development/_sidebar.md | 2 +- docs/development/native-module.md | 46 +++++++++++++++---------------- docs/development/v8-api.md | 24 ++++++++++++++++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/docs/development/_sidebar.md b/docs/development/_sidebar.md index c30b77fbb61..5f1fef08ef3 100644 --- a/docs/development/_sidebar.md +++ b/docs/development/_sidebar.md @@ -15,7 +15,7 @@ - [事件](development/native-event.md) - [终端能力适配](development/native-adapter.md) - [数据类型映射](development/type-mapping.md) -- [V8 API](development/v8-api.md) +- [V8初始化参数与API](development/v8-api.md) - [调试](development/debug.md) - [曝光上报](development/report.md) - [技术支持](development/support.md) diff --git a/docs/development/native-module.md b/docs/development/native-module.md index 364f53a8cad..aa12b911f1a 100644 --- a/docs/development/native-module.md +++ b/docs/development/native-module.md @@ -117,35 +117,19 @@ public void helloNativeWithPromise(HippyMap hippyMap, Promise promise) } ``` - - ## 4. 注册Module -然后需要注册这个Module。需要在 `HippyPackage` 的 `getNativeModules` 方法中添加这个 Module,这样它才能在JS中被访问到。 +需要自定义'APIProvider'类,并实现SDK HippyAPIProvider interface,然后在`getNativeModules` 方法中添加这个 Module,这样它才能在JS中被访问到。 ```java -import com.tencent.mtt.hippy.HippyEngineContext; -import com.tencent.mtt.hippy.HippyPackage; -import com.tencent.mtt.hippy.common.Provider; -import com.tencent.mtt.hippy.example.module.TestModule; - -import com.tencent.mtt.hippy.modules.javascriptmodules.HippyJavaScriptModule; -import com.tencent.mtt.hippy.modules.nativemodules.HippyNativeModuleBase; -import com.tencent.mtt.hippy.uimanager.HippyViewController; +public class MyAPIProvider implements HippyAPIProvider { -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ExamplePackages implements HippyPackage -{ @Override - public Map, Provider> getNativeModules(final HippyEngineContext context) + public Map, Provider> getNativeModules(final HippyEngineContext context) { Map, Provider> modules = new HashMap<>(); - - // regist the LogModule - modules.put(ToastModule.class, new Provider() + //regist the MyModule + modules.put(TestModule.class, new Provider() { @Override public HippyNativeModuleBase get() @@ -153,11 +137,27 @@ public class ExamplePackages implements HippyPackage return new TestModule(context); } }); - - return modules; } + + @Override + public List> getJavaScriptModules() {return null;} + + @Override + public List> getControllers() {return null;} +} +``` + +## 5. 注册APIProvider + +在HippyEngine初始化的EngineInitParams参数属性中设置providers。 + +``` java +List providers = new ArrayList<>(); +providers.add(new MyAPIProvider()); +initParams.providers = providers; ``` + ## 注意事项 扩展Module中不能同步执行耗时操作,这可能卡住整个引擎通信线程。存在耗时场景,请使用异步线程处理。 diff --git a/docs/development/v8-api.md b/docs/development/v8-api.md index 01fdb5a7000..838435fc8e1 100755 --- a/docs/development/v8-api.md +++ b/docs/development/v8-api.md @@ -1,3 +1,27 @@ +# V8 相关初始化参数 + +在HippyEngine初始化的时候,EngineInitParams属性里有以下v8相关的属性参数。 + +## codeCacheTag + +code cache 是V8中的一个特性,简单说就是JavaScript代码在执行前,需要进行解析和编译,才能正确执行,解析编译过程是耗时的,V8 暴露了一个方法,可以将编译产物序列化存储下来,下次再执行相同一段代码时,就可以用之前缓存的内容,节省了解析编译的时间,codeCacheTag作为编译内容缓存的key,设置后便会开启v8 code cache能力,建议开发者对该初始化参数进行设置,可以有效降低非首次启动js bundle加载运行耗时。 + +## v8InitParams + +- initialHeapSize代表v8初始Heap size +- maximumHeapSize代表v8最大Heap size + +由于v8的内存是自己管理的,使用策略是尽可能使用更多的内存,只有在达到maximumHeapSize 80%左右的时候才会触发gc,未达到之前会一直增长,达到80%触发gc的同时会回调near_heap_limit_callback接口获取内存增量,这里内存增量通过sdk内部接口V8VMInitParam::HeapLimitSlowGrowthStrategy返回,默认内存增长策略是当前max值*2,如果前端申请大内存,扩容后还不满足内存分配就会产生OOM. + +在无限滚动列表场景,设置maximumHeapSize可以有效降低v8内存增加速率。 + +修改v8初始内存参数虽然能减少内存增量,但频繁的内存申请和gc,可能引入以下2个负面影响: + +- 首屏性能下降 +- OOM率升高 + +所以v8初始化内存参数的设置需要跟进具体的业务场景设置合适的值,并做完整的测试验证,如果不是内存占用有严格要的求场景不建议设置该初始化参数。 + # V8 API 获取 V8 JS 引擎对象,并操作相关方法。