微信Mars 组件 GitHub - Tencent/mars: Mars is a cross-platform network component developed by WeChat.
Mars
Mars 是微信官方的跨平台跨业务的终端基础组件。
- comm:可以独立使用的公共库,包括 socket、线程、消息队列、协程等;
- xlog:高可靠性高性能的运行期日志组件;
- SDT: 网络诊断组件;
- STN: 信令分发网络模块,也是 Mars 最主要的部分。
Samples
sample 的使用请参考 这里。
Getting started
接入 Android或者 iOS/OS X或者 Windows。
Android
gradle 接入我们提供了两种接入方式: mars-wrapper或者 mars-core。如果你只是想做个 sample 推荐使用 mars-wrapper,可以快速开发;但是如果你想把 mars 用到你的 app 中的话,推荐使用 mars-core,可定制性更高。
mars-wrapper
在 app/build.gradle 中添加 mars-wrapper 的依赖:
dependencies { compile 'com.tencent.mars:mars-wrapper:1.1.8' }
或者
mars-core
在 app/build.gradle 中添加 mars-core 的依赖:
dependencies { compile 'com.tencent.mars:mars-core:1.2.1' }
或者
mars-xlog
如果只想使用 xlog,可以只加 xlog 的依赖(mars-core,mars-wrapper 中都已经包括 xlog):
dependencies { compile 'com.tencent.mars:mars-xlog:1.0.6' }
接着往下操作之前,请先确保你已经添加了 mars-wrapper 或者 mars-core 或者 mars-xlog 的依赖
Xlog Init
在程序启动加载 Xlog 后紧接着初始化 Xlog。但要注意如果你的程序使用了多进程,不要把多个进程的日志输出到同一个文件中,保证每个进程独享一个日志文件。而且保存 log 的目录请使用单独的目录,不要存放任何其他文件防止被 xlog 自动清理功能误删。
System.loadLibrary("stlport_shared");System.loadLibrary("marsxlog");finalStringSDCARD=Environment.getExternalStorageDirectory().getAbsolutePath();finalStringlogPath=SDCARD+"/marssample/log";//this is necessary, or may cash for SIGBUSfinalStringcachePath=this.getFilesDir()+"/xlog"//init xlogif(BuildConfig.DEBUG) {Xlog.appenderOpen(Xlog.LEVEL_DEBUG,Xlog.AppednerModeAsync, cachePath, logPath,"MarsSample","");Xlog.setConsoleLogOpen(true); }else{Xlog.appenderOpen(Xlog.LEVEL_INFO,Xlog.AppednerModeAsync, cachePath, logPath,"MarsSample","");Xlog.setConsoleLogOpen(false); }Log.setLogImp(newXlog());
程序退出时关闭日志:
Log.appenderClose();
STN Init
如果你是把 mars-core 作为依赖加入到你的项目中的话,你需要显式的初始化和反初始化 STN
在使用 STN 之前进行初始化
//set callbackAppLogic.setCallBack(stub);StnLogic.setCallBack(stub);SdtLogic.setCallBack(stub);//Initialize the Mars PlatformCommMars.init(getApplicationContext(),newHandler(Looper.getMainLooper()));//Initialize the MarsStnLogic.setLonglinkSvrAddr(profile.longLinkHost(), profile.longLinkPorts());StnLogic.setShortlinkSvrAddr(profile.shortLinkPort());StnLogic.setClientVersion(profile.productID());Mars.onCreate(true);BaseEvent.onForeground(true);StnLogic.makesureLongLinkConnected();
初始化顺序不一定要严格遵守上述代码的顺序,但在初始化时首先要调用 setCallBack 接口 (callback 文件的编写可以参考 demo),再调用 Mars.init,最后再调用 onForeground 和 makesureLongLinkConnect,中间顺序可以随意更改。 注意:STN 默认是后台,所以初始化 STN 后需要主动调用一次 BaseEvent.onForeground(true)
需要释放 STN 或者退出程序时:
Mars.onDestroy();
Event Change
网络切换时:
BaseEvent.onNetworkChange()
如果你是把 mars-wrapper 作为依赖加入到你的项目中,你只需要显式的初始化 STN,不需要反初始化(因为 mars-wrapper 会进行反初始化)
MarsServiceProxy.init(this, getMainLooper(),null);
不管你是使用 mars-wrapper 还是 mars-core,你都需要特别注意以下事件:
前后台切换:
BaseEvent.onForeground(boolean);
应用的账号信息更改:
StnLogic.reset();
如果你想修改 Xlog 的加密算法或者长短连的加解包部分甚至更改组件的其他部分,可以参考 这里
iOS/OS X
编译
python build_apple.py
把 mars.framework 作为依赖加入到你的项目中,把和 mars.framework 同目录的后缀名为 rewriteme 的文件名删掉".rewriteme"和头文件一起加入到你的项目中。
Xlog Init
在程序启动加载 Xlog 后紧接着初始化 Xlog。但要注意保存 log 的目录请使用单独的目录,不要存放任何其他文件防止被 xlog 自动清理功能误删。
NSString* logPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/log"];//set do not backup for logpathconstchar* attrName ="com.apple.MobileBackup";u_int8_tattrValue =1;setxattr([logPath UTF8String], attrName, &attrValue,sizeof(attrValue), 0, 0);//init xlogger#ifDEBUGxlogger_SetLevel(kLevelDebug);appender_set_console_log(true); #elsexlogger_SetLevel(kLevelInfo);appender_set_console_log(false); #endifappender_open(kAppednerAsync, [logPath UTF8String],"Test","");
在函数 "applicationWillTerminate" 中反初始化 Xlog
appender_close();
STN Init
在你用 STN 之前初始化:
- (void)setCallBack {mars::stn::SetCallback(mars::stn::StnCallBack::Instance());mars::app::SetCallback(mars::app::AppCallBack::Instance()); } - (void) createMars {mars::baseevent::OnCreate(); } - (void)setClientVersion:(UInt32)clientVersion {mars::stn::SetClientVersion(clientVersion); } - (void)setShortLinkDebugIP:(NSString*)IP port:(constunsignedshort)port { std::stringipAddress([IPUTF8String]);mars::stn::SetShortlinkSvrAddr(port, ipAddress); } - (void)setShortLinkPort:(constunsignedshort)port {mars::stn::SetShortlinkSvrAddr(port); } - (void)setLongLinkAddress:(NSString*)string port:(constunsignedshort)port debugIP:(NSString*)IP { std::stringipAddress([stringUTF8String]); std::stringdebugIP([IPUTF8String]); std::vector<uint16_t> ports; ports.push_back(port);mars::stn::SetLonglinkSvrAddr(ipAddress,ports,debugIP); } - (void)setLongLinkAddress:(NSString*)string port:(constunsignedshort)port { std::stringipAddress([stringUTF8String]); std::vector<uint16_t> ports; ports.push_back(port);mars::stn::SetLonglinkSvrAddr(ipAddress,ports); } - (void)reportEvent_OnForeground:(BOOL)isForeground {mars::baseevent::OnForeground(isForground); } - (void)makesureLongLinkConnect {mars::stn::MakesureLonglinkConnected(); }
初始化顺序不一定要严格遵守上述代码的顺序,但在初始化时首先要调用 setCallBack 接口 (callback 文件的编写可以参考 demo),再调用 Mars.init,最后再调用 onForeground 和 makesureLongLinkConnect,中间顺序可以随意更改。 注意:STN 默认是后台,所以初始化 STN 后需要主动调用一次 BaseEvent.onForeground(true)
需要释放 STN 或者退出程序时:
- (void)destroyMars {mars::baseevent::OnDestroy(); }
Event Change
前后台切换时:
- (void)reportEvent_OnForeground:(BOOL)isForeground {mars::baseevent::OnForeground(isForeground); }
网络切换时:
- (void)reportEvent_OnNetworkChange {mars::baseevent::OnNetworkChange(); }
Windows
安装Visual Studio 2015
编译
python build_for_win32.py
把 mars.lib作为依赖加入到你的项目中,把和 mars.lib 同目录的后缀名为 rewriteme 的文件名删掉".rewriteme"和头文件一起加入到你的项目中。
Xlog Init
在程序启动加载 Xlog 后紧接着初始化 Xlog。但要注意保存 log 的目录请使用单独的目录,不要存放任何其他文件防止被 xlog 自动清理功能误删。
std::string logPath ="";//use your log pathstd::string pubKey ="";//use you pubkey for log encrypt//init xlog#ifDEBUGxlogger_SetLevel(kLevelDebug);appender_set_console_log(true); #elsexlogger_SetLevel(kLevelInfo);appender_set_console_log(false); #endifappender_open(kAppednerAsync, logPath.c_str(), "Test", pubKey.c_str());
在程序退出前反初始化 Xlog
appender_close();
STN Init
在你用 STN 之前初始化:
voidsetShortLinkDebugIP(conststd::string& _ip,unsignedshort_port) {mars::stn::SetShortlinkSvrAddr(_port, _ip); }voidsetShortLinkPort(unsignedshort_port) {mars::stn::SetShortlinkSvrAddr(_port,""); }voidsetLongLinkAddress(conststd::string& _ip,unsignedshort_port,conststd::string& _debug_ip) { vector<uint16_t> ports; ports.push_back(_port);mars::stn::SetLonglinkSvrAddr(_ip, ports, _debug_ip); }voidInit() {mars::stn::SetCallback(mars::stn::StnCallBack::Instance());mars::app::SetCallback(mars::app::AppCallBack::Instance());mars::baseevent::OnCreate();//todo//mars::stn::SetClientVersion(version);//setShortLinkDebugIP(...)//setLongLinkAddress(...)mars::baseevent::OnForeground(true);mars::stn::MakesureLonglinkConnected(); }
初始化顺序不一定要严格遵守上述代码的顺序,但在初始化时首先要调用 setCallBack 接口 (callback 文件的编写可以参考 demo),再调用 Mars.init,最后再调用 onForeground 和 makesureLongLinkConnect,中间顺序可以随意更改。 注意:STN 默认是后台,所以初始化 STN 后需要主动调用一次 BaseEvent.onForeground(true)
需要释放 STN 或者退出程序时:
mars::baseevent::OnDestroy();
Support
还有其他问题?
- 参看 mars/sample;
- 阅读 源码;
- 阅读 wiki或者 FAQ;
- 联系我们。
Contributing
关于 Mars 分支管理、issue 以及 pr 规范,请阅读 Mars Contributing Guide。
License
Mars 使用的 MIT 协议,详细请参考 LICENSE。