You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by GitBox <gi...@apache.org> on 2018/11/29 08:09:32 UTC

[GitHub] cxfeng1 closed pull request #1751: [WEEX-661][iOS] new feature for analyze interaction info (dev_tool)

cxfeng1 closed pull request #1751: [WEEX-661][iOS] new feature for analyze interaction info (dev_tool)
URL: https://github.com/apache/incubator-weex/pull/1751
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
index 1e05c2c5bb..90b7fd147c 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
@@ -202,6 +202,7 @@ namespace WeexCore
 + (void)registerComponentAffineType:(NSString *)type asType:(NSString *)baseType;
 
 + (BOOL)isComponentAffineType:(NSString *)type asType:(NSString *)baseType;
++ (void)registerCoreEnv:(NSString*)key withValue:(NSString*)value;
 
 @end
 
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index 78d4b4d607..a0ad6debce 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -1217,4 +1217,9 @@ + (void)callUpdateFinish:(NSString*)pageId
     WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->UpdateFinish([pageId UTF8String] ?: "", nullptr, 0, nullptr, 0);
 }
 
++ (void)registerCoreEnv:(NSString*)key withValue:(NSString*)value
+{
+    WeexCore::WeexCoreManager::Instance()->getPlatformBridge()->core_side()->RegisterCoreEnv([key UTF8String]?:"", [value UTF8String]?:"");
+}
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
index 0e7a48d529..dddf2795fc 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
@@ -38,6 +38,7 @@
 #import "WXAppMonitorProtocol.h"
 #import "JSContext+Weex.h"
 #import "WXCoreBridge.h"
+#import "WXAnalyzerCenter.h"
 
 #import <dlfcn.h>
 
@@ -163,8 +164,9 @@ - (void)registerCallAddElement:(WXJSCallAddElement)callAddElement
         NSDictionary *componentData = [element toDictionary];
         NSString *parentRef = [ref toString];
         NSInteger insertIndex = [[index toNumber] integerValue];
-        WXLogDebug(@"callAddElement...%@, %@, %@, %ld", instanceIdString, parentRef, componentData, (long)insertIndex);
-        
+        if (WXAnalyzerCenter.isInteractionLogOpen) {
+            WXLogDebug(@"wxInteractionAnalyzer : [jsengin][addElementStart],%@,%@",instanceIdString,componentData[@"ref"]);
+        }
         return [JSValue valueWithInt32:(int32_t)callAddElement(instanceIdString, parentRef, componentData, insertIndex) inContext:[JSContext currentContext]];
     };
     
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
index 882784977b..6877a9a7a6 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m
@@ -27,6 +27,7 @@
 #import "WXSDKInstance_private.h"
 #import "WXHandlerFactory.h"
 #import "WXValidateProtocol.h"
+#import "WXAnalyzerCenter.h"
 
 @implementation WXModuleMethod
 
@@ -46,6 +47,9 @@ - (instancetype)initWithModuleName:(NSString *)moduleName
 
 - (NSInvocation *)invoke
 {
+    if ([WXAnalyzerCenter isInteractionLogOpen]) {
+        WXLogDebug(@"wxInteractionAnalyzer : [client][callnativemodulestart],%@,%@,%@",self.instance.instanceId,self.moduleName,self.methodName);
+    }
     if (self.instance.needValidate) {
         id<WXValidateProtocol> validateHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXValidateProtocol)];
         if (validateHandler) {
@@ -103,6 +107,9 @@ - (NSInvocation *)invoke
     
     if (isSync) {
         [invocation invoke];
+        if ([WXAnalyzerCenter isInteractionLogOpen]) {
+            WXLogDebug(@"wxInteractionAnalyzer : [client][callnativemoduleEnd],%@,%@,%@",self.instance.instanceId,self.moduleName,self.methodName);
+        }
         return invocation;
     } else {
         [self _dispatchInvocation:invocation moduleInstance:moduleInstance];
@@ -130,6 +137,9 @@ - (void)_dispatchInvocation:(NSInvocation *)invocation moduleInstance:(id<WXModu
     // dispatch to user specified queue or thread, default is main thread
     dispatch_block_t dispatchBlock = ^ (){
         [invocation invoke];
+        if ([WXAnalyzerCenter isInteractionLogOpen]) {
+            WXLogDebug(@"wxInteractionAnalyzer : [client][callnativemoduleEnd],%@,%@,%@",self.instance.instanceId,self.moduleName,self.methodName);
+        }
     };
     
     NSThread *targetThread = nil;
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
index 434ef36dad..53f2157065 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
@@ -41,6 +41,7 @@
 #import "WXComponent+Layout.h"
 #import "WXCoreBridge.h"
 #import "WXComponent_performance.h"
+#import "WXAnalyzerCenter.h"
 
 static NSThread *WXComponentThread;
 
@@ -272,6 +273,10 @@ - (void)addComponent:(NSString*)ref
         WXLogWarning(@"addComponent,superRef from js never exit ! check JS action, supRef:%@", parentRef);
         return;
     }
+    if([WXAnalyzerCenter isInteractionLogOpen]){
+         WXLogDebug(@"wxInteractionAnalyzer: [client][addElementStart]%@,%@,%@",supercomponent.weexInstance.instanceId,type,ref);
+    }
+    
     supercomponent.weexInstance.apmInstance.hasAddView = YES;
     
     WXComponent *component = [self _buildComponent:ref type:type supercomponent:supercomponent styles:styles attributes:attributes events:events renderObject:renderObject];
@@ -314,6 +319,7 @@ - (void)addComponent:(NSString*)ref
     }
     
     [self recordMaximumVirtualDom:component];
+    [component.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_COMPONENT_NUM curMaxValue:[_indexDict count]];
     
     if (!component->_isTemplate) {
         __weak typeof(self) weakSelf = self;
@@ -328,6 +334,9 @@ - (void)addComponent:(NSString*)ref
             [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:type phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
         }];
     }
+    if([WXAnalyzerCenter isInteractionLogOpen]){
+        WXLogDebug(@"wxInteractionAnalyzer: [client][addElementEnd]%@,%@,%@",supercomponent.weexInstance.instanceId,type,ref);
+    }
 }
 
 - (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSInteger)index
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 2baee251e6..e455650dcc 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -191,7 +191,7 @@ - (void)setFrame:(CGRect)frame
         CGFloat screenHeight =  [[UIScreen mainScreen] bounds].size.height;
         if (screenHeight>0) {
             CGFloat pageRatio = frame.size.height/screenHeight *100;
-            self.apmInstance.wxPageRatio = pageRatio>100?100:pageRatio;
+            self.apmInstance.pageRatio = pageRatio>100?100:pageRatio;
         }
         WXPerformBlockOnMainThread(^{
             if (_rootView) {
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
index a8002b9fab..db33597d31 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
@@ -27,6 +27,7 @@
 #import "WXCellComponent.h"
 #import "WXImageComponent.h"
 #import "WXUtility.h"
+#import "WXAnalyzerCenter+Transfer.h"
 
 @interface WXPerformance()
 @property (nonatomic, assign) bool hasRecordFsRenderTimeByPosition;
@@ -112,21 +113,16 @@ - (void) _handleRenderTime:(WXComponent*)targetComponent withModifyTime:(double)
         return;
     }
     
-#ifdef DEBUG
-    WXLogDebug(@"onElementChange _-> size, count :%f,inScreen:%d, type:%@,attr:%@",
-          self.interactionAddCountRecord,
-          inScreen,
-          targetComponent.type,
-          targetComponent.attributes
-          );
-#endif
     if (!targetComponent.weexInstance.apmInstance.hasRecordFirstInterationView) {
         targetComponent.weexInstance.apmInstance.hasRecordFirstInterationView = YES;
         [targetComponent.weexInstance.apmInstance onStage:KEY_PAGE_STAGES_FIRST_INTERACTION_VIEW];
     }
+    [WXAnalyzerCenter transferInteractionInfo:targetComponent];
     [targetComponent.weexInstance.apmInstance onStage:KEY_PAGE_STAGES_INTERACTION];
     self.interactionLimitAddOpCount++;
     self.interactionAddCount = self.interactionAddCountRecord;
+    [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_I_SCREEN_VIEW_COUNT curMaxValue:self.interactionLimitAddOpCount];
+    [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_I_ALL_VIEW_COUNT curMaxValue:self.interactionAddCount];
     self.interactionTime = self.interactionTime < diff ? diff :self.interactionTime;
 }
 
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter+Transfer.h b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter+Transfer.h
index c32ba6e22d..65b0fbe1fa 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter+Transfer.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter+Transfer.h
@@ -24,10 +24,8 @@
 
 @interface WXAnalyzerCenter (Transfer)
 
-+(void) transDataOnState:(CommitState) timeState withInstaneId:(NSString *)instanceId data:(NSDictionary *)data ;
-
++ (void) transferPerformance:(NSString*)instanceId withType:(NSString*) type andKey:(NSString*) key andValue:(id)value;
++ (void) transferInteractionInfo:(WXComponent*)targetComponent;
 + (void) transErrorInfo:(WXJSExceptionInfo *)errorInfo;
 
-+ (BOOL) needTransfer;
-
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
index 1e496a8b10..4b5a61b50f 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
@@ -31,4 +31,7 @@
 +(void) setOpen:(BOOL)isOpen;
 +(BOOL) isOpen;
 
++(void) switchInteractionLog:(BOOL) isOpen;
++(BOOL) isInteractionLogOpen;
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.m b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.m
index 3e900964bf..186f7749b4 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.m
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.m
@@ -27,8 +27,18 @@
 #import "WXAnalyzerCenter.h"
 #import "WXAnalyzerCenter+Transfer.h"
 #import "WXUtility.h"
+#import "WXSDKInstance_performance.h"
+#import "WXCoreBridge.h"
+#import "WXBridgeManager.h"
+#import "WXBridgeContext.h"
+
+
+#define MODULE_WX_APM  @"wxapm"
 
 @interface WXAnalyzerCenter ()
+{
+    BOOL _interactionLogSwitch;
+}
 @property (nonatomic, strong) NSMutableArray<WXAnalyzerProtocol> *analyzerList;
 @property (nonatomic, assign) BOOL anzlyzerSwitch;
 @end
@@ -43,173 +53,105 @@ + (instancetype) sharedInstance{
     dispatch_once(&once, ^{
         instance = [[WXAnalyzerCenter alloc] init];
         instance.analyzerList= [NSMutableArray<WXAnalyzerProtocol> new];
-        instance.anzlyzerSwitch = FALSE;
+        instance.anzlyzerSwitch = NO;
     });
 
     return instance;
 }
 
-+ (void) transDataOnState:(CommitState) timeState withInstaneId:(NSString *)instanceId data:(NSDictionary *)data
++ (void) transferPerformance:(NSString*)instanceId withType:(NSString*) type andKey:(NSString*) key andValue:(id)value
 {
     if (![self isOpen]) {
         return;
     }
-    if (!instanceId) {
-        return;
-    }
-    WXSDKInstance * instance = [WXSDKManager instanceForID:instanceId];
-    if (!instance) {
-        return;
-    }
 
-    NSDictionary *commitDimenKeys = [self getKeys:TRUE];
-    NSDictionary *commitMeasureKeys = [self getKeys:FALSE];
-    for(id key in data){
-       if([self checkDataWithSate:timeState checkKey:key limitDic:commitMeasureKeys]){
-           [self _transMeasureValue:instance key:key withVal:[data valueForKey:key]];
-       }else if([self checkDataWithSate:timeState checkKey:key limitDic:commitDimenKeys]){
-           [self _transDimenValue:instance key:key withVal:[data valueForKey:key]];
-       }else{
-           WXLogDebug(@"WXAnalyzerDataTransfer -> unKnowPerformanceKey :%@",key);
-       }
+    if ([self isInteractionLogOpen] && [type isEqualToString:@"stage"]) {
+        WXLogDebug(@"wxInteractionAnalyzer : [client][stage],%@,%@,%@",instanceId,key,value);
     }
-}
 
-+(BOOL) checkDataWithSate:(CommitState)timeState checkKey:(id)key limitDic:(NSDictionary *)limitDic
-{
-    if (!key || ![key isKindOfClass:[NSString class]]) {
-        return FALSE;
-    }
-   
-    if (![limitDic objectForKey:key]) {
-        return FALSE;
+    NSMutableArray* analyzerList = [self getAnalyzerList];
+    if (nil == analyzerList) {
+        return;
     }
-    CommitState limitSate = [[limitDic objectForKey:key] intValue];
-    return timeState == limitSate;
-}
-
-+ (NSDictionary *) getKeys:(BOOL) measureOrDimen
-{
-    static NSDictionary *commitDimenKeys;
-    static NSDictionary *commitMeasureKeys;
-    static dispatch_once_t onceToken;
     
-    dispatch_once(&onceToken, ^{
-        // non-standard perf commit names, remove this hopefully.
-        
-        commitDimenKeys =@{
-                           BIZTYPE:             [NSNumber numberWithInt:DebugAfterFSFinish],
-                           PAGENAME:            [NSNumber numberWithInt:DebugAfterRequest],
-                           WXSDKVERSION:        [NSNumber numberWithInt:DebugAfterRequest],
-                           JSLIBVERSION:        [NSNumber numberWithInt:DebugAfterRequest],
-                           JSLIBSIZE:           [NSNumber numberWithInt:DebugAfterRequest],
-                           WXREQUESTTYPE:       [NSNumber numberWithInt:DebugAfterRequest],
-                           WXCONNECTIONTYPE:    [NSNumber numberWithInt:DebugAfterRequest],
-                           NETWORKTYPE:         [NSNumber numberWithInt:DebugAfterRequest],
-                           CACHETYPE:           [NSNumber numberWithInt:DebugAfterRequest],
-                           WXCUSTOMMONITORINFO: [NSNumber numberWithInt:DebugAfterRequest]
-        };
-        commitMeasureKeys =@{
-                             SDKINITTIME:                   [NSNumber numberWithInt:DebugAfterFSFinish],
-                             SDKINITINVOKETIME:             [NSNumber numberWithInt:DebugAfterFSFinish],
-                             JSLIBINITTIME:                 [NSNumber numberWithInt:DebugAfterFSFinish],
-                             JSTEMPLATESIZE:                [NSNumber numberWithInt:DebugAfterRequest],
-                             NETWORKTIME:                   [NSNumber numberWithInt:DebugAfterRequest],
-                             COMMUNICATETIME:               [NSNumber numberWithInt:DebugAfterExist],
-                             SCREENRENDERTIME:              [NSNumber numberWithInt:DebugAfterExist],
-                             TOTALTIME:                     [NSNumber numberWithInt:DebugAfterExist],
-                             FIRSETSCREENJSFEXECUTETIME:    [NSNumber numberWithInt:DebugAfterFSFinish],
-                             CALLCREATEINSTANCETIME:        [NSNumber numberWithInt:DebugAfterFSFinish],
-                             COMMUNICATETOTALTIME:          [NSNumber numberWithInt:DebugAfterExist],
-                             FSRENDERTIME:                  [NSNumber numberWithInt:DebugAfterExist],
-                             CACHEPROCESSTIME:              [NSNumber numberWithInt:DebugAfterRequest],
-                             CACHERATIO:                    [NSNumber numberWithInt:DebugAfterRequest],
-                             M_FS_CALL_JS_TIME:             [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_FS_CALL_JS_NUM:              [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_FS_CALL_NATIVE_TIME:         [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_FS_CALL_NATIVE_NUM:          [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_FS_CALL_EVENT_NUM:           [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_CELL_EXCEED_NUM:             [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_MAX_DEEP_VDOM:               [NSNumber numberWithInt:DebugAfterExist],
-                             M_IMG_WRONG_SIZE_NUM:          [NSNumber numberWithInt:DebugAfterExist],
-                             M_TIMER_NUM:                   [NSNumber numberWithInt:DebugAfterFSFinish],
-                             M_INTERACTION_TIME:            [NSNumber numberWithInt:DebugAfterExist],
-                             M_INTERACTION_ADD_COUNT:       @(DebugAfterFSFinish),
-                             M_INTERACTION_LIMIT_ADD_COUNT: @(DebugAfterFSFinish),
-                             COMPONENTCOUNT:                @(DebugAfterExist),
-                             M_COMPONENT_TIME:              @(DebugAfterExist),
-                             M_NEW_FS_RENDER_TIME:                  @(DebugAfterExist),
-                             };
-        
-    });
-    return measureOrDimen?commitMeasureKeys:commitDimenKeys;
-}
-
-+ (void) _transMeasureValue:(WXSDKInstance *)instance key:(NSString *)commitKey withVal:(id)commitVal
-{
-    [self _transDataToAnaylzer:instance
-                        withModule:MODULE_PERFORMANCE
-                        withType:TYPE_MEASURE_REAL
-                        withData:@{commitKey:commitVal}
-     ];
-}
-
-+ (void) _transDimenValue:(WXSDKInstance *)instance key:(NSString *)commitKey withVal:(id)commitVal
-{
-    [self _transDataToAnaylzer:instance
-                        withModule:MODULE_PERFORMANCE
-                        withType:TYPE_DIMEN_REAL
-                        withData:@{commitKey:commitVal}
-     ];
+    NSDictionary* dic =  @{
+                            @"group":MODULE_WX_APM,
+                            @"module":instanceId,
+                            @"type":type,
+                            @"data":@{key:value}
+                            };
+    for (id analyzer in analyzerList) {
+        if ([analyzer respondsToSelector:(@selector(transfer:))]){
+            [analyzer performSelector:@selector(transfer:) withObject:dic];
+        }
+    }
 }
 
-+(void) _transDataToAnaylzer:(WXSDKInstance *)instance withModule:(NSString *)module  withType:(NSString *)type withData:(NSDictionary *)data
++ (void) transferInteractionInfo:(WXComponent*)targetComponent
 {
+    if (![self isOpen]) {
+        return;
+    }
     NSMutableArray* analyzerList = [self getAnalyzerList];
     if (nil == analyzerList) {
         return;
     }
     
-    NSMutableDictionary *wrapDic = [data mutableCopy];
-    [wrapDic setObject:instance.instanceId forKey:@"instanceId"];
-    [wrapDic setObject:[instance.scriptURL absoluteString]?:@"unSetscriptURL" forKey:@"url"];
-    [wrapDic setValue:GROUP_ANALYZER forKey:@"group"];
-    [wrapDic setValue:module forKey:@"module"];
-    [wrapDic setValue:type forKey:@"type"];
-
+    long renderOriginDiffTime = [WXUtility getUnixFixTimeMillis] - targetComponent.weexInstance.performance.renderUnixTimeOrigin;
     
-    if ([self needTransfer]) {
-        for (id analyzer in analyzerList) {
-            if ( [analyzer respondsToSelector:(@selector(transfer:))])
-            {
-                [analyzer performSelector:@selector(transfer:) withObject:wrapDic];
-            }
+    NSDictionary* dic =  @{
+                           @"group":MODULE_WX_APM,
+                           @"module":targetComponent.weexInstance.instanceId,
+                           @"type":@"wxinteraction",
+                           @"data":@{
+                                   @"renderOriginDiffTime":@(renderOriginDiffTime),
+                                   @"type":targetComponent.type,
+                                   @"ref":targetComponent.ref,
+                                   @"style":targetComponent.styles,
+                                   @"attrs":targetComponent.attributes
+                                   }
+                           };
+    for (id analyzer in analyzerList) {
+        if ([analyzer respondsToSelector:(@selector(transfer:))]){
+            [analyzer performSelector:@selector(transfer:) withObject:dic];
         }
     }
-    
-    
+    if ([self isInteractionLogOpen]) {
+        WXLogDebug(@"wxInteractionAnalyzer : [client][wxinteraction]%@",dic);
+    }
 }
 
 +(void)transErrorInfo:(WXJSExceptionInfo *)errorInfo
 {
-    if (!errorInfo) {
+    if (![self isOpen] || !errorInfo) {
         return;
     }
+
     WXSDKInstance *instance = [WXSDKManager instanceForID:errorInfo.instanceId];
     if (!instance) {
         return;
     }
+    NSMutableArray* analyzerList = [self getAnalyzerList];
+    if (nil == analyzerList) {
+        return;
+    }
+
     NSDictionary *dic= @{
                          @"errorCode":errorInfo.errorCode?:@"-1",
                          @"errorGroup":@"",
-                         @"errorMsg":errorInfo.exception?:@"unSetException"
-                         };
+                         @"errorMsg":errorInfo.exception?:@"unSetException",
+                         @"instanceId":instance.instanceId,
+                         @"url":[instance.scriptURL absoluteString]?:@"unSetscriptURL",
+                         @"group":GROUP_ANALYZER,
+                         @"module":MODULE_ERROR,
+                         @"type":TYPE_JS_ERROR
+                        };
     
-    [self _transDataToAnaylzer:instance
-                    withModule:MODULE_ERROR
-                      withType:TYPE_JS_ERROR
-                      withData:dic
-     ];
+    for (id analyzer in analyzerList) {
+        if ([analyzer respondsToSelector:(@selector(transfer:))]){
+            [analyzer performSelector:@selector(transfer:) withObject:dic];
+        }
+    }
 }
 
 + (void) addWxAnalyzer:(id<WXAnalyzerProtocol>)handler
@@ -233,17 +175,6 @@ + (void) rmWxAnalyzer:(id<WXAnalyzerProtocol>)handler
     return [WXAnalyzerCenter sharedInstance].analyzerList;
 }
 
-+(BOOL) needTransfer
-{
-    if(![self isOpen]){
-        return FALSE;
-    }
-    NSMutableArray* analyzerList = [self getAnalyzerList];
-    if (nil == analyzerList || analyzerList.count <= 0) {
-        return FALSE;
-    }
-    return TRUE;
-}
 
 + (void)setOpen:(BOOL)isOpen
 {
@@ -255,4 +186,33 @@ + (BOOL)isOpen
      return [WXAnalyzerCenter sharedInstance].anzlyzerSwitch;
 }
 
++(void) switchInteractionLog:(BOOL) isOpen
+{
+    if ([WXAnalyzerCenter sharedInstance]->_interactionLogSwitch == isOpen) {
+        return;
+    }
+    [WXAnalyzerCenter sharedInstance]->_interactionLogSwitch = isOpen;
+    [WXCoreBridge registerCoreEnv:@"switchInteractionLog" withValue:isOpen?@"true":@"false"];
+#ifdef DEBUG
+    [WXLog setLogLevel: isOpen?WXLogLevelDebug:WXLogLevelLog];
+#else
+     [WXLog setLogLevel: isOpen?WXLogLevelDebug:WXLogLevelWarning];
+#endif
+
+    if ([WXSDKManager.bridgeMgr respondsToSelector:@selector(bridgeCtx)]) {
+        id bridgeCtx = [WXSDKManager.bridgeMgr performSelector:@selector(bridgeCtx) withObject:nil];
+        if (nil != bridgeCtx && [bridgeCtx respondsToSelector:@selector(callJSMethod:args:)]) {
+            WXPerformBlockOnBridgeThread(^(){
+                NSArray* args = @[isOpen?@(1):@(0)];
+                [bridgeCtx performSelector:@selector(callJSMethod:args:) withObject:@"switchInteractionLog" withObject:args];
+            });
+        }
+    }
+}
+
++(BOOL) isInteractionLogOpen
+{
+    return [WXAnalyzerCenter sharedInstance]->_interactionLogSwitch;
+}
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m
index d7fafd7532..ccd18854ee 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m
@@ -67,6 +67,7 @@ + (void)performancePoint:(WXPerformanceTag)tag didEndWithInstance:(WXSDKInstance
     dict[kEndKey] = @(CACurrentMediaTime() * 1000);
     if (tag == WXPTFirstScreenRender) {
         [instance.apmInstance onStage:KEY_PAGE_STAGES_FSRENDER];
+        instance.apmInstance.isFSEnd = YES;
     }
 
 //    if (tag == WXPTAllRender) {
@@ -241,12 +242,6 @@ + (void)commitPerformanceWithDict:(NSMutableDictionary *)commitDict instance:(WX
         [self printPerformance:commitDict];
         [WXTracingManager commitTracingSummaryInfo:commitDict withInstanceId:instance.instanceId];
     }
-    if ([WXAnalyzerCenter isOpen]) {
-        if (state == MonitorCommit) {
-            state = DebugAfterExist;
-        }
-        [WXAnalyzerCenter transDataOnState:state withInstaneId:instance.instanceId data:commitDict];
-    }
 }
 
 + (NSMutableDictionary *)performanceDictForInstance:(WXSDKInstance *)instance
diff --git a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
index 68890a47c7..a81624621f 100644
--- a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
@@ -108,7 +108,7 @@ extern NSString* const VALUE_ERROR_CODE_DEFAULT;
 @property (nonatomic, assign) BOOL isStartRender;
 @property (nonatomic,assign)  BOOL  hasRecordFirstInterationView;
 @property (nonatomic, assign) BOOL isDownLoadFailed;
-@property (nonatomic,assign) double wxPageRatio;
+@property (nonatomic,assign) double pageRatio;
 
 #pragma mark - basic method
 
diff --git a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
index 04d6abf37b..d44effd6ef 100644
--- a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
@@ -29,6 +29,7 @@
 #import "WXSDKError.h"
 #import "WXExceptionUtils.h"
 #import "WXSDKInstance_performance.h"
+#import "WXAnalyzerCenter+Transfer.h"
 
 
 #pragma mark - const static string
@@ -147,7 +148,7 @@ - (instancetype) init
 
 - (void) onEvent:(NSString *)name withValue:(id)value
 {
-    if (nil == _apmProtocolInstance) {
+    if (nil == _apmProtocolInstance || _isEnd) {
         return;
     }
     [self.apmProtocolInstance onEvent:name withValue:value];
@@ -155,7 +156,7 @@ - (void) onEvent:(NSString *)name withValue:(id)value
 
 - (void) onStage:(NSString *)name
 {
-    if (nil == _apmProtocolInstance || _isEnd) {
+    if(_isEnd){
         return;
     }
     [self onStageWithTime:name time:[WXUtility getUnixFixTimeMillis]];
@@ -163,7 +164,14 @@ - (void) onStage:(NSString *)name
 
 - (void) onStageWithTime:(NSString*)name time:(long)unixTime
 {
-    if (nil == _apmProtocolInstance || _isEnd) {
+    if(_isEnd){
+        return;
+    }
+    if ([WXAnalyzerCenter isOpen]) {
+        [WXAnalyzerCenter transferPerformance:self.instanceId withType:@"stage" andKey:name andValue:@(unixTime)];
+    }
+
+    if (nil == _apmProtocolInstance) {
         return;
     }
     if ([KEY_PAGE_STAGES_DOWN_BUNDLE_START isEqualToString:name]) {
@@ -194,17 +202,33 @@ - (void) onStageWithTime:(NSString*)name time:(long)unixTime
 
 - (void) setProperty:(NSString *)name withValue:(id)value
 {
-    if (nil == _apmProtocolInstance || _isEnd) {
+    if(_isEnd){
+        return;
+    }
+    
+    if ([WXAnalyzerCenter isOpen]) {
+        [WXAnalyzerCenter transferPerformance:self.instanceId withType:@"properties" andKey:name andValue:value];
+    }
+    
+    if (nil == _apmProtocolInstance) {
         return;
     }
+   
     [self.apmProtocolInstance addProperty:name withValue:value];
 }
 
 - (void) setStatistic:(NSString *)name withValue:(double)value
 {
-    if (nil == _apmProtocolInstance || _isEnd) {
+    if(_isEnd){
         return;
     }
+    if ([WXAnalyzerCenter isOpen]) {
+        [WXAnalyzerCenter transferPerformance:self.instanceId withType:@"stats" andKey:name andValue:@(value)];
+    }
+    if (nil == _apmProtocolInstance) {
+        return;
+    }
+  
     [self.apmProtocolInstance addStatistic:name withValue:value];
 }
 
@@ -212,18 +236,22 @@ - (void) setStatistic:(NSString *)name withValue:(double)value
 
 - (void) startRecord:(NSString*) instanceId
 {
-    if (nil == _apmProtocolInstance || _isRecord) {
+    if (_isRecord || ![self _shouldRecordInfo]) {
         return;
     }
+  
+    _isRecord = YES;
+    _instanceId = instanceId;
+    
+    if (nil != _apmProtocolInstance) {
+        [self.apmProtocolInstance onStart:instanceId topic:WEEX_PAGE_TOPIC];
+    }
+    [self onStage:KEY_PAGE_STAGES_START];
     WXSDKInstance* instance = [WXSDKManager instanceForID:instanceId];
     if (nil == instance) {
         return;
     }
-    
-    _isRecord = YES;
 
-    
-    [self.apmProtocolInstance onStart:instance.instanceId topic:WEEX_PAGE_TOPIC];
     for (NSString* key in instance.continerInfo) {
         id value = [instance.continerInfo objectForKey:key];
         [self setProperty:key withValue:value];
@@ -236,7 +264,9 @@ - (void) startRecord:(NSString*) instanceId
     [self setProperty:KEY_PROPERTIES_ERROR_CODE withValue:VALUE_ERROR_CODE_DEFAULT];
     [self setProperty:KEY_PAGE_PROPERTIES_JSLIB_VERSION withValue:[WXAppConfiguration JSFrameworkVersion]?:@"unknownJSFrameworkVersion"];
     [self setProperty:KEY_PAGE_PROPERTIES_WEEX_VERSION withValue:WX_SDK_VERSION];
-    [self setStatistic:KEY_PAGE_STATS_BODY_RATIO withValue:self.wxPageRatio];
+    if (self.pageRatio >0) {
+        [self setStatistic:KEY_PAGE_STATS_BODY_RATIO withValue:self.pageRatio];
+    }
     
     //for apm protocl
     //iOS/Android we default recycle img when imgView disapper form screen
@@ -246,32 +276,24 @@ - (void) startRecord:(NSString*) instanceId
 
 - (void) endRecord;
 {
-    if (nil == _apmProtocolInstance || _isEnd) {
+    if (_isEnd) {
         return;
     }
     _isEnd = YES;
-    WXSDKInstance* instance = [WXSDKManager instanceForID:self.instanceId];
-    if (!_hasRecordInteractionTime && nil!= instance.performance && instance.performance.lastRealInteractionTime > 0) {
-        [self onStageWithTime:KEY_PAGE_STAGES_INTERACTION time:instance.performance.lastRealInteractionTime];
-        _hasRecordInteractionTime = YES;
-    }
-    
     [self onStage:KEY_PAGE_STAGES_DESTROY];
-    [self.apmProtocolInstance onEnd];
-    [self _checkScreenEmptyAndReport];
+    if (nil != _apmProtocolInstance) {
+         [self.apmProtocolInstance onEnd];
+    }
 }
 
 - (void) updateFSDiffStats:(NSString *)name withDiffValue:(double)diff
 {
-    if (nil == _apmProtocolInstance || _isFSEnd) {
-        return;
-    }
     [self updateDiffStats:name withDiffValue:diff];
 }
 
 - (void) updateDiffStats:(NSString *)name withDiffValue:(double)diff
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     __weak typeof(self) weakSelf = self;
@@ -286,7 +308,7 @@ - (void) updateDiffStats:(NSString *)name withDiffValue:(double)diff
 
 - (void) updateMaxStats:(NSString *)name curMaxValue:(double)currentValue
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     __weak typeof(self) weakSelf = self;
@@ -305,7 +327,8 @@ - (void) updateMaxStats:(NSString *)name curMaxValue:(double)currentValue
 - (void) updateExtInfoFromResponseHeader:(NSDictionary*) extInfo
 {
     _responseHeader = extInfo;
-    if (nil == _apmProtocolInstance || nil == extInfo) {
+    
+    if (![self _shouldRecordInfo] || nil == extInfo) {
         return;
     }
     
@@ -330,7 +353,7 @@ - (void) updateExtInfoFromResponseHeader:(NSDictionary*) extInfo
 
 - (void) actionNetRequest
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     if (!self.isFSEnd) {
@@ -341,7 +364,7 @@ - (void) actionNetRequest
 
 - (void) actionNetRequestResult:(bool)succeed withErrorCode:(NSString*)errorCode
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     if (succeed) {
@@ -355,7 +378,7 @@ - (void) actionNetRequestResult:(bool)succeed withErrorCode:(NSString*)errorCode
 
 - (void) actionImgLoad
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     [self updateDiffStats:KEY_PAGE_STATS_IMG_LOAD_NUM withDiffValue:1];
@@ -363,7 +386,7 @@ - (void) actionImgLoad
 
 - (void) actionImgLoadResult:(bool)succeed withErrorCode:(NSString*)errorCode
 {
-    if (nil == _apmProtocolInstance) {
+    if (![self _shouldRecordInfo]) {
         return;
     }
     if (succeed) {
@@ -373,6 +396,14 @@ - (void) actionImgLoadResult:(bool)succeed withErrorCode:(NSString*)errorCode
     }
 }
 
+- (BOOL) _shouldRecordInfo
+{
+    if (_isEnd) {
+        return NO;
+    }
+    return self.apmProtocolInstance != nil || [WXAnalyzerCenter isOpen];
+}
+
 - (void) recordErrorMsg:(WXJSExceptionInfo *)exception
 {
     if (nil == exception || !self.isOpenApm) {


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services