精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony ACE源碼解析之JavaScript運行環(huán)境初始

開發(fā) 前端
ACE結(jié)合了OpenHarmony系統(tǒng)的基礎(chǔ)組件Ability,開源jsframework框架,開源js引擎quickjs,開源跨平臺UI框架flutter,開源渲染引擎skia以及各種平臺能力API等共同構(gòu)筑了OpenHarmony標準系統(tǒng)javascript應(yīng)用開發(fā)的基礎(chǔ)。

[[420481]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

OpenHarmony JS UI框架簡介

ACE全稱Ability Cross-platform Environment,是OpenHarmony標準系統(tǒng)上的UI框架。ACE結(jié)合了OpenHarmony系統(tǒng)的基礎(chǔ)組件Ability,開源jsframework框架,開源js引擎quickjs,開源跨平臺UI框架flutter,開源渲染引擎skia以及各種平臺能力API等共同構(gòu)筑了OpenHarmony標準系統(tǒng)javascript應(yīng)用開發(fā)的基礎(chǔ)。

ACE UI框架的整體架構(gòu)如下圖所示:

OpenHarmony ACE源碼解析之JavaScript運行環(huán)境初始-鴻蒙HarmonyOS技術(shù)社區(qū)

JavaScript前端框架

目前OpenHarmony標準系統(tǒng)采用主流的類Web范式,對開源的Weex框架中的jsframework做定制化,采用ts開發(fā),主要包括編程模型MVVM、組件、API、頁面路由以及事件處理。

https://gitee.com/openharmony/third_party_jsframework

JavaScript引擎

目前OpenHarmony標準系統(tǒng)使用的是開源quickjs引擎,提供JS語言運行時和執(zhí)行上下文,提供js的解析和jsframework的加載。

https://gitee.com/openharmony/third_party_quickjs

中間轉(zhuǎn)換層

中間轉(zhuǎn)換層也就是JS橋接層,實現(xiàn)前端開發(fā)框架到UI后端引擎和JS引擎的對接。

https://gitee.com/openharmony/ace_ace_engine/tree/master/frameworks/bridge

聲明式UI后端引擎

由C++構(gòu)建的UI后端引擎,包括UI組件、布局視圖、動畫事件、自繪制選軟管線。

https://gitee.com/openharmony/ace_ace_engine/tree/master/frameworks/core

渲染引擎

目前OpenHarmony標準系統(tǒng)復(fù)用了開源跨平臺UI框架flutter引擎提供基礎(chǔ)的圖形渲染能力。

https://gitee.com/openharmony/third_party_flutter

平臺適配層

目前OpenHarmony標準系統(tǒng)的適配層完成了ohos平臺和IDE的previewer的適配,將平臺依賴聚焦到平臺相關(guān)的畫布、通用線程以及事件處理機制等少數(shù)接口上,為跨平臺提供相應(yīng)的基礎(chǔ)設(shè)施,實現(xiàn)跨平臺一致化的UI渲染。

https://gitee.com/openharmony/ace_ace_engine/tree/master/adapter

能力擴展層

為擴展ACE能力提供的插件機制,平臺其他子系統(tǒng)可以利用插件機制開發(fā)相關(guān)能力的js接口,為應(yīng)用層提供相應(yīng)的能力支持。通過napi提供引擎無關(guān)的插件實現(xiàn)機制,保證接口的ABI兼容性。

https://gitee.com/openharmony/ace_napi

JS UI框架相關(guān)代碼目錄

  1. /foundation/ace/ace_engine 
  2. ├── adapter                       # 平臺適配目錄 
  3. │   ├── common 
  4. |   ├── ohos                      # ohos平臺適配目錄 
  5. │   └── preview                   # IDE preview平臺適配目錄 
  6. ├── frameworks                    # 框架代碼 
  7. │   ├── base                      # 基礎(chǔ)庫 
  8. │   ├── bridge                    # 前后端對接層 
  9. │   └── core                      # 聲明式UI后端引擎目錄 
  10. /third_party/jsframework          # JavaScript前端框架 
  11. /third_party/quickjs              # JavaScript引擎 
  12. /third_party/flutter              # flutter engine提供跨平臺自渲染引擎 

線程模型

ACE JS應(yīng)用啟動時會創(chuàng)建一系列線程,形成獨立的線程模型,以實現(xiàn)高性能的渲染流程。

  • Platform線程:當前平臺的主線程,也就是應(yīng)用的主線程,主要負責(zé)平臺層的交互、應(yīng)用生命周期以及窗口環(huán)境的創(chuàng)建
  • JS線程:JS前端框架的執(zhí)行線程,應(yīng)用的JS邏輯以及應(yīng)用UI界面的解析構(gòu)建都在該線程執(zhí)行
  • UI線程:引擎的核心線程,組件樹的構(gòu)建以及整個渲染管線的核心邏輯都在該線程:包括渲染樹的構(gòu)建、布局、繪制以及動畫調(diào)度
  • GPU線程:現(xiàn)代的渲染引擎,為了充分發(fā)揮硬件性能,都支持GPU硬件加速,在該線程上,會通過系統(tǒng)的窗口句柄,創(chuàng)建GPU加速的OpenGL環(huán)境,負責(zé)將整個渲染樹的內(nèi)容光柵化,直接將每一幀的內(nèi)容渲染合成到該窗口的Surface上并送顯
  • IO線程:主要為了異步的文件IO讀寫,同時該線程會創(chuàng)建一個離屏的GL環(huán)境,這個環(huán)境和 GPU線程的GL環(huán)境是同一個共享組,可以共享資源,圖片資源解碼的內(nèi)容可直接在該線程上傳生成GPU紋理,實現(xiàn)更高效的圖片渲染

ACE框架類圖

OpenHarmony ACE源碼解析之JavaScript運行環(huán)境初始-鴻蒙HarmonyOS技術(shù)社區(qū)

Javascript運行環(huán)境初始化時序圖及源碼解析

OpenHarmony ACE源碼解析之JavaScript運行環(huán)境初始-鴻蒙HarmonyOS技術(shù)社區(qū) 

1.AceAbility繼承自Ability,當應(yīng)用啟動時首先應(yīng)用程序框架會調(diào)用AceAbility的生命周期函數(shù)OnStart(),其中通過Ability的api獲取Hap包的路徑,通過讀取配置文件manifest.json獲取應(yīng)用程序配置的前端的類型;

目前支持的前端類型包括enum class FrontendType { JSON, JS, JS_CARD, DECLARATIVE_JS },當前我們只關(guān)注JS前端;

根據(jù)前端類型調(diào)用ACE核心聚合類AceContainer的靜態(tài)方法CreateContainer,這個類是ACE框架平臺適配層的核心類,接下來的前端核心類和JS引擎的創(chuàng)建都是在其中完成的。

  1. //foundation\ace\ace_engine\adapter\preview\entrance\ace_ability.cpp 
  2. void AceAbility::OnStart(const Want& want) 
  3.     ... 
  4.      
  5.     //獲取打包的js bundle文件,取出配置文件,獲取前端類型 
  6.     auto packagePathStr = GetBundleCodePath(); 
  7.     auto moduleInfo = GetHapModuleInfo(); 
  8.     if (moduleInfo != nullptr) { 
  9.         packagePathStr += "/" + moduleInfo->name + "/"
  10.     } 
  11.     FrontendType frontendType = GetFrontendTypeFromManifest(packagePathStr); 
  12.  
  13.     // create container 
  14.     //創(chuàng)建AceContainer:內(nèi)部初始化時創(chuàng)建了js線程,load了js engine,創(chuàng)建了JsFrontend 
  15.     Platform::AceContainer::CreateContainer( 
  16.         abilityId_, frontendType, this, 
  17.         std::make_unique<AcePlatformEventCallback>([this]() { 
  18.             TerminateAbility(); 
  19.         })); 
  20.     ... 
  21.     ... 
  22.  
  23.     //運行page 
  24.     Platform::AceContainer::RunPage( 
  25.         abilityId_, Platform::AceContainer::GetContainer(abilityId_)->GeneratePageId(), 
  26.         parsedPageUrl, want.GetStringParam(START_PARAMS_KEY)); 
  27.  
  28.     ... 

2.在AceContainer::CreateContainer中,首先創(chuàng)建了AceContainer對象,在構(gòu)造函數(shù)中創(chuàng)建了FlutterTaskerExecutor對象用于多線程的任務(wù)管理,此處我們主要關(guān)注JS線程的創(chuàng)建和初始化,在InitJsThread()中創(chuàng)建了JS線程并獲取保存了jsRunner_用于JS任務(wù)的派發(fā)。

  1. //foundation\ace\ace_engine\adapter\preview\entrance\ace_container.cpp 
  2. void AceContainer::CreateContainer(int32_t instanceId, FrontendType type, AceAbility* aceAbility, 
  3.     std::unique_ptr<PlatformEventCallback> callback) 
  4.     auto aceContainer = AceType::MakeRefPtr<AceContainer>(instanceId, type, aceAbility, std::move(callback)); 
  5.     AceEngine::Get().AddContainer(instanceId, aceContainer); 
  6.     auto front = aceContainer->GetFrontend(); 
  7.     if (front) { 
  8.         front->UpdateState(Frontend::State::ON_CREATE); 
  9.         front->SetJsMessageDispatcher(aceContainer); 
  10.     } 
  11.  
  12. AceContainer::AceContainer(int32_t instanceId, FrontendType type, AceAbility* aceAbility, 
  13.     std::unique_ptr<PlatformEventCallback> callback) : instanceId_(instanceId), type_(type), aceAbility_(aceAbility) 
  14.     ACE_DCHECK(callback); 
  15.     //創(chuàng)建和初始化FlutterTaskerExecutor用于封裝管理Flutter ACE中涉及的多個線程:platform,UI,JS,GPU,IO,統(tǒng)一post任務(wù)到各線程執(zhí)行 
  16.     auto flutterTaskExecutor = Referenced::MakeRefPtr<FlutterTaskExecutor>(); 
  17.     //初始化platform線程,將flutter platform線程的TaskerRunner適配到ohos平臺主線程的EventRunner 
  18.     flutterTaskExecutor->InitPlatformThread(); 
  19.     //初始化JS線程,這個線程用于解析JS,不歸flutter管理,因此是單獨在ACE里使用的 
  20.     flutterTaskExecutor->InitJsThread(); 
  21.     //taskExector_封裝了所有線程任務(wù)調(diào)度的接口,因此會傳給Frontend用于JS前端解析任務(wù)和PipelineContext后端渲染UI和GPU IO相關(guān) 
  22.     taskExecutor_ = flutterTaskExecutor; 
  23.     if (type_ != FrontendType::DECLARATIVE_JS) { 
  24.         //zll:初始化前端 
  25.         InitializeFrontend(); 
  26.     } 
  27.  
  28.     platformEventCallback_ = std::move(callback); 
  29.  
  30. void FlutterTaskExecutor::InitJsThread(bool newThread) 
  31.     //創(chuàng)建并初始化JS線程,獲取保存js線程的TaskRunner 
  32.     //JS線程是ACE平臺特有,不通過flutter創(chuàng)建管理 
  33.     if (newThread) { 
  34.         jsThread_ = std::make_unique<fml::Thread>(GenJsThreadName()); 
  35.         jsRunner_ = jsThread_->GetTaskRunner(); 
  36.     } else { 
  37.         jsRunner_ = uiRunner_; 
  38.     } 

3.完成JS線程的初始化后,如果前端類型不是DECLARATIVE_JS,會調(diào)用InitializeFrontend()對前端進行初始化。

首先創(chuàng)建前端對象,F(xiàn)rontend::Create定義在js_frontend.cpp中,創(chuàng)建的是JsFrontend實例;

然后通過JsEngineLoader::Get()動態(tài)加載QjsEngineLoader;

再通過QjsEngineLoader創(chuàng)建QjsEngine并設(shè)置給JsFrontend;

最后對JsFrontend對象做初始化。

JsFrontend是ACE框架從后端進入前端的唯一入口,AceAbility、AceContainer和JsFrontend是一一對應(yīng)的關(guān)系。

  1. //foundation\ace\ace_engine\adapter\preview\entrance\ace_container.cpp 
  2. void AceContainer::InitializeFrontend() 
  3.     if (type_ == FrontendType::JS) { 
  4.         //目前Frontend::Create定義在js_frontend.cpp中,創(chuàng)建的是JsFrontend實例 
  5.         frontend_ = Frontend::Create(); 
  6.         auto jsFrontend = AceType::DynamicCast<JsFrontend>(frontend_); 
  7.         //創(chuàng)建并初始化js engine,此處是通過dlopen加載的qjs engine管理對象 
  8.         jsFrontend->SetJsEngine(Framework::JsEngineLoader::Get().CreateJsEngine(instanceId_)); 
  9.         ... 
  10.     } else if (type_ == FrontendType::DECLARATIVE_JS) { 
  11.         ... 
  12.     } else { 
  13.         ... 
  14.     } 
  15.     ACE_DCHECK(frontend_); 
  16.     //初始化前端和js engine 
  17.     frontend_->Initialize(type_, taskExecutor_); 

4.接下來我們繼續(xù)分析一下JS引擎管理對象的創(chuàng)建。首先通過dlopen動態(tài)加載libace_engine_qjs.z.so通過入口函數(shù)創(chuàng)建獲取QjsEngineLoader單例對象;然后通過QjsEngineLoader::CreateJsEngine()創(chuàng)建QjsEngine。

  1. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\engine\common\js_engine_loader.cpp 
  2. //"libace_engine_qjs.z.so"動態(tài)庫的入口,在qjs_engine_loader.cpp中定義 
  3. constexpr char JS_ENGINE_ENTRY[] = "OHOS_ACE_GetJsEngineLoader"
  4. constexpr char QUICK_JS_ENGINE_SHARED_LIB[] = "libace_engine_qjs.z.so"
  5. ... 
  6. const char* GetSharedLibrary() 
  7.     return QUICK_JS_ENGINE_SHARED_LIB; 
  8. JsEngineLoader& GetJsEngineLoader(const char* sharedLibrary) 
  9.     void* handle = dlopen(sharedLibrary, RTLD_LAZY); 
  10.     ... 
  11.     // 
  12.     auto loader = reinterpret_cast<JsEngineLoader*>(entry()); 
  13.     ... 
  14.  
  15.     return *loader; 
  16. ... 
  17. //通過加載動態(tài)鏈接庫的形式獲取qjs橋接模塊的入口函數(shù)并創(chuàng)建QjsEngineLoader 
  18. JsEngineLoader& JsEngineLoader::Get() 
  19.     static JsEngineLoader& instance = GetJsEngineLoader(GetSharedLibrary()); 
  20.     return instance; 
  21.  
  22. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\engine\quickjs\qjs_engine_loader.cpp 
  23. RefPtr<JsEngine> QjsEngineLoader::CreateJsEngine(int32_t instanceId) const 
  24.     return AceType::MakeRefPtr<QjsEngine>(instanceId); 

5.在完成了QjsEngine的創(chuàng)建并設(shè)置給JsFrontend后,調(diào)用JsFrontend::Initialize(),這里主要完成了FrontendDelegateImpl對象的創(chuàng)建和初始化將對JS引擎的相關(guān)操作委派給這個對象,以及Post JS引擎初始化的任務(wù)到JS線程的TaskRunner的message queue。

  1. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\js_frontend.cpp 
  2. bool JsFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor) 
  3.     LOGI("JsFrontend initialize begin."); 
  4.     type_ = type; 
  5.     ACE_DCHECK(type_ == FrontendType::JS); 
  6.     //創(chuàng)建并初始化FrontendDelegate對象,具體實現(xiàn)為FrontendDelegateImpl 
  7.     InitializeFrontendDelegate(taskExecutor); 
  8.     //在JS線程初始化js engine,真正的啟動JS引擎運行時并創(chuàng)建上下文 
  9.     taskExecutor->PostTask( 
  10.         [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] { 
  11.             auto jsEngine = weakEngine.Upgrade(); 
  12.             if (!jsEngine) { 
  13.                 return
  14.             } 
  15.             jsEngine->Initialize(delegate); 
  16.         }, 
  17.         TaskExecutor::TaskType::JS); 
  18.  
  19.     LOGI("JsFrontend initialize end."); 
  20.     return true

6.接著上面的分析,在JS線程執(zhí)行QjsEngine對象的初始化,初始化JS運行環(huán)境,主要包含兩部分初始化JS引擎運行時上下文和初始化JavaScript框架層jsframework。

  1. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\engine\quickjs\qjs_engine.cpp 
  2. bool QjsEngine::Initialize(const RefPtr<FrontendDelegate>& delegate) 
  3.     ACE_SCOPED_TRACE("QjsEngine::Initialize"); 
  4.     LOGI("Initialize"); 
  5.  
  6.     JSRuntime* runtime = nullptr; 
  7.     JSContext* context = nullptr; 
  8.  
  9.     // put JS_NewContext as early as possible to make stack_top in context 
  10.     // closer to the top stack frame pointer of JS thread. 
  11.     runtime = JS_NewRuntime(); 
  12.     if (runtime != nullptr) { 
  13.         context = JS_NewContext(runtime); 
  14.     } 
  15.  
  16.     ... 
  17.  
  18.     engineInstance_ = AceType::MakeRefPtr<QjsEngineInstance>(delegate, instanceId_); 
  19.     return engineInstance_->InitJsEnv(runtime, context); 
  20.  
  21. bool QjsEngineInstance::InitJsEnv(JSRuntime* runtime, JSContext* context) 
  22.     ... 
  23.     context_ = context; 
  24.     //1.初始化js運行時,上下文 
  25.     if (!InitJsContext(context_, MAX_STACK_SIZE, instanceId_, this)) { 
  26.         LOGE("Qjs cannot allocate JS context"); 
  27.         EventReport::SendJsException(JsExcepType::JS_ENGINE_INIT_ERR); 
  28.         JS_FreeRuntime(runtime_); 
  29.         return false
  30.     } 
  31.     ... 
  32.     //2.加載JS Framework,初始化JS前端框架 
  33.     //加載jsframework,js_framework和js_framework_size是quickjs編譯器編譯jsframework的ts生成的c文件 
  34.     //quickjs通過JS_ReadObject讀取生成的cbytecode,并通過JS_EvalFunction(ctx, obj)執(zhí)行相應(yīng)的函數(shù) 
  35.     //在這里最終調(diào)用的函數(shù)是jsframework/runtime/preparation/index.ts中的initFramework()函數(shù) 
  36.     JSValue retVal = LoadJsFramework(GetQjsContext(), js_framework, js_framework_size, instanceId_); 
  37.     bool result = JS_IsException(retVal) ? false : true
  38.     if (context) { 
  39.         JS_FreeValue(context, retVal); 
  40.     } 
  41.     ... 
  42.  
  43.     return result; 

7.上面初始化JS引擎運行時上下文是在InitJsContext完成的,其中初始化了Ace模塊并將模塊導(dǎo)入到了JS運行時上下文中,為jsframework框架層提供了ACE功能相關(guān)的接口,jsframework可以通過調(diào)用ACE模塊的接口完成Page上Dom元素到后端聲明式UI元素節(jié)點的創(chuàng)建,同時往JS運行時上下文全局對象掛載了日志打印的函數(shù)用于對接平臺日志打印功能。

  1. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\engine\quickjs\qjs_engine.cpp 
  2. //ace模塊向js context暴露的函數(shù),(js函數(shù)名,參數(shù)個數(shù),對應(yīng)的C函數(shù)) 
  3. const JSCFunctionListEntry JS_ACE_FUNCS[] = { 
  4.     JS_CFUNC_DEF_CPP("domCreateBody", 5, JsDomCreateBody), 
  5.     JS_CFUNC_DEF_CPP("domAddElement", 9, JsDomAddElement), 
  6.     JS_CFUNC_DEF_CPP("updateElementAttrs", 3, JsUpdateElementAttrs), 
  7.     JS_CFUNC_DEF_CPP("updateElementStyles", 3, JsUpdateElementStyles), 
  8.     JS_CFUNC_DEF_CPP("onCreateFinish", 0, JsOnCreateFinish), 
  9.     JS_CFUNC_DEF_CPP("onUpdateFinish", 0, JsOnUpdateFinish), 
  10.     JS_CFUNC_DEF_CPP("removeElement", 2, JsRemoveElement), 
  11.     JS_CFUNC_DEF_CPP("callNative", 1, JsCallNative), 
  12.     JS_CFUNC_DEF_CPP("callComponent", 3, JsCallComponent), 
  13.     JS_CFUNC_DEF_CPP("loadIntl", 0, JsLoadIntl), 
  14.     JS_CFUNC_DEF_CPP("loadLocaleData", 0, JsLoadLocaleData), 
  15. #ifdef ENABLE_JS_DEBUG 
  16.     JS_CFUNC_DEF_CPP("compileAndRunBundle", 4, JsCompileAndRunBundle), 
  17. #endif 
  18. }; 
  19. ... 
  20.  
  21. bool InitJsContext(JSContext* ctx, size_t maxStackSize, int32_t instanceId, const QjsEngineInstance* qjsEngineInstance) 
  22.     ... 
  23.      
  24.     //將ace模塊注入到上下文中,使得jsframework可以通過注冊的接口調(diào)用ace的相關(guān)功能 
  25.     // Inject ace native functions module 
  26.     InitAceModules(ctx); 
  27.  
  28.     JSValue globalObj, perfUtil; 
  29.     globalObj = JS_GetGlobalObject(ctx); 
  30.     perfUtil = JS_NewObject(ctx); 
  31.  
  32.     InitJsConsoleObject(ctx, globalObj); 
  33.  
  34.     JS_SetPropertyStr(ctx, perfUtil, "printlog", JS_NewCFunction(ctx, JsPerfPrint, "printlog", 0)); 
  35.     JS_SetPropertyStr(ctx, perfUtil, "sleep", JS_NewCFunction(ctx, JsPerfSleep, "sleep", 1)); 
  36.     JS_SetPropertyStr(ctx, perfUtil, "begin", JS_NewCFunction(ctx, JsPerfBegin, "begin", 1)); 
  37.     JS_SetPropertyStr(ctx, perfUtil, "end", JS_NewCFunction(ctx, JsPerfEnd, "end", 1)); 
  38.     JS_SetPropertyStr(ctx, globalObj, "perfutil", perfUtil); 
  39.  
  40.     ... 
  41.  
  42.     JSValue hiView; 
  43.     hiView = JS_NewObject(ctx); 
  44.     JS_SetPropertyStr(ctx, hiView, "report", JS_NewCFunction(ctx, JSHiViewReport, "report", 2)); 
  45.     JS_SetPropertyStr(ctx, globalObj, "hiView", hiView); 
  46.  
  47.     JSValue i18nPluralRules; 
  48.     i18nPluralRules = JS_NewObject(ctx); 
  49.     JS_SetPropertyStr(ctx, i18nPluralRules, "select", JS_NewCFunction(ctx, JsPluralRulesFormat, "select", 1)); 
  50.     JS_SetPropertyStr(ctx, globalObj, "i18nPluralRules", i18nPluralRules); 
  51.      
  52.     //將ace模塊導(dǎo)入到cxt指定的js 上下文中 
  53.     const char* str = "import * as ace from 'ace';\n" 
  54.                       "var global = globalThis;\n" 
  55.                       "global.ace = ace;\n" 
  56. #ifdef ENABLE_JS_DEBUG 
  57.                       "global.compileAndRunBundle = ace.compileAndRunBundle;\n" 
  58. #endif 
  59.                       "global.callNative = ace.callNative;\n"
  60.  
  61.     if (JS_CALL_FAIL == CallEvalBuf(ctx, str, strlen(str), "<input>", JS_EVAL_TYPE_MODULE, instanceId)) { 
  62.         LOGW("Qjs created JS context but failed to init Ace modules!"); 
  63.     } 
  64.  
  65.     JS_FreeValue(ctx, globalObj); 
  66.     return true

8.完成了JS運行時上下文的初始化之后,緊接著加載初始化了jsframework,為JS應(yīng)用程序提供javascript應(yīng)用框架。這個地方使用了quickjs的運行bytecode的方法,在編譯時通過qjsc(quickjs編譯器)將jsframework編譯成c文件,c文件的內(nèi)容就是一個bytecode的組數(shù)和數(shù)組大小,指定了jsframework的入口函數(shù),在這里對應(yīng)jsframework/runtime/preparation/index.ts 中的initFramework()完成jsframework的初始化。jsframework初始化完成的工作主要包括掛載到j(luò)s運行時上下文全局對象上提供給native調(diào)用的jsframework函數(shù),注冊到j(luò)sframework的ACE提供的模塊及其中的方法和jsframework提供的與native一一對應(yīng)的組件及其方法。

  1. //foundation\ace\ace_engine\frameworks\bridge\js_frontend\engine\quickjs\qjs_engine.cpp 
  2. JSValue LoadJsFramework(JSContext* ctx, const uint8_t buf[], const uint32_t bufSize, int32_t instanceId) 
  3.     ACE_SCOPED_TRACE("LoadJsFramework"); 
  4.  
  5.     LOGI("Qjs loading JS framework"); 
  6.     //等同于調(diào)用jsframework/runtime/preparation/index.ts 中的initFramework() 
  7.     JSValue ret = CallReadObject(ctx, buf, bufSize, true, instanceId); 
  8.     if (JS_IsException(ret)) { 
  9.         LOGD("Qjs loading JSFramework failed!"); 
  10.         QjsUtils::JsStdDumpErrorAce(ctx, JsErrorType::LOAD_JS_FRAMEWORK_ERROR, instanceId); 
  11.     } 
  12.  
  13.     return ret; 
  1. //third_party\jsframework\runtime\preparation\init.ts 
  2. export function initFramework(): void { 
  3.   for (const serviceName in i18n) { 
  4.     service.register(serviceName, i18n[serviceName]); 
  5.   } 
  6.   for (const serviceName in dpi) { 
  7.     service.register(serviceName, dpi[serviceName]); 
  8.   } 
  9.   //jsframework提供的可供Ace native在QjsEngine對象中調(diào)用的TS方法 
  10.   const globalMethods: GlobalInterface = { 
  11.     'createInstance': globalApi.createInstance, 
  12.     'registerModules': globalApi.registerModules, 
  13.     'appDestroy': globalApi.appDestroy, 
  14.     'appError': globalApi.appError, 
  15.     'destroyInstance': globalApi.destroyInstance, 
  16.     'getRoot': globalApi.getRoot, 
  17.     'callJS': globalApi.callJS 
  18.   }; 
  19.   //注冊modules,這些modules是ACE module提供的,調(diào)用這些模塊的方法,會通過調(diào)用注冊到qjs_engine的ace模塊中的callNative方法 
  20.   //會最終通過ace module的callNative調(diào)用到qjs_engine中的JsCallNative-->JsHandleModule-->然后調(diào)用對應(yīng)的native方法 
  21.   // registerModules and registerComponents 
  22.   ModulesInfo.forEach(modules => { 
  23.     globalMethods['registerModules'](modules); 
  24.   }); 
  25.    
  26.   //注冊components組件,對組件方法的調(diào)用,最終會通過ace module的callComponent調(diào)用到qjs_engine中的JsCallComponent 
  27.   ComponentsInfo.forEach((name) => { 
  28.     if (name && name.type && name.methods) { 
  29.       NativeElementClassFactory.createNativeElementClass( 
  30.         name.type, 
  31.         name.methods 
  32.       ); 
  33.     } 
  34.   }); 
  35.   //全局方法,這些方法可以被Qjs engine通過JS_GetPropertyStr(ctx, globalObj, "methodNamge")獲取并調(diào)用,從而實現(xiàn)了從native到j(luò)s的調(diào)用 
  36.   for (const methodName in globalMethods) { 
  37.     global[methodName] = (...args: any) => { 
  38.       const res: any = globalMethods[methodName](...args); 
  39.       if (res instanceof Error) { 
  40.         Log.error(res.toString()); 
  41.       } 
  42.       return res; 
  43.     }; 
  44.   } 

總結(jié)

以上內(nèi)容首先對OpenHarmony標準系統(tǒng)上JS UI框架ACE的邏輯架構(gòu)及相關(guān)模塊進行了簡單的介紹,給出了ACE架構(gòu)中相關(guān)模塊涉及的部分類的類圖,結(jié)合本次重點分析的Javascript運行環(huán)境初始化的時序圖詳細分析了Javascript運行環(huán)境初始化的整個流程。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-06-27 13:50:31

應(yīng)用界面開發(fā)鴻蒙

2021-11-25 09:54:54

鴻蒙HarmonyOS應(yīng)用

2021-09-16 15:08:08

鴻蒙HarmonyOS應(yīng)用

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-05-17 10:42:36

reboot源碼解析

2022-06-13 14:18:39

電源管理子系統(tǒng)耗電量服務(wù)

2021-11-08 15:04:47

鴻蒙HarmonyOS應(yīng)用

2021-12-17 16:42:09

鴻蒙HarmonyOS應(yīng)用

2022-02-17 20:57:07

OpenHarmon操作系統(tǒng)鴻蒙

2021-12-08 15:07:51

鴻蒙HarmonyOS應(yīng)用

2022-01-06 16:17:58

鴻蒙HarmonyOS應(yīng)用

2021-09-18 14:40:37

鴻蒙HarmonyOS應(yīng)用

2022-07-05 16:03:29

電源管理子系統(tǒng)鴻蒙

2022-05-20 10:32:49

事件循環(huán)器事件隊列鴻蒙

2022-01-20 14:33:29

openharmonwayland協(xié)議鴻蒙

2023-04-12 15:31:11

系統(tǒng)服務(wù)管理鴻蒙

2022-07-19 20:04:31

NAPI模塊鴻蒙

2021-12-06 06:19:03

鴻蒙HarmonyOS應(yīng)用

2022-01-10 15:30:11

鴻蒙HarmonyOS應(yīng)用

2022-05-10 11:17:27

電話子系統(tǒng)數(shù)據(jù)服務(wù)模塊
點贊
收藏

51CTO技術(shù)棧公眾號

精品国产欧美一区二区五十路| 国产精品国产三级国产专播品爱网| 精品国产一区二区在线| 可以看污的网站| 国产一级网站视频在线| 蜜臀av一区二区在线观看 | 日韩美女免费视频| 自拍偷拍你懂的| 国产中文欧美日韩在线| 午夜精品久久久久久久久久久 | 亚洲欧美色视频| 免费在线欧美视频| 久久久久久综合网天天| www.99热| 国产伦精品一区二区三区免费优势| 色先锋aa成人| 国产一二三在线视频| 3p视频在线观看| aaa欧美色吧激情视频| 国产乱肥老妇国产一区二| 国产亚洲欧美精品久久久久久| 最新亚洲精品| 欧美成人一区二区三区| 99久久激情视频| av丝袜在线| 亚洲av无码国产综合专区| 国产一区日韩一区| 国产一区二区美女视频| 污污免费在线观看| 日本精品久久| 色诱亚洲精品久久久久久| 国产一区二区三区播放| www视频在线观看免费| 不卡的av在线播放| 97碰碰视频| 亚洲网站免费观看| 天堂va蜜桃一区二区三区| 欧美国产乱视频| 91香蕉视频在线播放| 成人久久久久| 在线看欧美日韩| 性欧美13一14内谢| 欧美三级午夜理伦三级小说| 精品国产一区久久| 在线免费观看av网| 偷拍自拍亚洲| 欧美日韩亚洲不卡| 亚洲色图久久久| gogo亚洲高清大胆美女人体| 欧美性高跟鞋xxxxhd| 800av在线免费观看| 久cao在线| 亚洲美女在线一区| 国产手机视频在线观看| 含羞草www国产在线视频| 国产精品免费视频网站| 三区精品视频观看| 国产专区在线播放| 国产日产欧美精品一区二区三区| 久久大片网站| 亚洲色欧美另类| 91女神在线视频| 久久视频在线观看中文字幕| 天堂av电影在线观看| www.激情成人| 久热这里只精品99re8久| 头脑特工队2免费完整版在线观看| 成人激情小说乱人伦| 久久av一区二区| 国产尤物视频在线| www在线观看黄色| 国产精品正在播放| 97操在线视频| 欧美 日韩 国产 在线| 成人av先锋影音| 欧美大香线蕉线伊人久久| 韩日视频在线| 中文字幕一区二区三区不卡 | 亚洲老妇激情| 欧美精品videossex88| 国产成人亚洲精品自产在线 | av亚洲免费| 精品国产区一区二区三区在线观看| 精品无码一区二区三区蜜臀| 国产精品vip| 欧美孕妇性xx| 亚洲视频一区在线播放| 国产东北露脸精品视频| 精品午夜一区二区| 天堂地址在线www| 亚洲制服丝袜av| 国产淫片av片久久久久久| 精品自拍视频| 日韩免费性生活视频播放| 国产中文字幕一区二区| 日本不卡电影| 久久久久久91| 在线免费av网| 成人精品视频一区二区三区尤物| 欧美日韩在线不卡一区| 黄色在线免费网站| 欧美日韩国产综合新一区| 四季av一区二区| 大奶在线精品| 日韩在线资源网| 日韩 欧美 亚洲| 美女性感视频久久| 国产主播一区二区三区四区| 国产精品一区二区婷婷| 亚洲在线免费播放| 五月天激情视频在线观看| 9999久久久久| 日韩少妇与小伙激情| 五月婷婷激情视频| 国产白丝网站精品污在线入口| 四虎影院一区二区三区 | 日韩精品一区二区三区中文字幕 | 欧美色道久久88综合亚洲精品| 日韩爱爱小视频| 羞羞色国产精品网站| 欧美成人午夜免费视在线看片| 台湾佬中文在线| 岛国av在线一区| 最新精品视频| 奇米777日韩| 亚洲精品福利资源站| 极品美妇后花庭翘臀娇吟小说| 亚洲欧美日韩国产一区| 97se在线视频| 91麻豆国产福利在线观看宅福利 | 精品人妻aV中文字幕乱码色欲| 国产欧美一区二区精品婷婷| 黄页免费在线观看视频| 视频欧美一区| 两个人的视频www国产精品| а中文在线天堂| 99久久精品国产观看| 久久久久福利视频| 国产精品一区二区美女视频免费看| 在线看欧美日韩| 亚洲av无码不卡| wwwwww.欧美系列| 国产精品裸体瑜伽视频| 在这里有精品| 欧美激情国产精品| 精品人妻一区二区三区四区不卡 | 亚洲四色影视在线观看| 久久久国产精品成人免费| 成人高清伦理免费影院在线观看| 强开小嫩苞一区二区三区网站| 四虎国产精品永久在线国在线| 中文字幕亚洲欧美日韩在线不卡 | 精品少妇一区二区三区密爱| 日本不卡一区二区| 四虎一区二区| 亚洲精品69| 精品国模在线视频| 国产毛片一区二区三区va在线 | 精品一区二区三区在线播放视频| 亚洲xxxx视频| caopo在线| 日韩精品一区二区三区三区免费| 免费中文字幕日韩| 国产精品中文字幕一区二区三区| 麻豆视频传媒入口| 中文字幕区一区二区三| 性日韩欧美在线视频| 性xxxx搡xxxxx搡欧美| 岛国精品视频在线播放| 少妇毛片一区二区三区| 日韩国产在线观看| 亚洲精品成人久久久998| 亚洲成人a级片| 欧美大片第1页| 天天操天天射天天| 色欧美乱欧美15图片| 国产黄色片在线| 国产精品亚洲人在线观看| 毛片在线播放视频| 国产乱码精品一区二区亚洲 | 最近日韩免费视频| 亚洲视频1区2区| 污网站免费观看| 久久精品1区| 亚洲综合第一| 草草视频在线一区二区| 情事1991在线| 精品国产99久久久久久| 亚洲电影免费观看高清完整版在线| 久久精品视频7| 国产精品女人毛片| 亚洲欧美日韩偷拍| 免费xxxx性欧美18vr| 美女av免费观看| 妖精视频一区二区三区免费观看| 成人福利网站在线观看| 波多野结衣在线播放| 国产午夜精品一区理论片飘花| 国产男女裸体做爰爽爽| 欧美日韩在线第一页| 美国一级片在线观看| 不卡av电影在线播放| 色综合色综合色综合色综合| 亚洲韩日在线| 亚洲一区二区三区欧美| 日本午夜精品久久久| 成人福利网站在线观看11| 黄色漫画在线免费看| 亚洲精品少妇| 国产精品jizz在线观看麻豆| a篇片在线观看网站| 亚洲欧美一区二区三区在线| 99久久免费国产精精品| 欧美亚洲禁片免费| 九九热国产视频| 亚洲欧洲一区二区三区| 久久精品国产亚洲av久| 国产成人免费视频精品含羞草妖精 | 国产精品视频999| 岛国av在线播放| 欧美成人精品激情在线观看 | 成人免费播放器| 天天av综合| 欧美一区二区影视| 日本成人a网站| 99热在线播放| 大胆国模一区二区三区| 国产裸体写真av一区二区| 老头老太做爰xxx视频| 盗摄系列偷拍视频精品tp| 成人精品久久久| 日韩精品三区| 国产不卡在线观看| 精品丝袜在线| 欧美丰满少妇xxxxx做受| 黄色的网站在线观看| www.欧美精品| 午夜毛片在线| 中文字幕在线看视频国产欧美在线看完整| 水莓100在线视频| 欧美精品一区二区三区蜜臀| 亚洲黄色a级片| 日韩欧美一级在线播放| 国产国语亲子伦亲子| 欧美一区二区三区视频免费播放| 91美女精品网站| 欧美日韩极品在线观看一区| 一区二区自拍偷拍| 欧美性色aⅴ视频一区日韩精品| 国产一级片免费在线观看| 日韩欧美一区视频| 中文人妻av久久人妻18| 91传媒视频在线播放| 一区二区乱子伦在线播放| 欧美无人高清视频在线观看| 黄色大全在线观看| 欧美亚洲一区二区三区四区| 中文字幕理论片| 制服丝袜激情欧洲亚洲| 国内精品国产成人国产三级| 精品美女在线观看| 特黄aaaaaaaaa真人毛片| 亚洲精品久久久久久久久久久久| 天天av综合网| 日韩av在线免费观看一区| 欧美一级做性受免费大片免费| 亚洲精品电影在线| 男人的天堂在线视频| 中文在线资源观看视频网站免费不卡| 91xxx在线观看| 久久夜色精品国产亚洲aⅴ| 综合久久2019| 性色av一区二区三区红粉影视| 日韩脚交footjobhdboots| 国产精品第七影院| 精品视频在线播放一区二区三区| 99电影在线观看| 亚洲午夜久久| 亚洲一区二区精品在线| 欧美aⅴ99久久黑人专区| www.99热这里只有精品| 日本不卡一区二区三区高清视频| 自拍一级黄色片| 99精品在线免费| 天堂av免费在线| 一区二区三区高清| 99热只有这里有精品| 欧美调教femdomvk| 亚洲高清在线观看视频| 亚洲天堂男人天堂| а√天堂官网中文在线| 1769国内精品视频在线播放| 久久av日韩| 国产综合18久久久久久| 色婷婷色综合| 国产精品毛片大码女人| 国产福利短视频| 亚洲欧洲无码一区二区三区| 黄色一级片免费看| 欧美日韩午夜在线| 无码国产精品一区二区色情男同 | 国产在线观看91| 91av在线国产| 国产精品99久久免费| 久久天天狠狠| 欧美成人tv| 91淫黄看大片| 97久久人人超碰| av成人免费网站| 欧美在线一区二区| 欧美一级一区二区三区| 久久精品久久久久久国产 免费| 亚洲色图官网| 99国产超薄肉色丝袜交足的后果| 欧美精品一区二区三区精品| 日韩在线观看a| 麻豆精品在线播放| 久久久久久亚洲中文字幕无码| 亚洲一二三四在线观看| 一区不卡在线观看| 亚洲欧美日韩久久久久久| 一卡二卡在线视频| 正在播放亚洲1区| 樱花草涩涩www在线播放| 999国产在线| 99久久夜色精品国产亚洲狼| 激情六月丁香婷婷| 99久久久国产精品免费蜜臀| 青青草精品在线视频| 欧美精品久久99久久在免费线| 黄色av网站在线免费观看| 91国产中文字幕| eeuss国产一区二区三区四区| 日本成人性视频| 久久成人18免费观看| 久久久免费看片| heyzo一本久久综合| 91网站免费看| 精品国产一区二区三区噜噜噜| 女性女同性aⅴ免费观女性恋| 成人小视频免费在线观看| 欧美成人精品欧美一级私黄| 欧美精品三级日韩久久| 日本免费在线视频| 成人xvideos免费视频| 久久看人人摘| 中文字幕日韩综合| 中文字幕亚洲不卡| 国产麻豆免费视频| 久久夜色精品国产亚洲aⅴ| 国产精品亚洲欧美一级在线| 免费观看中文字幕| 国产一区高清在线| 国产十六处破外女视频| 日韩午夜激情av| 成人在线高清免费| 精品欧美日韩| 欧美亚洲免费| 极品蜜桃臀肥臀-x88av| 欧美在线观看一区| 日本中文字幕在线看| 成人高清视频观看www| 66国产精品| 极品白嫩的小少妇| 亚洲成精国产精品女| 搡老岳熟女国产熟妇| 欧美在线欧美在线| 欧美日韩国产一区二区三区不卡| www.激情小说.com| 亚洲天堂a在线| 日本韩国在线观看| 欧亚精品中文字幕| 日韩欧美中字| 日本在线视频播放| 午夜精品视频在线观看| 国产精品一区二区婷婷| 成人激情黄色网| 精品不卡视频| 黄色aaa视频| 欧美精品vⅰdeose4hd| 丁香花电影在线观看完整版| 欧美二区三区| 精品亚洲国产成人av制服丝袜| 欧美激情图片小说| 日韩av在线最新| 高清亚洲高清| 精品无码国产一区二区三区av| 久久久欧美精品sm网站| 国产美女免费视频| 欧美在线亚洲在线| 亚洲欧美综合久久久| av无码一区二区三区| 欧美办公室脚交xxxx| 国产欧美一区二区三区另类精品| 久久不射网站| 黄色片在线观看网站| 亚洲欧美中文在线视频| 欧美影院视频| 午夜免费精品视频| 亚洲一区二区成人在线观看|