Skip to content

Mars 常见问题

garryyan edited this page Jan 3, 2017 · 36 revisions

通用问题

Mars 包括服务端吗?

Mars 只是一个客户端的解决方案,并不包括服务端的代码。 如果使用 Mars 中的 STN,需要客户端和服务端对应好协议把服务端实现了。

Mars 中的 STN 和 Xlog 可以在一个应用多个进程中使用吗?

STN 不可以,也不建议,如果你执意这么做,请给getAppFilePath的回调返回不同的路径。 Xlog 可以,只需要你传参数的时候日志的前缀不要传相同的就行。

如果我已经有现有服务器端了,客户端想使用 Mars,需要服务器做什么工作?

如果你已经深入了解了 Mars,感觉自己适合使用 Mars的,需要先理解长短连协议和加解包的区别。不论之前使用的哪种方式,长短连的协议是必须有的,你需要参照自定义扩展把长短连协议和服务器端对齐, 至于加解包逻辑是在 Req2Buf 和 Buf2Resp 回调中做的,给上实现就可以了。关于长短连协议的理解和 req2Buf buf2Resp 的理解可以看一个例子:就像你用 HTTP 发一个 json 数据 HTTP 就类似 Mars 的长短连协议, json 的组装和解析就是 req2Buf 和 buf2Resp 来做的

使用了Mars发现接收比较大的数据比较容易失败,是什么原因?

Mars 主要针对信令数据而设计的,如果一个数据需要接收时间比较长,会被认为超时,建议单个数据包不要超过 64 k

我在自己机器上启动 demo 中的 server, 为什么一直在 Downloading gradle,卡了很久。

运行server前,如果你本机没有安装过gradle, 会自动安装。如果一直卡住,建议翻墙或者更换VPN试试。

一个任务在 Mars 中流转的流程是怎么样的?

一个任务以 startTask 为开始,以 onTaskEnd 为结束。 首先调用 startTask-> 如果你的任务设置了 limit_flow=true 或者 limit_frequency=true 会进行防雪崩检测 -> 如果设置了need_authed = true 会回调 makesureAuth 询问是否已经是登陆态,不是的话需要上层异步去登陆,底层任务会等待-> 回调 req2Buf 进行打包-> 如果send_only = false 就是需要等待回包, 不需要等待的话会直接调用 onTaskEnd -> 收到回包回调上层 buf2Resp 进行解包 -> onTaskEnd。关于长短连协议的理解和 req2Buf buf2Resp 的理解可以看一个例子:就像你用 HTTP 发一个 json 数据 HTTP 就类似 Mars 的长短连协议, json 的组装和解析就是 req2Buf 和 buf2Resp 来做的

Mars 中哪些模块是可以独立使用的?

Xlog 是可以独立使用的,SDT 暂时不可以单独使用。

Xlog 文件怎么查看?

如果没有修改相关逻辑,使用的默认实现的话,解压脚本在log/crypt/decode_mars_log_file.py

Xlog 目录下存放的 mmap2 文件有什么用?

mmap2 文件为 Xlog 的缓存文件,不用关注,真正的日志内容在以 xlog 为后缀的文件中。

为什么我使用了 Xlog 会感觉应用卡顿?

使用 Xlog 的时候请尽量不要使用同步模式,同步模式会直接写文件,同步模式主要为了调试环境用的。推荐的模式为异步模式,INFO级别。 #Android

执行 python build_android.py 编译错误

先区分是否是 python 的语法错误,如果是,请先确保 python 版本为2.7x, 如果是编译过程中的错误,请确保使用的 ndk 版本为 ndk-r11c 以上。如若仍然不能解决,请联系我们。

如何调试

目前 Mars 的项目组织方式在 Android 平台下调试并不友好,建议通过 xlog 输出的信息进行排查问题。

为什么我的 xlog 文件使用 decode_mars_log.py 解出来有很多错误存在?

目前 xlog 不支持多个进程写到同一个文件中,先确认是否是因为多个进程把日志写到同一个文件所致。

打开 xlog 的 sample 报:…………libmarsxlog.so exists or that its paths is correct……

如果出现下图: 请重试直到这个 tips 消失。如果一直重试不成功可以尝试把下面的代码先注释掉再 Try Again。成功后再取消掉:

多进程应用使用 Mars 应该注意什么?

调用 native 函数前一定要确保包含 native 函数的实现的 so 是在本进程中,如果不在,可能需要跨进程调用或者先 load so。

native 代码的 crash 监控应该怎么做?

mars 是经过微信验证过的,稳定性方面是有保证的。不过你依然可以有自己的 crash 监控模块。 native crash 捕捉原理是基于 linux 的信号机制进行堆栈回溯。具体实现可以参考 Android 内核源码中 libunwind 和 libcorkscrew。不建议使用 dlopen 进行调用,因为安全问题谷歌会在不久的将来禁止 dlopen 系统库(个别库除外)。 第三方 crash 捕捉服务推荐使用 Bugly

为什么长连断之后很长时间都不去尝试连?

考虑用户的电量和流量,长连的连接策略会根据应用的前后台而不同。 请先确认是否忘记在前后台切换时主动调用

BaseEvent.onForeground(boolean);

#iOS/OS X

为什么 Apple 系平台没有通过 CocoaPods 来管理类库?

我们一直认为合适的才是最好的。Mars 是有很多子项目,每个子项目是单独的编译配置,这点 CocoaPods 做不到,因为 CocoaPods 是一个项目文件,如果引入 CocoaPods 就必须多维护一套编译脚本,而且丢失了我们目前多个子项目的优势,所以并不适合我们的项目。

打开 Mars 时,为什么有时某个子项目无法展开?

请确认是否已经在 xcode 中单独打开了该子项目,如果已经单独打开,请先关闭,再打开 Mars。

编译时为什么提示 "string not found" 或其他 C/C++ 头文件找不到的错误?

请确认直接调用 C/C++接口的 Objc 源文件是否都是 .mm 后缀,如果不是,请把 .m 后缀改为 .mm 。

为什么编译 demo 时 xcode 的进度条一直没进度,感觉被卡住了?

为了保证使用的 Mars 代码是最新代码,每次编译 demo 都会通过 Run Script 编译 Mars。 如果已经编译过一次,可以把 Run Script 移除,防止重复编译。

为什么使用脚本编译的 framework 链接运行没问题,但是调试过程中会中断言?

使用编译脚本编译的 framework 是 release 版本的,即使中断言,也只会打一行日志,并不会导致程序退出,调试过程中生成的 Mars 的库是 debug 版本的,中断言会导致程序退出。 中断言一般因为某些 callback 没有设置,或者 callback 中的某个函数没有实现,请结合堆栈进行分析。

为什么长连断之后很长时间都不去尝试连?

考虑用户的电量和流量,长连的连接策略会根据应用的前后台而不同。 请先确认是否忘记在前后台切换时主动调用

mars::baseevent::OnForeground(isForground);

更多的使用范例,大家请仔细阅读Sample。使用过程中有任何问题或建议,欢迎联系我们!