Giter Site home page Giter Site logo

didi / echo Goto Github PK

View Code? Open in Web Editor NEW
1.0K 21.0 116.0 2.93 MB

Echo是一款桌面端调试工具,旨在提高客户端的研发调试效率

License: Apache License 2.0

Ruby 0.74% Objective-C 94.43% JavaScript 0.64% CSS 0.51% HTML 0.88% C 2.81%
echo ios tools debug mac

echo's Introduction

Echo是一款客户端的桌面端调试工具,中文意思回声,寓意着Mac端和手机端之间就像回声一样相互联动。

背景

客户端在研发调试阶段基本都会集成一些debug工具,用来显示App的网络请求、卡顿检测结果等调试信息,以辅助RD&QA发现定位问题。目前的debug工具基本都是内置在App中。这些小屏调试工具虽然可以满足客户端相关开发同学的日常研发需求,但是同样存在着一些问题:

  • 由于手机屏幕的限制,现有的debug工具在数据展示、辅助功能等方便不够丰富,在浏览以及功能操作上体验一般
  • 研发调试过程中需要频繁在App和debug工具之间切换,通过功能切换完成问题验证和分析,这会打断我们在App的页面操作,使用低效。通常,为了研发调试时有更好的体验,我们可能会更习惯使用Charles、Reveal等Mac端软件来实现调试需求
  • Debug工具其实是各种小调试能力的集合,现有的Debug工具基本是在展示入口上完成了聚集,一个新的调试能力的集成往往需要从零开始,扩展成本高

基于以上现状和问题,Echo大屏调试工具不仅可以满足客户端的研发调试需求,相比其他debug工具,它还具有以下优势:

  • 大屏幕:显示效果更优,不影响原App的用户操作,使用体验更好
  • 扩展性:内置通用模板及插件机制可快速扩展新功能,只需关注业务数据即可,降低新功能扩展成本
  • 聚合型:收敛客户端研发调试工具为一体,提高RD和QA同学的效率
  • 缓存机制:插件自带缓存机制,出现问题时即使脱离大屏,后续也可快速连接排查定位

介绍

Echo是一款简单易用、插件化易扩展、大屏显示和操作的客户端研发调试工具,可以实时查看App各类数据(网络请求、日志、埋点等),也可以无须改动代码快速修改预览App的效果。

img

特点

  • 简单易用:将Echo和App连接到同一个局域网即可,无须额外配置。
  • 功能齐全:目前已拥有网络请求、视图层级查看修改等10几个功能,覆盖了客户端研发的大部分场景。
  • 高扩展性:插件和模块机制可以方便我们快速添加新功能。

功能

目前Echo已支持的功能模块分为四部分:

  • 基础功能:网络请求、NSUserDefaults查看修改、日志查看、Crash查看、GPS模拟、通知查看
  • UI视图:视图层级查看修改、视图边框查看
  • 性能检测:内存泄漏、卡顿检测
  • 业务功能:基于插件能力可快速扩展你自己的业务插件能力

扩展性

插件

在功能章节介绍的每个能力在开发时都被抽象为一个插件,每个插件只需要关注要采集的数据及操作的响应即可,这样的设定便于我们快速的扩展新的功能。下面介绍如何快速的扩展一个新的插件:

1、新建一个继承自ECOBasePlugin的插件类,同时在init方法中设置插件名称以及注册渲染的UI模板。

+ (void)load {
    //注册插件
    [[ECOClient sharedClient] registerPlugin:[self class]];
}
- (instancetype)init {
    self = [super init];
    if (self) {
        self.name = @"日志";
        [self registerTemplate:ECOUITemplateType_ListDetail data:nil];
    }
    return self;
}

2、如果你想在SDK连接到Mac客户端时发送连接数据或其他功能参数,请覆写device:didChangedAuthState:方法:

//连接状态变更
- (void)device:(ECOChannelDeviceInfo *)device didChangedAuthState:(BOOL)isAuthed {
    if (isAuthed) {
        id yourData = "要发送的信息";
        !self.deviceSendBlock ?: self.deviceSendBlock(device, yourData);
    }
}

3、如果你想处理Mac客户端发送的命令,请覆写didReceivedPacketData:方法:

#pragma mark - ECOBasePlugin methods
- (void)didReceivedPacketData:(id)data {
    // 在这里实现你自己的业务功能
    NSDictionary *dict = (NSDictionary *)data;
}

以上就是扩展新插件的步骤,新插件只需要关注自己的数据逻辑即可,扩展接入时都比较方便。

模板

在Echo的mac客户端中,内置了List-Detail、Outline和H5三个通用模板,满足了大部分业务插件的显示需求,即使不懂Mac开发也能快速的接入。 对于熟悉Mac开发的同学或者有自定义要求的同学,可以构建自己的插件模板显示,接入时只需要将模板名称与UI在Echo中做映射即可。

技术方案

img

img

如何使用

1、添加CocoaPods依赖

pod 'EchoSDK', :configurations => ["Debug"]

2、由于iOS14系统本地网络权限限制,需在工程的Info.plist文件中添加NSLocalNetworkUsageDescription和NSBonjourServices配置。在Xcode中选中Info.plist文件,右键选择Open As Source Code,并添加如下内容:

<key>NSLocalNetworkUsageDescription</key>
<string></string>
<key>NSBonjourServices</key>
<array>
	<string>_ECHO._tcp</string>
</array>

在Xcode中显示效果如下图:

img

3、在App启动时添加以下代码

#ifdef DEBUG
#import <EchoSDK/ECOClient.h>
#endif

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    #ifdef DEBUG
    	[[ECOClient sharedClient] start];
    #endif
}

4、启动Echo的Mac端

手动build工程的话,可以在/Mac目录下执行pod install之后,启动Echo.xcworkspace并运行。

iOS14 适配

iOS14系统对本地网络权限进行了更严格的限制,鉴于Echo底层用到了Bonjour服务,在Xcode12之后需要在工程的Info.plist文件中添加NSLocalNetworkUsageDescription和NSBonjourServices配置。在Xcode中选中Info.plist文件,右键选择Open As Source Code,并添加如下内容:

<key>NSLocalNetworkUsageDescription</key>
<string></string>
<key>NSBonjourServices</key>
<array>
	<string>_ECHO._tcp</string>
</array>

添加之后在Xcode中显示效果如下图:

img

注:即使不进行上述适配,Echo的自动连接功能仍会生效:你可以通过USB连接真机或者直接在同一台电脑上运行模拟器来实现自动连接。

感谢

在开发过程中,Echo使用和参考了以下优秀项目的部分代码

协议

Apache-2.0 license

Echo 基于 Apache-2.0 协议进行分发和使用,更多信息参见 协议文件

echo's People

Contributors

bb9z avatar cocoa-chen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

echo's Issues

Xcode12 、真机iOS14状态下崩溃

image

Xcode12 、真机iOS14状态下崩溃在
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[ECOCoreManager shared] sendPacketData:data type:type plugin:plugin toDevice:device];
});

//发送数据

  • (void)plugin:(__kindof ECOBasePlugin *)plugin willSendData:(id)data type:(ECOPacketDataType)type toDevice:(ECOChannelDeviceInfo *)device {
    // NSLog(@"<<[ECOPluginsManager] %@ plugin sendData:%@", plugin.pluginName, data);
    //封装数据
    if (!data) {
    return;
    }
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [[ECOCoreManager shared] sendPacketData:data type:type plugin:plugin toDevice:device];
    });
    }

Xcode13 内部 fishhook崩溃

使用设备
iPhone12 Pro Max iOS15.0 19A346
真机与模拟器都会崩溃

在Echo初始化方法hookNSLog里使用了fishhook加了一个钩子,调用rebind_symbols方法时产生了崩溃

崩溃日志
2021-09-22 17:31:40.746202+0800 [568:30569] [unspecified] An empty string is not a valid group container identifier.
2021-09-22 17:31:40.746230+0800 [568:30569] [unspecified] container_create_or_lookup_app_group_path_by_app_group_identifier: client sent invalid parameters

堆栈信息
frame #0: 0x00000001037220bc EchoDemoperform_rebinding_with_section(rebindings=0x0000000282c9cb40, section=0x000000010a7a8420, slide=4470767616, symtab=0x000000010a7d9bf0, strtab="", indirect_symtab=0x000000010a7ddb90) at fishhook.c:104:39 frame #1: 0x0000000103721da4 EchoDemorebind_symbols_for_image(rebindings=0x0000000282c9cb40, header=0x000000010a7a8000, slide=4470767616) at fishhook.c:169:11
frame #2: 0x0000000103721ed8 EchoDemo_rebind_symbols_for_image(header=0x000000010a7a8000, slide=4470767616) at fishhook.c:178:5 frame #3: 0x000000010a347930 dyldinvocation function for block in dyld4::APIs::_dyld_register_func_for_add_image(void ()(mach_header const, long)) + 200
frame #4: 0x000000010a3406f4 dylddyld4::RuntimeState::withLoadersReadLock(void () block_pointer) + 92 frame #5: 0x000000010a3697f8 dylddyld4::APIs::_dyld_register_func_for_add_image(void ()(mach_header const, long)) + 148
frame #6: 0x0000000103721e48 EchoDemorebind_symbols(rebindings=0x000000016f2146e0, rebindings_nel=1) at fishhook.c:200:5 frame #7: 0x0000000101124890 EchoDemo-[ECONSLogManager hookNSLog](self=0x0000000282c9cb00, _cmd="hookNSLog") at ECONSLogManager.m:70:5
frame #8: 0x00000001011247f8 EchoDemo`-[ECONSLogManager init](self=0x0000000282c9cb00, _cmd="init") at ECONSLogManager.m:48:9

sanbox 功能

希望弄一个修改沙盒的插件,其他功能很多别的产品都有

Xcode 12.0 beta 5 有个奔溃问题

首先感谢

感谢滴滴大佬开源了一款这么好用的工具, 在我们开发使用起来真的非常的方便.

目前的问题

在使用 xcode 11 的时候没有任何问题 , 更新到Xcode 12.0 beta 5 版本后 . 使用的时候发生奔溃. 最后根据定位发现问题出现在 ECOnetServiceBrowser 这个里面,
WX20200907-115500.png-923.7kB

WechatIMG311.png-957.2kB

发现是一直在进行失败重新启动 resetBrowserService
如果注释掉 [self resetBrowserService]; 就没有了崩溃现象, 但是 echo 中也没有了查看网络请求的功能, 由于技术能力有限, 实在不知道问题出现在哪里.

期望

希望滴滴大佬在百忙之中能注意下这个问题, 看能否给与解决一下.

网络阻塞问题

项目中有图片视频上传的操作,这些操作会导致app网络阻塞,所有网络请求全部超时,必须重新启动app才能恢复。
网络断开时Mac端会打印日志
Log content:
-[ECONetServiceBrowser netServiceDidStop:]

编译报错

你好,按照我们的接入流程接入之后,编译失败,截图如下
image

为什么不用Swift呢

请问下,既然这个项目是新的,为啥不用Swift呢。毕竟swift写起来比OC舒服多了,语法也有更多特性。

Podfile文件中:generate_multiple_pod_projects = true,找不到头文件

Podfile文件:

install! 'cocoapods', 
generate_multiple_pod_projects: true,
disable_input_output_paths: true

这种情况下,EocWatchDog.m 文件中,找不到 BSBacktraceLogger.h 头文件;
generate_multiple_pod_projects = false 时,是没问题的。等于 true 的情况,该如何解决,还请指教~
error

网络请求无法看到入参

项目中引入框架试了下,刷新界面网络请求只能看到出参,看不到body入参,并且清空日志的时候只能清空每次网络请求,下边的Request``Response均无法清空

网络监控内存泄漏

ECONSURLProtocol 对象一直未销毁 ,通过Xcode Debug Memory Graph观察内存表发现对一个拥有云端访问的瀑布流,频繁push和pop,该对象无限增长
E5C2012A-65A0-4BE0-AF46-1FD8F7F3AD29

真机奔溃

WX20200706-170737

[[ECOClient sharedClient] start];启动直接崩溃

型号:iPhone XS Max
系统:13.4.1
Xcode:11.5

fishhook的问题

QRCode转码的第三方,在执行到下面这一行代码的时候,fishhook导致了崩溃
CIFilter *fileter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
麻烦升级一下fishhook的版本

Undefined symbols for architecture arm64

Undefined symbols for architecture arm64:
"OBJC_CLASS$_FBObjectiveCObject", referenced from:
objc-class-ref in FBObjectiveCObject+EchoFixNSMapTableCrash.o
_OBJC$CATEGORY_FBObjectiveCObject$_EchoFixNSMapTableCrash in FBObjectiveCObject+EchoFixNSMapTableCrash.o
"OBJC_CLASS$_FBRetainCycleDetector", referenced from:
objc-class-ref in ECOMLeaksMessenger.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Showing All Messages
Undefined symbol: OBJC_CLASS$_FBObjectiveCObject

Showing All Messages
Undefined symbol: OBJC_CLASS$_FBRetainCycleDetector

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.