+ [ios] update tracing logic @notdanger
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/7c3b6cfc Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7c3b6cfc Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7c3b6cfc Branch: refs/heads/0.15-dev Commit: 7c3b6cfc6c47be3811cf3313db231550f40296d3 Parents: 11b1949 Author: é½å±± <sunjjb...@163.com> Authored: Wed Jul 19 10:09:06 2017 +0800 Committer: é½å±± <sunjjb...@163.com> Committed: Wed Jul 19 10:09:06 2017 +0800 ---------------------------------------------------------------------- ios/sdk/WeexSDK.xcodeproj/project.pbxproj | 8 + .../WeexSDK/Sources/Bridge/WXBridgeContext.m | 25 +- .../WeexSDK/Sources/Manager/WXTracingManager.h | 83 +++++ .../WeexSDK/Sources/Manager/WXTracingManager.m | 370 +++++++++++++++++++ ios/sdk/WeexSDK/Sources/Module/WXDomModule.m | 14 +- .../WeexSDK/Sources/Utility/WXTracingManager.h | 86 ----- .../WeexSDK/Sources/Utility/WXTracingManager.m | 353 ------------------ 7 files changed, 465 insertions(+), 474 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK.xcodeproj/project.pbxproj ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj index d16e630..43256cc 100644 --- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj +++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj @@ -250,6 +250,8 @@ C4D872261E5DDF7500E39BC1 /* WXBoxShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D872241E5DDF7500E39BC1 /* WXBoxShadow.m */; }; C4E375371E5FCBD3009B2D9C /* WXComponent+BoxShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E375351E5FCBD3009B2D9C /* WXComponent+BoxShadow.m */; }; C4E375381E5FCBD3009B2D9C /* WXComponent+BoxShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C4E375361E5FCBD3009B2D9C /* WXComponent+BoxShadow.h */; }; + C4E97D331F1EF46D00ABC314 /* WXTracingManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C4E97D311F1EF46D00ABC314 /* WXTracingManager.h */; }; + C4E97D341F1EF46D00ABC314 /* WXTracingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */; }; C4F012791E1502A6003378D0 /* SRWebSocket+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */; }; C4F0127A1E1502A6003378D0 /* SRWebSocket+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */; }; C4F0127B1E1502A6003378D0 /* WXWebSocketDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */; }; @@ -567,6 +569,8 @@ C4D872241E5DDF7500E39BC1 /* WXBoxShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBoxShadow.m; sourceTree = "<group>"; }; C4E375351E5FCBD3009B2D9C /* WXComponent+BoxShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WXComponent+BoxShadow.m"; sourceTree = "<group>"; }; C4E375361E5FCBD3009B2D9C /* WXComponent+BoxShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WXComponent+BoxShadow.h"; sourceTree = "<group>"; }; + C4E97D311F1EF46D00ABC314 /* WXTracingManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXTracingManager.h; sourceTree = "<group>"; }; + C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXTracingManager.m; sourceTree = "<group>"; }; C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SRWebSocket+Weex.h"; sourceTree = "<group>"; }; C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SRWebSocket+Weex.m"; sourceTree = "<group>"; }; C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXWebSocketDefaultImpl.h; sourceTree = "<group>"; }; @@ -948,6 +952,8 @@ 77D1611A1C02DD3C0010B15B /* Manager */ = { isa = PBXGroup; children = ( + C4E97D311F1EF46D00ABC314 /* WXTracingManager.h */, + C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */, 740451E81E14BB26004157CB /* WXServiceFactory.h */, 740451E91E14BB26004157CB /* WXServiceFactory.m */, DCF0875F1DCAE161005CD6EB /* WXInvocationConfig.h */, @@ -1240,6 +1246,7 @@ 591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */, D362F94F1C83EDA20003F546 /* WXWebViewModule.h in Headers */, C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */, + C4E97D331F1EF46D00ABC314 /* WXTracingManager.h in Headers */, 77D161381C02DE940010B15B /* WXBridgeManager.h in Headers */, C4D872251E5DDF7500E39BC1 /* WXBoxShadow.h in Headers */, 042013AD1E66CD6A001FC79C /* WXValidateProtocol.h in Headers */, @@ -1634,6 +1641,7 @@ 7463192A1C71B92600EFEBD4 /* WXModalUIModule.m in Sources */, 77D161501C02E3880010B15B /* WXUtility.m in Sources */, 74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m in Sources */, + C4E97D341F1EF46D00ABC314 /* WXTracingManager.m in Sources */, 742AD72F1DF98C45007DC46C /* WXResourceRequest.m in Sources */, 7461F8931CFB373100F62D44 /* WXLayer.m in Sources */, 74D205211E091B8000128F44 /* WXCallJSMethod.m in Sources */, http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m index 188fb30..1f0b5aa 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m @@ -368,14 +368,14 @@ _Pragma("clang diagnostic pop") \ NSString *methodName = task[@"method"]; NSArray *arguments = task[@"args"]; if (task[@"component"]) { - [self tracingComponentTask:task instanceId:instanceId]; NSString *ref = task[@"ref"]; WXComponentMethod *method = [[WXComponentMethod alloc] initWithComponentRef:ref methodName:methodName arguments:arguments instance:instance]; [method invoke]; + [WXTracingManager startTracing:instanceId ref:task[@"ref"] parentRef:nil className:nil name:task[@"component"] ph:WXTracingBegin fName:task[@"method"] parentId:task[@"method"]]; } else { NSString *moduleName = task[@"module"]; WXModuleMethod *method = [[WXModuleMethod alloc] initWithModuleName:moduleName methodName:methodName arguments:arguments instance:instance]; - [self tracingModuleTask:task instanceId:instanceId]; + [WXTracingManager startTracing:instanceId ref:nil parentRef:nil className:nil name:task[@"module"] ph:WXTracingBegin fName:task[@"method"] parentId:nil]; [method invoke]; } } @@ -385,27 +385,6 @@ _Pragma("clang diagnostic pop") \ return 1; } --(void)tracingComponentTask:(NSDictionary *)task instanceId:(NSString *)instanceId -{ - WXTracing *tracing = [WXTracing new]; - tracing.iid = instanceId; - tracing.ref = task[@"ref"]; - tracing.name = task[@"method"]; - tracing.ph = WXTracingBegin; - tracing.fName = task[@"method"]; - [WXTracingManager startTracing:tracing]; -} - --(void)tracingModuleTask:(NSDictionary *)task instanceId:(NSString *)instanceId -{ - WXTracing *tracing = [WXTracing new]; - tracing.iid = instanceId; - tracing.name = task[@"module"]; - tracing.ph = WXTracingBegin; - tracing.fName = task[@"method"]; - [WXTracingManager startTracing:tracing]; -} - - (void)createInstance:(NSString *)instance template:(NSString *)temp options:(NSDictionary *)options http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h new file mode 100644 index 0000000..37e4d28 --- /dev/null +++ b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#import <Foundation/Foundation.h> +#import "WXSDKInstance.h" + +#define WXTNetworkHanding @"WXTNetworkHanding" +#define WXTDataHanding @"WXTDataHanding" +#define WXTJSCall @"jsCall" +#define WXTRender @"WXTRender" +#define WXTRenderFinish @"WXTRenderFinish" + +#define WXTracingBegin @"B" +#define WXTracingEnd @"E" +#define WXTracingDuration @"D" +#define WXTracingInstant @"i" + +typedef enum : NSUInteger { + // global + WXTracingNetworkHanding = 0, + WXTracingDataHanding, + WXTracingRender +} WXTracingTag; + + +@interface WXTracingApi:NSObject + +@property (nonatomic, copy) NSString *name; // +@property (nonatomic, copy) NSString *className; // +@property (nonatomic, copy) NSString *method; // + +@end + +@interface WXTracing:NSObject + +@property (nonatomic, copy) NSString *ref; // compnonet id +@property (nonatomic, copy) NSString *parentRef; // compnonet id +@property (nonatomic, copy) NSString *className; // compnonet class name or module class name +@property (nonatomic, copy) NSString *name; // register name +@property (nonatomic, copy) NSString *ph; // phase +@property (nonatomic) NSTimeInterval ts; // time +@property (nonatomic) long long traceId; +@property (nonatomic) NSTimeInterval duration; +@property (nonatomic, copy) NSString *fName; // functionName +@property (nonatomic, copy) NSString *iid; // instance id +@property (nonatomic, copy) NSString *parentId;// parent event id +-(NSDictionary *)dictionary; +@end + +@interface WXTracingTask:NSObject + +@property (nonatomic, copy) NSString *iid; +@property (nonatomic) long long counter; +@property (nonatomic, copy) NSString *tag; +@property (nonatomic, strong) NSMutableArray *tracings; +@property (nonatomic, copy) NSString *bundleJSType; // + +@end + +@interface WXTracingManager : NSObject ++(void)switchTracing:(BOOL)isTracing; ++(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId; ++(WXTracingTask*)getTracingData; ++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid; ++(NSDictionary *)getTacingApi; + +@end http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m new file mode 100644 index 0000000..653c192 --- /dev/null +++ b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m @@ -0,0 +1,370 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#import "WXTracingManager.h" +#import "WXComponentFactory.h" +#import "WXModuleFactory.h" +#import "WXSDKManager.h" +#import <WeexSDK/WXComponentFactory.h> +#import <WeexSDK/WXModuleFactory.h> +#import <WeexSDK/WXHandlerFactory.h> +#import "WXUtility.h" +#import "WXComponentManager.h" + + +@implementation WXTracing + +-(NSDictionary *)dictionary { + return [NSDictionary dictionaryWithObjectsAndKeys:self.ref?:@"",@"ref",self.parentRef?:@"",@"parentRef",self.className?:@"",@"className",self.name?:@"",@"name",self.ph?:@"",@"ph",@(self.ts),@"ts",@(self.traceId),@"traceId",@(self.duration),@"duration",self.fName?:@"",@"fName",self.iid?:@"",@"iid",self.parentId?:@"",@"parentId", nil]; +} +@end + +@implementation WXTracingTask + +@end + +@interface WXTracingManager() + +@property (nonatomic) BOOL isTracing; +@property (nonatomic, strong) NSMutableDictionary *tracingTasks; // every instance have a task +@property (nonatomic, copy) NSString *currentInstanceId; // every instance have a task + +@end + +@implementation WXTracingManager + + ++ (instancetype) sharedInstance{ + + static WXTracingManager *instance = nil; + static dispatch_once_t once; + + dispatch_once(&once, ^{ + instance = [[WXTracingManager alloc] initPrivate]; + }); + + return instance; +} + +- (instancetype) initPrivate{ + self = [super init]; + if(self){ + self.isTracing = NO; + } + + return self; +} + ++(void)switchTracing:(BOOL )isTracing +{ + [WXTracingManager sharedInstance].isTracing = isTracing; +} + ++(BOOL)isTracing +{ +#if DEBUG + return [WXTracingManager sharedInstance].isTracing; +#else + return NO; +#endif +} + ++(void)startTracing:(WXTracing *)tracing +{ + if([self isTracing]){ + if(![WXTracingManager sharedInstance].tracingTasks){ + [WXTracingManager sharedInstance].tracingTasks = [NSMutableDictionary new]; + } + if(![[WXTracingManager sharedInstance].tracingTasks objectForKey:tracing.iid]){ + WXTracingTask *task = [WXTracingTask new]; + task.iid = tracing.iid; + [[WXTracingManager sharedInstance].tracingTasks setObject:task forKey:tracing.iid]; + } + WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:tracing.iid]; + if(!task.tracings){ + task.tracings = [NSMutableArray new]; + } + NSTimeInterval time=[[NSDate date] timeIntervalSince1970]*1000; + tracing.ts = time; + if(![WXTracingEnd isEqualToString:tracing.ph]){ // end is should not update + tracing.traceId = task.counter++; + } + if([WXTNetworkHanding isEqualToString:tracing.name] && [WXTracingBegin isEqualToString:tracing.ph]){ + task.tag = WXTNetworkHanding; + } + NSTimeInterval ts = [[NSDate date] timeIntervalSince1970]*1000; + tracing.ts = ts ; + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateTracings:task tracing:tracing]; + }); + } +} + ++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid +{ + if([self isTracing] && iid.length >0){ + WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:iid]; + if(jsBundleString.length >0){ + NSRange range = [jsBundleString rangeOfString:@"}"]; + if (range.location != NSNotFound) { + NSString *searchStr = [jsBundleString substringToIndex:range.location+range.length]; + if ([searchStr rangeOfString:@"Vue"].location != NSNotFound){ + task.bundleJSType = @"Vue"; + }else if([searchStr rangeOfString:@"Rax"].location != NSNotFound){ + task.bundleJSType = @"Rax"; + } + } + } + } +} + ++(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId +{ + if([self isTracing]){ + WXTracing *tracing = [WXTracing new]; + if(ref.length>0){ + tracing.ref = ref; + } + if(parentRef.length>0){ + tracing.parentRef = parentRef; + } + if(className.length>0){ + tracing.className = className; + } + if(name.length>0){ + tracing.name = name; + } + if(fName.length>0){ + tracing.fName = fName; + } + if(ph.length>0){ + tracing.ph = ph; + } + if(iid.length>0){ + tracing.iid = iid; + } + if(parentId.length>0){ + tracing.parentId = parentId; + } + [self startTracing:tracing]; + } +} + ++(WXTracing *)copyTracing:(WXTracing *)tracing +{ + WXTracing *newTracing = [WXTracing new]; + if(tracing.ref.length>0){ + newTracing.ref = tracing.ref; + } + if(tracing.parentRef.length>0){ + newTracing.parentRef = tracing.parentRef; + } + if(tracing.className.length>0){ + newTracing.className = tracing.className; + } + if(tracing.name.length>0){ + newTracing.name = tracing.name; + } + if(tracing.fName.length>0){ + newTracing.fName = tracing.fName; + } + if(tracing.ph.length>0){ + newTracing.ph = tracing.ph; + } + if(tracing.iid.length>0){ + newTracing.iid = tracing.iid; + } + if(tracing.parentId.length>0){ + newTracing.parentId = tracing.parentId; + } + if(tracing.traceId>0){ + newTracing.traceId = tracing.traceId; + } + if(tracing.ts>0){ + newTracing.ts = tracing.ts; + } + return newTracing; +} + ++(NSString *)getclassName:(WXTracing *)tracing +{ + NSString *className = @""; + if(tracing.ref.length>0 && tracing.name.length >0){ + Class cls = [WXComponentFactory classWithComponentName:tracing.name]; + className = NSStringFromClass(cls); + }else if(tracing.name.length > 0){ + Class cls = [WXModuleFactory classWithModuleName:tracing.name]; + if(cls){ + className = NSStringFromClass(cls); + } + } + return className; +} + ++(void)updateTracings:(WXTracingTask *)task tracing:(WXTracing *)tracing +{ + if(![WXTJSCall isEqualToString:tracing.name]){ + tracing.className = [self getclassName:tracing]; + } + if([WXTNetworkHanding isEqualToString:task.tag]){ + if([WXTDataHanding isEqualToString:tracing.name]){ + NSMutableArray *tracings = task.tracings; + [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { + if(([WXTNetworkHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ + WXTracing *newTracing = [self copyTracing:bTracing]; + newTracing.iid = tracing.iid; + newTracing.ph = WXTracingEnd; + newTracing.ts = tracing.ts ; + newTracing.duration = newTracing.ts - bTracing.ts ; + bTracing.duration = newTracing.duration; + [task.tracings addObject:newTracing]; + NSLog(@"jerry0 %f,%f",bTracing.ts,bTracing.duration); + *stop = YES; + } + }]; + task.tag = WXTDataHanding; + } + } + + if([WXTDataHanding isEqualToString:task.tag]){ + if([WXTJSCall isEqualToString:tracing.name]){ + NSMutableArray *tracings = task.tracings; + [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { + if(([WXTDataHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ + WXTracing *newTracing = [self copyTracing:bTracing]; + newTracing.iid = tracing.iid; + newTracing.ph = WXTracingEnd; + newTracing.ts = tracing.ts ; + newTracing.duration = newTracing.ts - bTracing.ts ; + bTracing.duration = newTracing.duration; + [task.tracings addObject:newTracing]; + NSLog(@"jerry1 %f,%f",bTracing.ts,bTracing.duration); + *stop = YES; + } + }]; + task.tag = WXTRender; + } + } + if([WXTracingEnd isEqualToString:tracing.ph]){ // deal end + + if(tracing.ref.length>0){ + WXPerformBlockOnComponentThread(^{ + WXSDKInstance *instance = [WXSDKManager instanceForID:task.iid]; + WXComponent *com = [instance componentForRef:tracing.ref]; + if(com.supercomponent){ + tracing.parentRef = com.supercomponent.ref; + } + }); + + } + NSMutableArray *tracings = task.tracings; + [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { + if(tracing.ref.length > 0 && bTracing.ref.length>0){ + if(![tracing.ref isEqualToString:bTracing.ref]){ + return ; + } + } + + if([bTracing.fName isEqualToString:tracing.fName] &&[WXTracingBegin isEqualToString:bTracing.ph]){ + tracing.iid = bTracing.iid; + if(bTracing.ref.length > 0){ + tracing.ref = bTracing.ref; + } + if(tracing.parentRef.length > 0){ + bTracing.parentRef = tracing.parentRef; + } + tracing.duration = tracing.ts - bTracing.ts ; + tracing.traceId = bTracing.traceId; + bTracing.duration = tracing.duration; + *stop = YES; + } + }]; + } + [task.tracings addObject:tracing]; +} + ++(WXTracingTask *)getTracingData +{ + if(![self isTracing]){ + return nil; + } + NSArray *instanceIds = [[WXSDKManager bridgeMgr] getInstanceIdStack]; + WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:[instanceIds firstObject]]; + NSMutableArray *ary = [NSMutableArray new]; + for (WXTracing *tracing in task.tracings) { + [ary addObject:[tracing dictionary]]; + } + return task; +} + ++(NSDictionary *)getTacingApi +{ + if(![self isTracing]){ + return @{}; + } + NSMutableDictionary *dict = [NSMutableDictionary new]; + NSMutableArray *componetArray = [NSMutableArray new]; + NSMutableArray *moduleArray = [NSMutableArray new]; + NSMutableArray *handleArray = [NSMutableArray new]; + NSDictionary *componentConfigs = [WXComponentFactory componentConfigs]; + void (^componentBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSMutableDictionary *componentConfig = [mObj mutableCopy]; + NSDictionary *cDict = [WXComponentFactory componentMethodMapsWithName:componentConfig[@"name"]]; + if(cDict && [cDict count]>0 && [cDict[@"methods"] count]>0){ + [componentConfig setObject:cDict[@"methods"] forKey:@"methods"]; + } + [componetArray addObject:componentConfig]; + }; + [componentConfigs enumerateKeysAndObjectsUsingBlock:componentBlock]; + if(componetArray && [componetArray count]>0){ + [dict setObject:componetArray forKey:@"componet"]; + } + NSDictionary *moduleConfigs = [WXModuleFactory moduleConfigs]; + void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSDictionary *mDict = [WXModuleFactory moduleMethodMapsWithName:mKey]; + NSMutableDictionary *subDict = [NSMutableDictionary new]; + [subDict setObject:mKey forKey:@"name"]; + [subDict setObject:mObj forKey:@"class"]; + if([mDict objectForKey:mKey]){ + [subDict setObject:[mDict objectForKey:mKey] forKey:@"methods"]; + } + [moduleArray addObject:subDict]; + }; + [moduleConfigs enumerateKeysAndObjectsUsingBlock:moduleBlock]; + if(moduleArray && [moduleArray count]>0){ + [dict setObject:moduleArray forKey:@"module"]; + } + + + NSDictionary *handleConfigs = [[WXHandlerFactory handlerConfigs] mutableCopy]; + void (^handleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSMutableDictionary *subDict = [NSMutableDictionary new]; + [subDict setObject:mKey forKey:@"class"]; + [subDict setObject:NSStringFromClass([mObj class]) forKey:@"name"]; + [handleArray addObject:subDict]; + }; + [handleConfigs enumerateKeysAndObjectsUsingBlock:handleBlock]; + if(handleArray && [handleArray count]>0){ + [dict setObject:handleArray forKey:@"handle"]; + } + + return dict; +} + +@end http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m index 5c62985..5128caa 100644 --- a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m +++ b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m @@ -91,15 +91,10 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:)) - (void)addElement:(NSString *)parentRef element:(NSDictionary *)element atIndex:(NSInteger)index { - WXTracing *tracing = [WXTracing new]; - tracing.iid = self.weexInstance.instanceId; - tracing.name = @"dom"; - tracing.ph = WXTracingEnd; - tracing.fName = NSStringFromSelector(_cmd); - [WXTracingManager startTracing:tracing]; [self performBlockOnComponentManager:^(WXComponentManager *manager) { [manager addComponent:element toSupercomponent:parentRef atIndex:index appendingInTree:NO]; }]; + [WXTracingManager startTracing:self.weexInstance.instanceId ref:nil parentRef:nil className:nil name:@"dom" ph:WXTracingEnd fName:@"addElement" parentId:nil]; } - (void)removeElement:(NSString *)ref @@ -132,15 +127,10 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:)) - (void)createFinish { - WXTracing *tracing = [WXTracing new]; - tracing.iid = self.weexInstance.instanceId; - tracing.name = @"dom"; - tracing.ph = WXTracingEnd; - tracing.fName = NSStringFromSelector(_cmd); - [WXTracingManager startTracing:tracing]; [self performBlockOnComponentManager:^(WXComponentManager *manager) { [manager createFinish]; }]; + [WXTracingManager startTracing:self.weexInstance.instanceId ref:nil parentRef:nil className:nil name:@"dom" ph:WXTracingEnd fName:@"createFinish" parentId:nil]; } - (void)updateFinish http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h deleted file mode 100644 index 3d18c39..0000000 --- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#import <Foundation/Foundation.h> -#import "WXSDKInstance.h" - -#define WXTNetworkHanding @"WXTNetworkHanding" -#define WXTDataHanding @"WXTDataHanding" -#define WXTJSCall @"jsCall" -#define WXTRender @"WXTRender" -#define WXTRenderFinish @"WXTRenderFinish" - -#define WXTracingBegin @"B" -#define WXTracingEnd @"E" -#define WXTracingDuration @"D" -#define WXTracingInstant @"i" - -typedef enum : NSUInteger { - // global - WXTracingNetworkHanding = 0, - WXTracingDataHanding, - WXTracingRender -} WXTracingTag; - - -@interface WXTracingApi:NSObject - -@property (nonatomic, copy) NSString *name; // -@property (nonatomic, copy) NSString *className; // -@property (nonatomic, copy) NSString *method; // - -@end - -@interface WXTracing:NSObject - -@property (nonatomic, copy) NSString *ref; // compnonet id -@property (nonatomic, copy) NSString *parentRef; // compnonet id -@property (nonatomic, copy) NSString *className; // compnonet class name or module class name -@property (nonatomic, copy) NSString *name; // register name -@property (nonatomic, copy) NSString *ph; // phase -@property (nonatomic) NSTimeInterval ts; // time -@property (nonatomic) long long traceId; -@property (nonatomic) NSTimeInterval duration; -@property (nonatomic, copy) NSString *fName; // functionName -@property (nonatomic, copy) NSString *iid; // instance id -@property (nonatomic, copy) NSString *parentId;// parent event id - -@end - -@interface WXTracingTask:NSObject - -@property (nonatomic, copy) NSString *iid; -@property (nonatomic) long long counter; -@property (nonatomic, copy) NSString *tag; -@property (nonatomic, strong) NSMutableArray *tracings; -@property (nonatomic, copy) NSString *bundleJSType; // - -@end - -@interface WXTracingManager : NSObject -+(void)switchTracing:(BOOL)isTracing; -+(BOOL)isTracing; -+(void)startTracing:(WXTracing*)tracing; -+(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId; -+(WXTracingTask*)getTracingData; -+(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid; -+(void)getTracingData:(NSString *)instanceId; -+(NSDictionary *)getTacingApi; - -@end http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m deleted file mode 100644 index 2d7a29a..0000000 --- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#import "WXTracingManager.h" -#import "WXComponentFactory.h" -#import "WXModuleFactory.h" -#import "WXSDKManager.h" -#import <WeexSDK/WXComponentFactory.h> -#import <WeexSDK/WXModuleFactory.h> -#import <WeexSDK/WXHandlerFactory.h> - - -@implementation WXTracing - -@end - -@implementation WXTracingTask - -@end - -@interface WXTracingManager() - -@property (nonatomic) BOOL isTracing; -@property (nonatomic, strong) NSMutableDictionary *tracingTasks; // every instance have a task -@property (nonatomic, copy) NSString *currentInstanceId; // every instance have a task - -@end - -@implementation WXTracingManager - - -+ (instancetype) sharedInstance{ - - static WXTracingManager *instance = nil; - static dispatch_once_t once; - - dispatch_once(&once, ^{ - instance = [[WXTracingManager alloc] initPrivate]; - }); - - return instance; -} - -- (instancetype) initPrivate{ - self = [super init]; - if(self){ - self.isTracing = YES; - } - - return self; -} - -+(void)switchTracing:(BOOL )isTracing -{ - [WXTracingManager sharedInstance].isTracing = isTracing; -} - -+(BOOL)isTracing -{ -#if DEBUG - return YES; - return [WXTracingManager sharedInstance].isTracing; -#else - return NO; -#endif -} - -+(void)startTracing:(WXTracing *)tracing -{ - if([self isTracing]){ - if(![WXTracingManager sharedInstance].tracingTasks){ - [WXTracingManager sharedInstance].tracingTasks = [NSMutableDictionary new]; - } - if(![[WXTracingManager sharedInstance].tracingTasks objectForKey:tracing.iid]){ - WXTracingTask *task = [WXTracingTask new]; - task.iid = tracing.iid; - [[WXTracingManager sharedInstance].tracingTasks setObject:task forKey:tracing.iid]; - } - WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:tracing.iid]; - if(!task.tracings){ - task.tracings = [NSMutableArray new]; - } - NSTimeInterval time=[[NSDate date] timeIntervalSince1970]*1000; - tracing.ts = time; - if(![WXTracingEnd isEqualToString:tracing.ph]){ // end is should not update - tracing.traceId = ++task.counter; - } - if([WXTNetworkHanding isEqualToString:tracing.name] && [WXTracingBegin isEqualToString:tracing.ph]){ - task.tag = WXTNetworkHanding; - } - NSTimeInterval ts = [[NSDate date] timeIntervalSince1970]*1000; - tracing.ts = ts ; - dispatch_async(dispatch_get_main_queue(), ^{ - [self updateTracings:task tracing:tracing]; - }); - } -} - -+(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid -{ - if([self isTracing] && iid.length >0){ - WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:iid]; - if(jsBundleString.length >0){ - NSRange range = [jsBundleString rangeOfString:@"}"]; - if (range.location != NSNotFound) { - NSString *searchStr = [jsBundleString substringToIndex:range.location+range.length]; - if ([searchStr rangeOfString:@"Vue"].location != NSNotFound){ - task.bundleJSType = @"Vue"; - }else if([searchStr rangeOfString:@"Rax"].location != NSNotFound){ - task.bundleJSType = @"Rax"; - } - } - } - } -} - -+(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId -{ - if([self isTracing]){ - WXTracing *tracing = [WXTracing new]; - if(ref.length>0){ - tracing.ref = ref; - } - if(parentRef.length>0){ - tracing.parentRef = parentRef; - } - if(className.length>0){ - tracing.className = className; - } - if(name.length>0){ - tracing.name = name; - } - if(fName.length>0){ - tracing.fName = fName; - } - if(ph.length>0){ - tracing.ph = ph; - } - if(iid.length>0){ - tracing.iid = iid; - } - if(parentId.length>0){ - tracing.parentId = parentId; - } - [self startTracing:tracing]; - } -} - -+(WXTracing *)copyTracing:(WXTracing *)tracing -{ - WXTracing *newTracing = [WXTracing new]; - if(tracing.ref.length>0){ - newTracing.ref = tracing.ref; - } - if(tracing.parentRef.length>0){ - newTracing.parentRef = tracing.parentRef; - } - if(tracing.className.length>0){ - newTracing.className = tracing.className; - } - if(tracing.name.length>0){ - newTracing.name = tracing.name; - } - if(tracing.fName.length>0){ - newTracing.fName = tracing.fName; - } - if(tracing.ph.length>0){ - newTracing.ph = tracing.ph; - } - if(tracing.iid.length>0){ - newTracing.iid = tracing.iid; - } - if(tracing.parentId.length>0){ - newTracing.parentId = tracing.parentId; - } - if(tracing.traceId>0){ - newTracing.traceId = tracing.traceId; - } - if(tracing.ts>0){ - newTracing.ts = tracing.ts; - } - return newTracing; -} - -+(NSString *)getclassName:(WXTracing *)tracing -{ - NSString *className = @""; - if(tracing.ref.length>0 && tracing.name.length >0){ - Class cls = [WXComponentFactory classWithComponentName:tracing.name]; - className = NSStringFromClass(cls); - }else if(tracing.name.length > 0){ - Class cls = [WXModuleFactory classWithModuleName:tracing.name]; - if(cls){ - className = NSStringFromClass(cls); - } - } - return className; -} - -+(void)updateTracings:(WXTracingTask *)task tracing:(WXTracing *)tracing -{ - if(![WXTJSCall isEqualToString:tracing.name]){ - tracing.className = [self getclassName:tracing]; - } - if([WXTNetworkHanding isEqualToString:task.tag]){ - if([WXTDataHanding isEqualToString:tracing.name]){ - NSMutableArray *tracings = task.tracings; - [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { - if(([WXTNetworkHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ - WXTracing *newTracing = [self copyTracing:bTracing]; - newTracing.iid = tracing.iid; - newTracing.ph = WXTracingEnd; - newTracing.ts = tracing.ts ; - newTracing.duration = newTracing.ts - bTracing.ts ; - bTracing.duration = newTracing.duration; - [task.tracings addObject:newTracing]; - NSLog(@"jerry0 %f,%f",bTracing.ts,bTracing.duration); - *stop = YES; - } - }]; - task.tag = WXTDataHanding; - } - } - - if([WXTDataHanding isEqualToString:task.tag]){ - if([WXTJSCall isEqualToString:tracing.name]){ - NSMutableArray *tracings = task.tracings; - [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { - if(([WXTDataHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ - WXTracing *newTracing = [self copyTracing:bTracing]; - newTracing.iid = tracing.iid; - newTracing.ph = WXTracingEnd; - newTracing.ts = tracing.ts ; - newTracing.duration = newTracing.ts - bTracing.ts ; - bTracing.duration = newTracing.duration; - [task.tracings addObject:newTracing]; - NSLog(@"jerry1 %f,%f",bTracing.ts,bTracing.duration); - *stop = YES; - } - }]; - task.tag = WXTRender; - } - } - if([WXTracingEnd isEqualToString:tracing.ph]){ // deal end - NSMutableArray *tracings = task.tracings; - [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { - if(tracing.ref.length > 0 && bTracing.ref.length>0){ - if(![tracing.ref isEqualToString:bTracing.ref]){ - return ; - } - } - - if([bTracing.fName isEqualToString:tracing.fName] &&[WXTracingBegin isEqualToString:bTracing.ph]){ - tracing.iid = bTracing.iid; - if(bTracing.ref.length > 0){ - tracing.ref = bTracing.ref; - } - tracing.duration = tracing.ts - bTracing.ts ; - tracing.traceId = bTracing.traceId; - bTracing.duration = tracing.duration; - NSLog(@"jerry2 %f,%f",bTracing.ts,bTracing.duration); - *stop = YES; - } - }]; - } - [task.tracings addObject:tracing]; -} - -+(WXTracingTask *)getTracingData -{ - NSArray *instanceIds = [[WXSDKManager bridgeMgr] getInstanceIdStack]; - WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:[instanceIds firstObject]]; - return task; -} - -+(void)getTracingData:(NSString *)instanceId{ - WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:instanceId]; - NSArray *tracings = [task.tracings copy]; - for (WXTracing *tracing in tracings) { - if(![WXTracingBegin isEqualToString:tracing.ph]){ -// NSLog(@"%lld %@ %@ %@ %f %f %@ %@",tracing.traceId,tracing.fName,tracing.name,tracing.className,tracing.ts,tracing.duration,tracing.ref,tracing.parentRef); - } - } -} - -+(NSDictionary *)getTacingApi -{ - NSMutableDictionary *dict = [NSMutableDictionary new]; - NSMutableArray *componetArray = [NSMutableArray new]; - NSMutableArray *moduleArray = [NSMutableArray new]; - NSMutableArray *handleArray = [NSMutableArray new]; - NSDictionary *componentConfigs = [WXComponentFactory componentConfigs]; - void (^componentBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { - NSMutableDictionary *componentConfig = [mObj mutableCopy]; - NSDictionary *cDict = [WXComponentFactory componentMethodMapsWithName:componentConfig[@"name"]]; - if(cDict && [cDict count]>0 && [cDict[@"methods"] count]>0){ - [componentConfig setObject:cDict[@"methods"] forKey:@"methods"]; - } - [componetArray addObject:componentConfig]; - }; - [componentConfigs enumerateKeysAndObjectsUsingBlock:componentBlock]; - if(componetArray && [componetArray count]>0){ - [dict setObject:componetArray forKey:@"componet"]; - } - NSDictionary *moduleConfigs = [WXModuleFactory moduleConfigs]; - void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { - NSDictionary *mDict = [WXModuleFactory moduleMethodMapsWithName:mKey]; - NSMutableDictionary *subDict = [NSMutableDictionary new]; - [subDict setObject:mKey forKey:@"name"]; - [subDict setObject:mObj forKey:@"class"]; - if([mDict objectForKey:mKey]){ - [subDict setObject:[mDict objectForKey:mKey] forKey:@"methods"]; - } - [moduleArray addObject:subDict]; - }; - [moduleConfigs enumerateKeysAndObjectsUsingBlock:moduleBlock]; - if(moduleArray && [moduleArray count]>0){ - [dict setObject:moduleArray forKey:@"module"]; - } - - - NSDictionary *handleConfigs = [[WXHandlerFactory handlerConfigs] mutableCopy]; - void (^handleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { - NSMutableDictionary *subDict = [NSMutableDictionary new]; - [subDict setObject:mKey forKey:@"class"]; - [subDict setObject:NSStringFromClass([mObj class]) forKey:@"name"]; - [handleArray addObject:subDict]; - }; - [handleConfigs enumerateKeysAndObjectsUsingBlock:handleBlock]; - if(handleArray && [handleArray count]>0){ - [dict setObject:handleArray forKey:@"handle"]; - } - - return dict; -} - -@end