Skyline調(diào)研

一、JavascriptCore介紹

JavaScriptCore是一個(gè)在WebKit中提供JavaScript引擎的框架狸吞,而且在OS X作為其他內(nèi)容的腳本引擎。JavaScriptCore最初是為KDE的JavaScript引擎(KJS)庫(kù)及PCRE正則表達(dá)式庫(kù)偷卧,JavaScriptCore從KJS及PCRE復(fù)刻之后蚊惯,已比原先進(jìn)步了許多,有了新的特色以及極大的性能改進(jìn)佳晶。

WebCore

WebCore是一個(gè)由WebKit項(xiàng)目所開(kāi)發(fā)的布局(Layout)桅狠、渲染(Rendering)及HTML和SVG的DOM庫(kù),完整的代碼皆由GNU寬通用公共許可證所授權(quán)轿秧,WebKit框架包裝了WebCore及JavaScriptCore(Nitro)中跌,并提供一個(gè)Objective-C應(yīng)用程序接口來(lái)接介由C++所開(kāi)發(fā)的WebCore渲染引擎及JavaScriptCore腳本引擎,透過(guò)Cocoa API就可以在應(yīng)用程序中很簡(jiǎn)單的使用這些組件菇篡。之后的版本同時(shí)包含了一個(gè)跨平臺(tái)的C++抽象平臺(tái)晒他,并且提供各種API使用。

WebKit中渲染采用CoreGraphics逸贾,相對(duì)Skia未利用到GPU加速能力,性能較差津滞。

image.png
Nitro(SFX)

在2008年6月2日铝侵,WebKit項(xiàng)目宣布,JavaScriptCore將被重寫(xiě)為"SquirrelFish"触徐,它是一個(gè)字節(jié)碼解釋器咪鲜,這個(gè)項(xiàng)目演變成SquirrelFish Extreme(簡(jiǎn)稱(chēng)為SFX,市場(chǎng)稱(chēng)之為Nitro)撞鹉,首次公開(kāi)于2008年9月18日疟丙,它會(huì)將Javascript編譯為本地的機(jī)器語(yǔ)言,不再需要字節(jié)碼解釋器鸟雏,同時(shí)加速了JavaScript的執(zhí)行效率享郊。

2009年6月30日,在Firefox 3.5發(fā)布的最新技術(shù)能“使某些情況下的速度提升20到40倍”孝鹊。

從Safari 4 Beta開(kāi)始采用炊琉,在Safari 5中進(jìn)行了優(yōu)化。

在Safari 5剛發(fā)布時(shí),Nitro在Mac上執(zhí)行JavaScript的速度比之前Safari 4快40%苔咪,比Chrome 5快3%锰悼,并且是Firefox 3.6的兩倍以上。

JIT

JIT(Just In Time)編譯器:是指程序邏輯以代碼(或字節(jié)碼)形式下發(fā)到目標(biāo)機(jī)(如客戶(hù)端)上团赏,在系統(tǒng)即將運(yùn)行此邏輯的前一刻箕般,目標(biāo)機(jī)系統(tǒng)上的編譯器才將這些代碼編譯成機(jī)器指令,然后再交給系統(tǒng)執(zhí)行舔清。因?yàn)樗木幾g發(fā)生成運(yùn)行前一刻丝里,剛剛能趕得上執(zhí)行,所以叫做Just In Time編譯器鸠踪。

JavascriptCore framework

iOS中WebKit使用的js解釋引擎是Nitro(或者叫做重寫(xiě)的JavascriptCore)丙者。但內(nèi)置JavascriptCore framework是個(gè)閹割版本,不支持JIT及WASM营密,setTimeout等械媒。因?yàn)椴恢С諮IT,通信性能表現(xiàn)略差评汰。

JSI

JSI 的全稱(chēng)是 JavaScript Interface纷捞,即 JS Interface 接口,它是對(duì) JS引擎 與 Native (C++) 之間相互調(diào)用的封裝被去,通過(guò) HostObject 接口實(shí)現(xiàn)雙邊映射主儡,官方也稱(chēng)它為映射框架。

有了這層封裝惨缆,在 ReactNative 中有了兩方面的提升:

可以自由切換引擎糜值,比如: JavaScriptCore、V8坯墨、Hermes等寂汇。
在 JS 中調(diào)用 C++ 注入到 JS 引擎中的方法,數(shù)據(jù)載體格式是通過(guò) HostObject 接口規(guī)范化后的捣染,摒棄了舊架構(gòu)中以 JSON 作為數(shù)據(jù)載體的異步機(jī)制骄瓣,從而使得 JS 與 Native 之間的調(diào)用可以實(shí)現(xiàn)同步感知。

JSI 與 JSC(不是JavaScriptCore腳本引擎) 對(duì)比

相同點(diǎn):

首先在底層實(shí)現(xiàn)上來(lái)說(shuō)耍攘,JSI 與 JSC 都是通過(guò)向 JS 引擎中注入方法榕栏,來(lái)實(shí)現(xiàn)的 JS 與 Native 通信,同時(shí) 注入的方法也都是掛載到了 JS global 全局對(duì)象上面蕾各。

不同點(diǎn):

舊架構(gòu)中的 JSC 處理的注入對(duì)象是JSON 對(duì)象與C++ 對(duì)象扒磁,內(nèi)部涉及復(fù)雜且頻繁的類(lèi)型轉(zhuǎn)換。且在

JSBridge 這種異步傳輸?shù)脑O(shè)計(jì)中存在三個(gè)線程之間的通信:UI線程式曲、Layout線程渗磅、JS線程,在典型的列表快速滑動(dòng)時(shí)出現(xiàn)空白頁(yè)的例子中,效率低下得到明顯的體現(xiàn)始鱼。

而對(duì)于 JSI 來(lái)講仔掸,棄用了異步的bridge,傳輸?shù)臄?shù)據(jù)也不再依賴(lài)于 JSON 的數(shù)據(jù)格式医清,而是將HostObject 接口作為了雙邊通信的協(xié)議起暮,實(shí)現(xiàn)了雙邊同步通信下的高效信息傳輸。

另外編寫(xiě) NativeModule 的方式與舊架構(gòu)中相比發(fā)生了改變会烙,除了功能之外的邏輯负懦,需要在一個(gè) C++ 類(lèi)中來(lái)完成。 因此柏腻,一個(gè) TurboModule 的實(shí)現(xiàn)分為兩部分: C++ & Java (OC)纸厉。

一句話(huà)概括 JSI 提效的本質(zhì): JSI 實(shí)現(xiàn)了通信橋 Bridge 的自定義,并通過(guò) HostObjec 接口協(xié)議的方式取代了 舊架構(gòu)中基于異步 bridge 的JSON數(shù)據(jù)結(jié)構(gòu)五嫂,從而實(shí)現(xiàn)了同步通信颗品,并且避免了 JSON 序列化與反序列化的繁瑣操作,大大提升了 JS 與 Native 的通信效率沃缘。

重點(diǎn)總結(jié)

WebKit(WKWebView)的一個(gè)缺點(diǎn)是渲染是通過(guò)CoreGraphics實(shí)現(xiàn)躯枢,CoreGraphics渲染主要運(yùn)算工作在CPU運(yùn)行,并沒(méi)有充分利用GPU的硬件加速能力槐臀。因此在一些復(fù)雜或者大量的圖形繪制任務(wù)時(shí)表現(xiàn)性能比較差锄蹂。像flutter的渲染是通過(guò)skia完成,相比webkit提升了渲染能力水慨。(可參考:webGL調(diào)研(iOS渲染原理)

WebKit的另一個(gè)缺點(diǎn)是過(guò)于龐大得糜,加載慢。目前小程序每個(gè)頁(yè)面都創(chuàng)建對(duì)應(yīng)的一個(gè)webview晰洒,會(huì)造成很大的性能浪費(fèi)朝抖。

WebKit內(nèi)置的JSCore是支持JIT,但是對(duì)外提供的JSCore framework卻不支持JIT欢顷,所以這導(dǎo)致了JSCore framework在通信上的表現(xiàn)比較差。

參考資料:

https://zh.wikipedia.org/wiki/WebKit

https://zh.wikipedia.org/wiki/JavaScript%E5%BC%95%E6%93%8E#%E5%81%9C%E6%AD%A2%E9%96%8B%E7%99%BC

https://trac.webkit.org/browser/webkit/trunk/Source/JavaScriptCore?order=name

https://trac.webkit.org/wiki/JavaScriptCore

http://www.reibang.com/p/b5c6207edb98/

https://blog.51cto.com/u_11887782/5848984

https://blog.csdn.net/m0_49508485/article/details/122622251

二捉蚤、Skyline介紹

介紹:https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html

三抬驴、Skyline分析

下圖為未使用Skyline的小程序視圖層級(jí):

image.png

下圖為使用了Skyline的微信小程序視圖層級(jí):

image.png

下面兩圖為基本的flutter iOS原生混合項(xiàng)目的內(nèi)存計(jì)數(shù)及視圖層級(jí):

image.png

image.png

WAFlutterViewController繼承自FlutterViewController。

@interface WAFlutterViewController : FlutterViewController

可以得出:

  1. Flutter開(kāi)頭的相關(guān)類(lèi)都是flutter自動(dòng)生成缆巧,包括FlutterView布持,F(xiàn)lutterViewController,F(xiàn)lutterEngine等陕悬,而不是微信自身實(shí)現(xiàn)题暖。
  2. 微信Skyline用SkylineView代替了webview,但skylineView的渲染都是由flutter自身實(shí)現(xiàn)。

支持skyline的版本中胧卤,pageVC中增加了一個(gè)skylineView屬性唯绍,比起webView多支持IWASkylineView接口:

@property(retain, nonatomic) UIView<YYWebViewInterface> *webView;

@property(retain, nonatomic) UIView<IWASkylineView><YYWebViewInterface> *skylineView;

pageVC中和Skyline相關(guān)的方法及用法(個(gè)人理解):

處理路由事件navigateBack

- (void)notifySkylineNavigateBack:(long long)arg1 animated:(_Bool)arg2;

自動(dòng)處理ReLaunch路由事件
- (void)notifySkylineAutoReLaunch;

處理ReLaunch路由事件
- (void)notifySkylineReLaunch;

處理RedirectTo路由事件
- (void)notifySkylineRedirectTo;

處理NavigateTo路由事件
- (void)notifySkylineNavigateTo;

處理暗黑模式變化
- (void)notifySkylineDarkModeUpdate;

處理SwitchTab
- (void)notifySkylineSwitchTab;

處理AppLaunch
- (void)notifySkylineAppLaunch;

獲取Skyline相關(guān)頁(yè)面數(shù)據(jù)
- (id)getSkylineSinglePageData:(_Bool)arg1;

設(shè)置Skyline相關(guān)頁(yè)面數(shù)據(jù)
- (void)setSkylineSinglePageRouteData:(id)arg1;

找回skyline View?
- (void)findBackSkylineView;

IWASkylineView接口定位如下:

@protocol IWASkylineView
@property(nonatomic) _Bool innerPopAnim;
@property(nonatomic) long long innerPopCnt;
@property(nonatomic) _Bool isNewEngineHomePage;
@property(readonly, nonatomic) _Bool isReady;
@property(readonly, nonatomic) long long windowId;
@property(nonatomic) __weak id <IWASkylineRuntime> skylineRuntime;
- (void)snapshotEnd;
- (void)snapshotBegin;
- (UIImage *)snapshotSkyline;
- (void)removeNativeView:(long long)arg1;
- (void)insertNativeView:(UIView *)arg1 viewId:(long long)arg2;
- (void)startMoveViewToOldPage;
- (void)startMoveViewToNewPage;
@end

WASkylineView的聲明如下枝誊,可以看到還實(shí)現(xiàn)了FlutterEngineDelegate况芒,說(shuō)明內(nèi)部渲染應(yīng)該是通過(guò)flutter引擎實(shí)現(xiàn)。

@interface WASkylineView : UIView <FlutterEngineDelegate, IWASkylineView, YYWebViewInterface>

skyline處理在頁(yè)面跳轉(zhuǎn)時(shí)叶撒,函數(shù)調(diào)用棧如下绝骚。loadIndexData會(huì)在執(zhí)行IndexData之前,發(fā)送路由事件并通知skylineView祠够。

image.png

小程序進(jìn)入新頁(yè)面會(huì)分別交給skylineView執(zhí)行5個(gè)腳本压汪。

從方法名來(lái)看分別是mainPluginPageFrame,MainModuleSharedCommonJS,文件moduleScriptData,和之前發(fā)給webview作為page層的js基本上一致古瓤。

image.png

image.png

image.png

skylineView持有了 WASkyLineRuntime的弱引用止剖,強(qiáng)引用持有了WAFlutterViewController。

從視圖層級(jí)可以看出湿滓,skylineView addSubView: WAFlutterViewController.FlutterView(偽代碼)滴须。

@property(nonatomic) __weak WASkyLineRuntime *runtime; // @synthesize runtime=_runtime;
@property(nonatomic) __weak id <IWASkylineRuntime> skylineRuntime; // @synthesize skylineRuntime=_skylineRuntime;@property(retain, nonatomic) WAFlutterViewController *flutterVC; // @synthesize flutterVC=_flutterVC

目前實(shí)現(xiàn)IWASkylineRuntime接口的類(lèi)只有WASkyLineRuntime。

@interface WASkyLineRuntime : NSObject <IWASkylineRuntime>

分析:

skylineView在收到j(luò)s腳本后叽奥,從逆向來(lái)看并未交給其它OC類(lèi)來(lái)進(jìn)行處理扔水,個(gè)人認(rèn)為可能調(diào)用了C/C++代碼進(jìn)行解析(因?yàn)槟嫦驎簳r(shí)獲取不到C/C++方法)。C/C++解析后的結(jié)果再交給Flutter進(jìn)行渲染朝氓。

JSCore的預(yù)創(chuàng)建
微信啟動(dòng)到聊天頁(yè)面魔市,還未進(jìn)入小程序前,JSCoreService已經(jīng)被創(chuàng)建((WAJSCoreService *)0x129b53cd0)赵哲。

image.png

服務(wù)中心MMServiceCenter管理微信內(nèi)的所有服務(wù):

@interface MMServiceCenter : NSObject
{
NSMutableDictionary *m_dictService;

}

服務(wù)如下待德,其中包括WAPreloadAppTaskMgr,小程序預(yù)加載任務(wù)管理服務(wù)枫夺。

每個(gè)服務(wù)受到了MMServiceWrapper包裹将宪,并在MMServiceWrapper內(nèi)重寫(xiě)了消息轉(zhuǎn)發(fā),將消息轉(zhuǎn)發(fā)給WAPreloadAppTaskMgr橡庞。

{

    UpdateProfileMgr = "<UpdateProfileMgr: 0x281d4bcc0>";
    WCCommonService = "<WCCommonService: 0x280b2c9c0>";
    MultiTalkSessionMgr = "<MultiTalkSessionMgr: 0x286561d60>";
    WCTimelineTrashMgr = "<WCTimelineTrashMgr: 0x282631900>";
    WCLabsMgr = "<WCLabsMgr: 0x282cd46c0>";
    TrackRoomMgr = "<TrackRoomMgr: 0x28312eb50>";
    MMWebPrefetcherMgr = "<MMWebPrefetcherMgr: 0x282e71260>";
    WAConfigMgr = "<WAConfigMgr: 0x28390a940>";
    WCPayLogicMgr = "<WCPayLogicMgr: 0x12e637a00>";
    EmoticonInputRecommendMgr = "<EmoticonInputRecommendMgr: 0x28314ab50>";
    WXCTalkMgr = "<WXCTalkMgr: 0x283f6a760>";
    WCTextStateDB = "<WCTextStateDB: 0x282cdfa80>";
    MMClientCacheManager = "<MMClientCacheManager: 0x280adb510>";
    OpenApiMgr = "<OpenApiMgr: 0x11e4d59e0>";
    VoIPOrientationService = "<VoIPOrientationService: 0x281d97300>";
    MMMsgRemindReporter = "<MMMsgRemindReporter: 0x282c9ad00>";
    MMFICImageCache = "<MMFICImageCache: 0x2811038a0>";
    QuickReplyMsgMgr = "<QuickReplyMsgMgr: 0x282d499d0>";
    WAContactMgr = "<WAContactMgr: 0x282e51c70>";
    CdnComMgr = "<CdnComMgr: 0x2826340a0>";
    MMTextLayoutManager = "<MMTextLayoutManager: 0x283730b40>";
    WCSiriMgr = "<WCSiriMgr: 0x28656d3b0>";
    RebootWarningService = "<RebootWarningService: 0x28023e1a0>";
    MMNewSessionMgr = "<MMNewSessionMgr: 0x283d36f20>";
    WAPackageDownloadUrlFetcher = "<WAPackageDownloadUrlFetcher: 0x2865a75c0>";
    WCFinderVideoDownLoadMgr = "<WCFinderVideoDownLoadMgr: 0x283d43cf0>";
    WCTempChatMgr = "<WCTempChatMgr: 0x281c8a380>";
    WCFinderSyncReportMgr = "<WCFinderSyncReportMgr: 0x2865096d0>";
    WCGroupUndoneMgr = "<WCGroupUndoneMgr: 0x28657db30>";
    FTSFacade = "<FTSFacade: 0x283f26920>";
    WCAdvertiseLogMgr = "<WCAdvertiseLogMgr: 0x28650ab20>";
    VoIPRMRemoteService = "<VoIPRMRemoteService: 0x281d96e80>";
    MsgVideoPreloadMgr = "<MsgVideoPreloadMgr: 0x28004d5e0>";
    WASessionMgr = "<WASessionMgr: 0x2811ce2b0>";
    MMFinderLiveGiftResourceCDNMgr = "<MMFinderLiveGiftResourceCDNMgr: 0x282dabd40>";
    WCWebSearchService = "<WCWebSearchService: 0x282d32a00>";
    MiniTaskUIMgr = "<MiniTaskUIMgr: 0x282ca5740>";
    CheckMobileSIMType = "<CheckMobileSIMType: 0x2825d2fd0>";
    EventService = "<EventService: 0x281d1f6c0>";
    WeVisModelResMgr = "<WeVisModelResMgr: 0x28024f5c0>";
    TingManager = "<TingManager: 0x283731040>";
    KFContactMgr = "<KFContactMgr: 0x281c8a340>";
    MinimizeRecMgr = "<MinimizeRecMgr: 0x286583070>";
    WXCTalkPresentMgr = "<WXCTalkPresentMgr: 0x281c9ddc0>";
    WAPublicResCacheMgr = "<WAPublicResCacheMgr: 0x28344ba80>";
    WXTalkPresentMgr = "<WXTalkPresentMgr: 0x281012d90>";
    WCFinderReportService = "<WCFinderReportService: 0x286508f00>";
    WCDurationLogMgr = "<WCDurationLogMgr: 0x281cb8700>";
    MMShareExtMgr = "<MMShareExtMgr: 0x2825bce60>";
    FriendAsistSessionMgr = "<FriendAsistSessionMgr: 0x2811494a0>";
    AppDataMgr = "<AppDataMgr: 0x283147910>";
    VOIPMgr = "<VOIPMgr: 0x11eb8f000>";
    WXGRoamService = "<WXGRoamService: 0x282929e00>";
    MMWebViewKeepHolderMgr = "<MMWebViewKeepHolderMgr: 0x28372a080>";
    MainFrameGroupLiveReporter = "<MainFrameGroupLiveReporter: 0x28112b570>";
    EnterpriseBrandContactMgr = "<EnterpriseBrandContactMgr: 0x2800433c0>";
    WCCardPkgMgr = "<WCCardPkgMgr: 0x2833c2580>";
    CContactMgr = "<CContactMgr: 0x2831109a0>";
    MagicPkgCheckListener = "<MagicPkgCheckListener: 0x281d26080>";
    VoIPMSService = "<VoIPMSService: 0x286581540>";
    WCDeviceBrandMgr = "<WCDeviceBrandMgr: 0x28332bcc0>";
    NewSyncPluginMgr = "<NewSyncPluginMgr: 0x2811862b0>";
    WCDeviceAccountMgr = "<WCDeviceAccountMgr: 0x281148930>";
    MMOnlineDeviceStatusMgr = "<MMOnlineDeviceStatusMgr: 0x28260d2c0>";
    StoreEmotionBackupMgr = "<StoreEmotionBackupMgr: 0x2811a2ca0>";
    ExptService = "<ExptService: 0x28287b480>";
    SendMessageMgr = "<SendMessageMgr: 0x282cfd140>";
    EmoticonCameraRecoverMgr = "<EmoticonCameraRecoverMgr: 0x281d9d340>";
    MMWebDebugPkgMgr = "<MMWebDebugPkgMgr: 0x2811cbe70>";
    VoIPEventLogService = "<VoIPEventLogService: 0x2802329e0>";
    IDCHostMgr = "<IDCHostMgr: 0x281d97240>";
    WCFinderLongVideoService = "<WCFinderLongVideoService: 0x281d9ca00>";
    MiniGameVideoService = "<MiniGameVideoService: 0x281d24940>";
    HeartBeatMgr = "<HeartBeatMgr: 0x281d94100>";
    MMNewTipsMgr = "<MMNewTipsMgr: 0x281ceda40>";
    WeVisSettingsMgr = "<WeVisSettingsMgr: 0x282dbd180>";
    QQMailMgr = "<QQMailMgr: 0x286589e50>";
    VoiceReminderMgr = "<VoiceReminderMgr: 0x2811cca50>";
    WACacheVersionPreCheckerMgr = "<WACacheVersionPreCheckerMgr: 0x2865b0230>";
    MPPageMessageMgr = "<MPPageMessageMgr: 0x2811cc150>";
    WCJdBussinessMgr = "<WCJdBussinessMgr: 0x281cb2900>";
    GameCenterManager = "<GameCenterManager: 0x283a2d500>";
    StoreEmotionRecoverMgr = "<StoreEmotionRecoverMgr: 0x282cf5fe0>";
    MMLiveDBMgr = "<MMLiveDBMgr: 0x280912fa0>";
    WCFinderDataService = "<WCFinderDataService: 0x11e4dacd0>";
    BrandNewSessionMgr = "<BrandNewSessionMgr: 0x282cf7cc0>";
    MMSUserBehaviorMgr = "<MMSUserBehaviorMgr: 0x2801dce80>";
    AudioReceiver = "<AudioReceiver: 0x281d26200>";
    WADatabaseMgr = "<WADatabaseMgr: 0x283a64c00>";
    WCSessionFlowMgr = "<WCSessionFlowMgr: 0x283d255f0>";
    FavoritesMgr = "<FavoritesMgr: 0x2833692c0>";
    MinimizeTaskMgr = "<MinimizeTaskMgr: 0x283399a40>";
    MMEnterpriseBrandSessionMgr = "<MMEnterpriseBrandSessionMgr: 0x2811cc120>";
    CGroupMgr = "<CGroupMgr: 0x2828d1000>";
    WALoadPerformanceMgr = "<WALoadPerformanceMgr: 0x2862218c0>";
    MMGroupLiveDBMgr = "<MMGroupLiveDBMgr: 0x2817ea4c0>";
    MMPackageDownloadMgr = "<MMPackageDownloadMgr: 0x2825d33e0>";
    StrongNotificationMgr = "<StrongNotificationMgr: 0x282275b00>";
    MMFinderLiveRewardDBMgr = "<MMFinderLiveRewardDBMgr: 0x280913420>";
    WCHardLinkService = "<WCHardLinkService: 0x28122e2e0>";
    NewSyncService = "<NewSyncService: 0x282882a00>";
    BrandSessionMgr = "<BrandSessionMgr: 0x282cf7240>";
    MMFinderLiveMgr = "<MMFinderLiveMgr: 0x283735220>";
    WCWatchNativeMgr = "<WCWatchNativeMgr: 0x2822704e0>";
    BrandTLCanvasCardMgr = "<BrandTLCanvasCardMgr: 0x281248d80>";
    ChatBoxMgr = "<ChatBoxMgr: 0x281d893c0>";
    TemplateSessionMgr = "<TemplateSessionMgr: 0x282da9ea0>";
    BrandAttrMgr = "<BrandAttrMgr: 0x281d9f600>";
    SearchCgiConfigMgr = "<SearchCgiConfigMgr: 0x281d49c00>";
    WeVisionCameraLogger = "<WeVisionCameraLogger: 0x28024f6c0>";
    WCPaySynthesizeSpeechMgr = "<WCPaySynthesizeSpeechMgr: 0x2825d0410>";
    ImageAutoDownloadMgr = "<ImageAutoDownloadMgr: 0x286588140>";
    MPChannelMgr = "<MPChannelMgr: 0x28112a640>";
    FunctionMsgMgr = "<FunctionMsgMgr: 0x281c95940>";
    "WeChat.GOGService" = "<WeChat.GOGService: 0x281056850>";
    OCRTransMgr = "<OCRTransMgr: 0x2825d2bc0>";
    CMessageMgr = "<CMessageMgr: 0x12e420300>";
    WCAudioSessionLogic = "<WCAudioSessionLogic: 0x280769260>";
    WCRedEnvelopesControlMgr = "<WCRedEnvelopesControlMgr: 0x281138a80>";
    iAPMgr = "<iAPMgr: 0x28656a580>";
    MMHeavyUserMonitorMgr = "<MMHeavyUserMonitorMgr: 0x282d174f0>";
    WCSessionFlowMonitorService = "<WCSessionFlowMonitorService: 0x282d47330>";
    WXGBackupMgr = "<WXGBackupMgr: 0x283f0a840>";
    NotificationActionsMgr = "<NotificationActionsMgr: 0x286515c20>";
    DeviceILinkService = "<DeviceILinkService: 0x281d97ec0>";
    WCNewClickStatMgr = "<WCNewClickStatMgr: 0x283434ea0>";
    MMLiteAppDBMgr = "<MMLiteAppDBMgr: 0x2825f4820>";
    WACommonMarkMgr = "<WACommonMarkMgr: 0x280a3a010>";
    WCAutoSaveService = "<WCAutoSaveService: 0x280773a40>";
    TokenRegisterService = "<TokenRegisterService: 0x28650ac10>";
    MMWindowMgr = "<MMWindowMgr: 0x28105ba50>";
    PushLoginURLMgr = "<PushLoginURLMgr: 0x280ae4fc0>";
    GameCenterCommonDb = "<GameCenterCommonDb: 0x280b1fa50>";
    SystemAuthorizationCheck = "<SystemAuthorizationCheck: 0x2800aeda0>";
    DarkModeManager = "<DarkModeManager: 0x2817292c0>";
    MMAuthService = "<MMAuthService: 0x28227cb40>";
    VoIPFirstMessageStatisticsService = "<VoIPFirstMessageStatisticsService: 0x280adb870>";
    MMConfigMgr = "<MMConfigMgr: 0x282d46d80>";
    NewArrivalCountMgr = "<NewArrivalCountMgr: 0x2811cc720>";
    WCGPUCounterSamplingMgr = "<WCGPUCounterSamplingMgr: 0x282c9daa0>";
    DeviceModelConfigMgr = "<DeviceModelConfigMgr: 0x281158780>";
    WWKFSessionMgr = "<WWKFSessionMgr: 0x2811cda40>";
    WCTopicService = "<WCTopicService: 0x282c9b000>";
    MMGroupLiveMgr = "<MMGroupLiveMgr: 0x286578ff0>";
    MMConfSDKService = "<MMConfSDKService: 0x12e4adb90>";
    MMLiveReportEventMgr = "<MMLiveReportEventMgr: 0x281035e60>";
    AccountStorageMgr = "<AccountStorageMgr: 0x28227c780>";
    FingertipSearchMgr = "<FingertipSearchMgr: 0x282642a80>";
    MMHeadImageMgr = "<MMHeadImageMgr: 0x281d0a380>";
    EnterpriseSessionMgr = "<EnterpriseSessionMgr: 0x286589d10>";
    PresentHelperMgr = "<PresentHelperMgr: 0x280ac6700>";
    MainSessionMgr = "<MainSessionMgr: 0x28260ce10>";
    TextStateMgr = "<TextStateMgr: 0x283f457a0>";
    SolitaireMgr = "<SolitaireMgr: 0x2825d3250>";
    MonoServiceMsgMgr = "<MonoServiceMsgMgr: 0x2825f7930>";
    BannerToastMgr = "<BannerToastMgr: 0x2813d0940>";
    AutoSetRemarkMgr = "<AutoSetRemarkMgr: 0x286554eb0>";
    FavoritesOnTopLogic = "<FavoritesOnTopLogic: 0x2813d0480>";
    VoIPPMService = "<VoIPPMService: 0x282dbd880>";
    WePkgFacade = "<WePkgFacade: 0x283145130>";
    DataReportExposeMonitor = "<DataReportExposeMonitor: 0x28313eec0>";
    MuteBrandMgr = "<MuteBrandMgr: 0x2811bba20>";
    MsgSolitaireDB = "<MsgSolitaireDB: 0x281d77380>";
    MMDBMigrationUtil = "<MMDBMigrationUtil: 0x280aeb450>";
    IntelligentMsgImgConfigurationMgr = "<IntelligentMsgImgConfigurationMgr: 0x281cfd5c0>";
    EmoticonRecommendMgr = "<EmoticonRecommendMgr: 0x281d25280>";
    DataReportPageConfig = "<DataReportPageConfig: 0x281d4b440>";
    WCCalRqtDataMgr = "<WCCalRqtDataMgr: 0x280165b00>";
    WAProfileService = "<WAProfileService: 0x281e3f800>";
    WALaunchTimeAxisMgr = "<WALaunchTimeAxisMgr: 0x282913e00>";
    MMResPackageMgr = "<MMResPackageMgr: 0x281149470>";
    WCFileBrowseService = "<WCFileBrowseService: 0x2828cc880>";
    MMMusicPlayerMgr = "<MMMusicPlayerMgr: 0x28344a1c0>";
    VOIPMessageMgr = "<VOIPMessageMgr: 0x2811cc000>";
    EnterpriseMsgMgr = "<EnterpriseMsgMgr: 0x282927180>";
    WXGMigrationClientMgr = "<WXGMigrationClientMgr: 0x283d37260>";
    BrandFinderLiveMgr = "<BrandFinderLiveMgr: 0x2828c3e80>";
    WALaunchResourceFetcher = "<WALaunchResourceFetcher: 0x281248480>";
    EmoticonBackUpMgr = "<EmoticonBackUpMgr: 0x281d9d100>";
    "WeChat.Kara" = "<WeChat.Kara: 0x2817fccc0>";
    WABackgroundFetchMgr = "<WABackgroundFetchMgr: 0x2801dcf80>";
    WePkgStatReport = "<WePkgStatReport: 0x280add590>";
    WCTuringMgr = "<WCTuringMgr: 0x28111b750>";
    AUAudioDevice = "<AUAudioDevice: 0x12e4639b0>";
    WCOutFacade = "<WCOutFacade: 0x283151290>";
    MMLanguagePackageDownloadMgr = "<MMLanguagePackageDownloadMgr: 0x281155860>";
    GameLifeDataService = "<GameLifeDataService: 0x286588af0>";
    WAOpenEventSpeedStatMgr = "<WAOpenEventSpeedStatMgr: 0x283a69f00>";
    WCNearbyMgr = "<WCNearbyMgr: 0x281145530>";
    BrandTimelineMsgMgr = "<BrandTimelineMsgMgr: 0x12e60c8f0>";
    VideoRingAudioFileProducer = "<VideoRingAudioFileProducer: 0x281daec40>";
    "WeChat.PredownloadService" = "<WeChat.PredownloadService: 0x281035b00>";
    VOIPModelResMgr = "<VOIPModelResMgr: 0x280230f80>";
    SightFacade = "<SightFacade: 0x28391e940>";
    VoipCSUIManager = "<VoipCSUIManager: 0x281d74340>";
    MMLocationMgr = "<MMLocationMgr: 0x282894100>";
    MMWebCanvasPkgMgr = "<MMWebCanvasPkgMgr: 0x281e2e500>";
    WAAppItemManager = "<WAAppItemManager: 0x281c9d4c0>";
    VoIPMiniInAppService = "<VoIPMiniInAppService: 0x281d978c0>";
    MMDiskUsageMgr = "<MMDiskUsageMgr: 0x282ca4a20>";
    WAPreloadAppTaskMgr = "<WAPreloadAppTaskMgr: 0x281260ae0>";
    MainFrameHideSessionReporter = "<MainFrameHideSessionReporter: 0x28652f7a0>";
    MMLiteAppMgr = "<MMLiteAppMgr: 0x283430120>";
    WSRecommendMgr = "<WSRecommendMgr: 0x283f4c000>";
    KindaBizMgr = "<KindaBizMgr: 0x280a81b00>";
    WCSettingRedPointMgr = "<WCSettingRedPointMgr: 0x28113d590>";
    DataReportService = "<DataReportService: 0x282d46fb0>";
    WCUpdateBootsMgr = "<WCUpdateBootsMgr: 0x281d25d80>";
    WAAppTaskMgr = "<WAAppTaskMgr: 0x28342de60>";
    EdgeComputingMgr = "<EdgeComputingMgr: 0x282d3aca0>";
    MMLiveTaskMgr = "<MMLiveTaskMgr: 0x12e63ac30>";
    MMMyChatRoomSessionMgr = "<MMMyChatRoomSessionMgr: 0x281066c70>";
    VoipUIManager = "<VoipUIManager: 0x11e4ac4c0>";
    MMUserDataOperateDB = "<MMUserDataOperateDB: 0x280b45590>";
    WXCNetWorkEngine = "<WXCNetWorkEngine: 0x2813c9440>";
    BrandService = "<BrandService: 0x282d46530>";
    MultiTalkMgr = "<MultiTalkMgr: 0x12e46a0d0>";
    WALocalCacheMgr = "<WALocalCacheMgr: 0x281e4b980>";
    WCAccountControlMgr = "<WCAccountControlMgr: 0x282d3f480>";
    WXGMigrationMgr = "<WXGMigrationMgr: 0x28650aad0>";
    WAUpdatableMsgMgr = "<WAUpdatableMsgMgr: 0x2811cca80>";
    MMLiveResUpdateMgr = "<MMLiveResUpdateMgr: 0x280913450>";
    WCMomentsMediaPredictor = "<WCMomentsMediaPredictor: 0x280b217a0>";
    WCCoinMgr = "<WCCoinMgr: 0x2813b7f40>";
    TrackPresentMgr = "<TrackPresentMgr: 0x28103cc30>";
    MonoServiceMgr = "<MonoServiceMgr: 0x286580fa0>";
    WCPreparedUpdateMgr = "<WCPreparedUpdateMgr: 0x281035a10>";
    AudioSender = "<AudioSender: 0x282c9c9c0>";
    FavoritesFileMgr = "<FavoritesFileMgr: 0x281782a30>";
    MMWebJsWAPkgMgr = "<MMWebJsWAPkgMgr: 0x2812a1c50>";
    CNetworkStatusMgr = "<CNetworkStatusMgr: 0x282882980>";
    BypSyncService = "<BypSyncService: 0x282cecfc0>";
    WACampusVoipMsgMgr = "<WACampusVoipMsgMgr: 0x2825f6530>";
    MainFrameCellDataManager = "<MainFrameCellDataManager: 0x280acb330>";
    WCCanvasDownloadMgr = "<WCCanvasDownloadMgr: 0x28004f8a0>";
    WCFacade = "<WCFacade: 0x11e79dbc0>";
    WCMallLogicMgr = "<WCMallLogicMgr: 0x281d25b40>";
    PublicWifiManager = "<PublicWifiManager: 0x2833118c0>";
    CEmoticonMgr = "<CEmoticonMgr: 0x2865399a0>";
    WCFinderMsgSessionMgr = "<WCFinderMsgSessionMgr: 0x282e374f0>";
    NewABTestLogic = "<NewABTestLogic: 0x281cc5d00>";
    FavWebCacheMgr = "<FavWebCacheMgr: 0x283734aa0>";
    WAPrefetchMgr = "<WAPrefetchMgr: 0x282e32990>";
    MMAddressBookMgr = "<MMAddressBookMgr: 0x282cb9a40>";
    DataReportMultiEventMonitor = "<DataReportMultiEventMonitor: 0x280a74b70>";
    MsgUploadRetryMgr = "<MsgUploadRetryMgr: 0x281197bd0>";
    WCPayReporter = "<WCPayReporter: 0x286582d50>";
    WCSessionDataReporter = "<WCSessionDataReporter: 0x28342ee20>";
    WCShareCardMgr = "<WCShareCardMgr: 0x28292f900>";
    MMLiveMgr = "<MMLiveMgr: 0x281da0fc0>";
    MainSessionReporter = "<MainSessionReporter: 0x282ca40c0>";
    IlinkAppContextService = "<IlinkAppContextService: 0x281d95a00>";
    VideoRingDataService = "<VideoRingDataService: 0x282d3dff0>";
    EmoticonPackageMgr = "<EmoticonPackageMgr: 0x28653ab20>";
    WCFinderSyncManager = "<WCFinderSyncManager: 0x281d10b00>";
    OnlineClientMgr = "<OnlineClientMgr: 0x28343f060>";
    VoIPTerminationService = "<VoIPTerminationService: 0x281051320>";
    WATemplateMsgManager = "<WATemplateMsgManager: 0x282286ca0>";
    WABluetoothDeviceMonitorMgr = "<WABluetoothDeviceMonitorMgr: 0x286580eb0>";
    ScanQRCodeResultsMgr = "<ScanQRCodeResultsMgr: 0x281d76f00>";
    VoIPAPNSPushSyncService = "<VoIPAPNSPushSyncService: 0x281053c60>";
    WAPreDownloadMgr = "<WAPreDownloadMgr: 0x282e70000>";
    EnterpriseContactMgr = "<EnterpriseContactMgr: 0x282933b80>";
    WeVisModelMgr = "<WeVisModelMgr: 0x2865877f0>";
    MMLimitedModeMgr = "<MMLimitedModeMgr: 0x282241560>";
    NewABTestMgr = "<NewABTestMgr: 0x280a3b0f0>";
    WAAdapterMgr = "<WAAdapterMgr: 0x280a3a3a0>";
    MMUserDataOperateMgr = "<MMUserDataOperateMgr: 0x281daea80>";
    MMSessionRefreshService = "<MMSessionRefreshService: 0x281d0b4c0>";
    VoIPRMLocalService = "<VoIPRMLocalService: 0x281d96f80>";
}

WAPreloadAppTaskMgr如下较坛,里面包含一個(gè)WAPreloadAppTask小程序加載任務(wù)。

@interface WAPreloadAppTaskMgr : MMUserService <MMServiceProtocol>
{
WAPreloadAppTask *_preloadTask;
}

預(yù)加載任務(wù)會(huì)預(yù)創(chuàng)建WAJSCoreService扒最。

@interface WAPreloadAppTask : NSObject
{
WAApptaskPublicResLogic *_publicResLogic;
WAWebViewController *_webView;
WAJSCoreService *_appService;
}

調(diào)用棧如下丑勤,微信在啟動(dòng)后通過(guò)performSelector:afterDelay:延遲調(diào)用,預(yù)創(chuàng)建小程序service吧趣。

image.png

當(dāng)微信進(jìn)入最近小程序頁(yè)面法竞,微信又預(yù)創(chuàng)建了小游戲的service耙厚。

<WAJSGameService: 0x13769bea0>

image.png
WAFlutterMgr

WAFlutterMgr負(fù)責(zé)管理flutter,包含唯一個(gè)flutter引擎(FlutterEngine)岔霸,及多個(gè)skylineRuntime薛躬。

@interface WAFlutterMgr : MMRootService <MMServiceProtocol>

@property(retain, nonatomic) NSMutableArray *skylineRuntimeArr; // @synthesize skylineRuntimeArr=_skylineRuntimeArr;
@property(retain, nonatomic) FlutterEngine *firstEngine; // @synthesize firstEngine=_firstEngine;
@property(retain, nonatomic) FlutterEngineGroup *engineGroup; // @synthesize engineGroup=_engineGroup;

- (void)removeSkylineRuntime:(id)arg1;
- (void)addSkylineRuntime:(id)arg1;
- (id)makeSkylineEngine:(id)arg1;

啟動(dòng)時(shí),flutter引擎會(huì)創(chuàng)建一系列flutter管道(FlutterMethodChannel)秉剑,

包括flutter/platform_views,flutter/navigation,

fllutter/platform,

flutter/textinput,

flutter/localization等

image.png

補(bǔ)充:

SkylineGlobal
SkylineRuntimeCore
workletModule
SkylineGlobal.runtime.registerJsValue
SkylineGlobal.workletModule.stopMappers
onSkylineGlobalReady

以上綁定的關(guān)鍵對(duì)象或方法在逆向OC代碼都找不到對(duì)應(yīng)的泛豪,可能對(duì)應(yīng)的實(shí)現(xiàn)在C++中,就像JSI侦鹏。

JSCore提供封裝C api后的面向?qū)ο驤SExport方式诡曙,js對(duì)象與oc對(duì)象綁定,但這種方式效率比較低略水。

目前小游戲是采用JSCore C api + runtime模擬成JSExport的綁定對(duì)象方式价卤,這種方式可以利用C api的效率更高,又可以利用對(duì)象綁定的編碼便捷渊涝。

我估計(jì)微信可能采用的是類(lèi)似JSI方式慎璧,綁定的對(duì)象在C++中處理,因此逆向找不到相關(guān)類(lèi)(逆向只看的到OC)跨释。

JSI相關(guān)資料:

https://blog.csdn.net/ImagineCode/article/details/125148600

https://blog.csdn.net/m0_49508485/article/details/122622251

https://blog.csdn.net/YoungOne2333/article/details/122962607

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胸私,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳖谈,更是在濱河造成了極大的恐慌岁疼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缆娃,死亡現(xiàn)場(chǎng)離奇詭異捷绒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贯要,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)暖侨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崇渗,你說(shuō)我怎么就攤上這事字逗。” “怎么了宅广?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵葫掉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乘碑,道長(zhǎng)挖息,這世上最難降的妖魔是什么金拒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任兽肤,我火速辦了婚禮套腹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘资铡。我一直安慰自己电禀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布笤休。 她就那樣靜靜地躺著尖飞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪店雅。 梳的紋絲不亂的頭發(fā)上政基,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音闹啦,去河邊找鬼沮明。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窍奋,可吹牛的內(nèi)容都是我干的荐健。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琳袄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼江场!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窖逗,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤址否,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滑负,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體在张,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年矮慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帮匾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痴鳄,死狀恐怖瘟斜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痪寻,我是刑警寧澤螺句,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站橡类,受9級(jí)特大地震影響蛇尚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顾画,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一取劫、第九天 我趴在偏房一處隱蔽的房頂上張望匆笤。 院中可真熱鬧,春花似錦谱邪、人聲如沸炮捧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咆课。三九已至,卻和暖如春扯俱,著一層夾襖步出監(jiān)牢的瞬間书蚪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工迅栅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留善炫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓库继,卻偏偏與公主長(zhǎng)得像箩艺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宪萄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容