RN中的系统日志

初始化流程:

介绍CxxBridge

CxxBridge是个对象,他拥有:

  • RCTModuleData(Array)这是moduleClass的对象和instance

  • RCTMessageThread 这里面封装了runAsync、runSync、runOnQueue等同步、异步、跨线程调用等方法。

  • Instance 这个是一个关键 loadJS、 native->js、 js->native 都是它

所以所初始化CxxBridge的时候,大概做了什么?

  • 把所有遵循了RCTBridgeModule协议的nativeModule都封装成RCTModuleData,另外js的所有变量及block也都被封装成nativeModule,怎么把js的东西初始化成这样的?
jscore->jscontext
  • 初始化一个NSThread 并且用NSThread的runtime初始化一个RCTMessageThread,用RCTMessageThread对象实现调用,怎么调用:
void RCTMessageThread::runAsync(std::function<void()> func) {
  CFRunLoopPerformBlock(m_cfRunLoop, kCFRunLoopCommonModes, ^{ func(); });
  CFRunLoopWakeUp(m_cfRunLoop);
}
  • 初始化Instance 用来初始化js代码、注册"RAM" bundle、js<->native,怎么调?
找到nativeModule就可以啦
屏幕快照 2019-04-10 下午5.53.30.png

下面是加载流程,代码开始也是在cxx的start方法中




如果不是RAMBundle,有可能是String、BCBundle比如我们的工程就是String,我们的资源包是

总结:初始化桥就是:创建js线程、下载js代码、通过js代码生成JSIExecutor、初始化nativeModule的总和

RCTPerformanceLogger(线上或者dev都存在)

markStartForTag和markStopForTag

mark:此日志 在DEV状态下也会存储于RCTProfileAddEvent中

如何存储

  • 调用- (void)markStopForTag:(RCTPLTag)tag 最终存储于_data中

都存储了那些、什么时候存储

存储了那些?

typedef NS_ENUM(NSUInteger, RCTPLTag) {
  RCTPLScriptDownload,
  RCTPLScriptExecution,
  RCTPLRAMBundleLoad,
  RCTPLRAMStartupCodeSize,
  RCTPLRAMStartupNativeRequires,
  RCTPLRAMStartupNativeRequiresCount,
  RCTPLRAMNativeRequires,
  RCTPLRAMNativeRequiresCount,
  RCTPLNativeModuleInit,
  RCTPLNativeModuleMainThread,
  RCTPLNativeModulePrepareConfig,
  RCTPLNativeModuleInjectConfig,
  RCTPLNativeModuleMainThreadUsesCount,
  RCTPLJSCWrapperOpenLibrary,
  RCTPLJSCExecutorSetup,
  RCTPLBridgeStartup,
  RCTPLTTI,
  RCTPLBundleSize,
  RCTPLSize
};

何时存储、存储数据类型、存储顺序 (CACurrentMediaTime() * 1000)

  • RCTPLScriptDownload,

mark:download jS资源
RCTPLScriptDownload_start(timestamp) order:11
RCTPLScriptDownload_end(timestamp) order:12

  • RCTPLScriptExecution,

mark:Download完成之后执行js时发出
RCTPLScriptExecution_start(timestamp) order:15
RCTPLScriptExecution_end(timestamp) order:16

  • RCTPLRAMBundleLoad,

mark:Download完成之后执行js时发出,比RCTPLScriptExecution早,但是只有当jssource是RAMBundle格式的时候才发
RCTPLRAMBundleLoad_start(timestamp) order:null
RCTPLRAMBundleLoad_end(timestamp) order:null

  • RCTPLRAMStartupCodeSize,

mark:RCTPLRAMBundleLoad之后发,也就是说同样jssource是RAMBundle格式的时候才发
RCTPLRAMBundleLoad_start(0) order:null
RCTPLRAMBundleLoad_end(int——size) order:null

  • RCTPLRAMStartupNativeRequires,

mark:未知
RCTPLRAMStartupNativeRequires_start(0) order:null
RCTPLRAMStartupNativeRequires_end(0) order:null

  • RCTPLRAMStartupNativeRequiresCount,

mark:未知
RCTPLRAMStartupNativeRequiresCount_start(0) order:null
RCTPLRAMStartupNativeRequiresCount_end(0) order:null

  • RCTPLRAMNativeRequires,

mark:未知
RCTPLRAMNativeRequirest_start(0) order:null
RCTPLRAMNativeRequires_end(0) order:null

  • RCTPLRAMNativeRequiresCount,

mark:未知
RCTPLRAMNativeRequiresCount_start(0) order:null
RCTPLRAMNativeRequiresCount_end(0) order:null

  • RCTPLNativeModuleInit,

mark:初始化NativeModule
RCTPLNativeModuleInit_start(timestamp) order:3
RCTPLNativeModuleInit_end(timestamp) order:10

  • RCTPLNativeModuleMainThread,

mark:主线程初始化NativeModule
RCTPLNativeModuleMainThread_start(0) order:4
RCTPLNativeModuleMainThread_end(timestamp差值n个在主线程初始化的Module时间和) order:5

  • RCTPLNativeModulePrepareConfig,

mark:为初始化NativeModule做准备,在初始化Instance的时候
RCTPLNativeModulePrepareConfig_start(timestamp) order:8
RCTPLNativeModulePrepareConfig_end(timestamp) order:9

  • RCTPLNativeModuleInjectConfig,

mark:未知
RCTPLNativeModuleInjectConfig_start(0) order:null
RCTPLNativeModuleInjectConfig_end(0) order:null

  • RCTPLNativeModuleMainThreadUsesCount,

mark:主线程初始化Module完成后统计在主线程初始化的Module的个数
RCTPLNativeModuleMainThreadUsesCount_start(0) order:6
RCTPLNativeModuleMainThreadUsesCount_end(int) order:7

  • RCTPLJSCWrapperOpenLibrary,

mark:未知
RCTPLJSCWrapperOpenLibrary_start(0) order:null
RCTPLJSCWrapperOpenLibrary_end(0) order:null

  • RCTPLJSCExecutorSetup,

mark:未知
RCTPLJSCExecutorSetup_start(0) order:null
RCTPLJSCExecutorSetup_end(0) order:null

  • RCTPLBridgeStartup,

mark:初始化桥,最最早的,一直到桥初始化结束
RCTPLBridgeStartup_start(timestamp) order:1
RCTPLBridgeStartup_end(timestamp) order:17

  • RCTPLTTI,

mark:从初始化桥到rootView被渲染出来
RCTPLTTI_start(timestamp) order:2(和RCTPLBridgeStartup_start一样)
RCTPLTTI_end(timestamp) order: 18

  • RCTPLBundleSize,

mark:记录下载下来的js的字符长度,下载结束之后就存起来了
RCTPLBundleSize_start(0) order:13
RCTPLBundleSize_end(int) order:14

  • RCTPLSize

mark:保留字段,目的是获取上面一共多少个日志

打开方式:QRN关闭了

RCTProfileAddEvent

以name为维度

  • "VSYNC"
RCTProfileDisplayLink = [CADisplayLink displayLinkWithTarget:[RCTProfile class]
                                                      selector:@selector(vsync:)];
  [RCTProfileDisplayLink addToRunLoop:[NSRunLoop mainRunLoop]
                              forMode:NSRunLoopCommonModes];

与屏幕帧率同步发出VSYNC,使用RCTProfileImmediateEvent记录时间戳,可用来检测屏幕卡顿。

  • "flow"

调用RCTProfileBeginFlowEvent、RCTProfileEndFlowEvent会添加,所以"flow"以两个一组的形式出现:他们有相同的id,ph的值(s标识Start f标识Finish)

{
        "name": "flow",
        "id": 129,
        "ts": 2959452.9999885708,
        "cat": "flow",
        "ph": "s",
        "tid": "com.facebook.react.JavaScript",
        "pid": 14689
    }, {
        "name": "flow",
        "id": 129,
        "ts": 2959476.8750248477,
        "cat": "flow",
        "ph": "f",
        "tid": "com.facebook.react.JavaScript",
        "pid": 14689
    }
> "flow"(调用流程)记录的时机如下:jscall 或者 callJSCallback 也或者 loadApplicationScript的时候RCTProfileBeginFlowEvent在放jsThread放入一个命令的时间戳、RCTProfileEndFlowEvent代表这个命令开始执行的时间戳,所以当这个间距时间长了,说明jsThread中有耗时操作,影响了其他任务的执行
  • "thread_sort_index"

固定5个分别是JS async(下载js资源)、RCTPerformanceLogger(com.facebook.react.Profiler 写日志的)、com.facebook.react.JavaScript (js线程)、com.facebook.react.ShadowQueue(RCTShadowView创建的地方)、main

{
      "ph" : "M",
      "tid" : "JS async",
      "args" : {
        "sort_index" : -1000
      },
      "name" : "thread_sort_index",
      "pid" : 14290
    },

args中的sort_index表示这5个线程id pid NSProcess的进程id

  • "RCTProfileHookModules"

只有一个,记录所有 modelHook打开的时间差,开启之后会产生js<-->native的调用链记录

  • JS Thread Tick

RCTDisplayLink 中CADisplayLink的轮训时间,使用RCTProfileImmediateEvent记录时间戳,可以通过来比对出js线程是否卡顿了

打开方式:rn->RCTDevSettings->setProfilingEnabled

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,107评论 1 32
  • 一. Java基础部分.................................................
    wy_sure阅读 3,812评论 0 11
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,327评论 0 9
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,419评论 1 14
  • 昨日“小雪”过后,今日晨曦略过一抹寒光,多少人冻掉了耳朵。 望着窗外,远处龙首山顶的皑皑白雪,...
    宇航员ht阅读 748评论 3 12