Tencent/Mars 编译及自定义心跳包body
文章编写背景
Tencent/Mars主分支编译失败,折腾了好几天才能编译。为了方便其他需要编译mars分支的小伙伴,特写此文章。
原项目地址
Github 链接: Mars
Gitee 链接: Mars
需要编译的原因
- 1.版本过老,不兼容android 12。目前maven仓库的版本是于 2021年2月24日发布1.2.6版本。
我最开始引入项目的就是这个版本,结果测试后发现根本无法定时发心跳。经排查是com.tencent.mars.comm.Alarm这个类有问题,有一行的写法不兼容Android12。
目前master分支是这样写的
if (Build.VERSION.SDK_INT < 23) {
pendingIntent = PendingIntent.getBroadcast(context, (int) id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
} else {
pendingIntent = PendingIntent.getBroadcast(context, (int) id, intent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
旧版本依赖
implementation 'com.tencent.mars:mars-core:1.2.6'
相关代码如下:
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, (int) id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
熟悉Android的小伙伴能看出这里明显有问题。放在Android Studio里,也是会有提示修改的。
Ps: 最开始我发现问题的时候,是想着拉下master分支,把这块的代码改下兼容Android 12。结果一拉下代码就有了惊人的发现。原来在master分支上这个问题已经得到了修复。然后master分支的版本绝对不是v1.2.6,具体是什么版本我也不清楚。在tag那里发现最新的版本应该是v1.3.0,切换到v1.3.0之后,发现也与主分支不一致。看到这里我也彻底懵了。你要说这个项目没人维护?也不是,两个月前还有提交记录。
-
- 架构不支持。master分支仅支持 ‘armeabi-v7a’, ‘arm64-v8a’ 架构,如需其他架构需要自己编译。
-
- mars默认的心跳包是不带用户信息的,没法确认这个心跳包是哪个用户发的。故需自定义心跳包。默认的心跳包是没有body的,为了实现心跳包添加用户信息,我选择了在body里存放用户信息。
本地编译
编译方法其他博客已经说的比较清楚了,就不赘述了。具体可参考:
Android Mars XLog的编译
ps: 目前master分支,我使用android-ndk-r20b-windows-x86_64 python-2.7.18.amd64是能编译成功的。关于编译选项, 选项1 、3我都能编译成功。选项2编译异常。具体1、2选项有什么区别,目前暂未搞懂。
对主分支代码修改地方
概览
CMakeLIsts.txt
为了能正常编译,修改了CMakeLIsts.txt文件
将zstd 修改为libzstd_static (修改灵感,在github翻阅了众多issues后得到,感谢前辈的付出(鞠躬))
build.gradle 移除了一个多出的} (这里不得不吐槽下,这个小错误竟然都有,不懂咋合并的)
其他的地方都是为添加心跳包body加的,就不多赘述了。
关键修改位置:
longlink_packer.cc
longlink_noop_req_body 方法
longlink_noop_req_body = [](AutoBuffer& _body, AutoBuffer& _extend) {
// add nooping body
std::string _bodyStr = NetSource::GetNoopingBody();
const char *cstr = _bodyStr.c_str();
_body.Write(cstr, _bodyStr.size());
};
ps:修改方法来自:
链接: Mars Android 接入实践 Note
原修改方法:
PS: 博主是一个java后端开发,写这些c的代码着实是费劲。按照上方链接的方式添加代码后,发现在body根本无法读取到值,结合这个文件其他方法的写法,使用Write的时候,一并写入body的长度,最终才修改成功。
StnLogic.java 添加设置心跳包body的方法
修改后的Mars代码
代码地址: Xianyu-Mars.
若你不需要定制其他内容,可直接使用我编译好的aar包。
aar包使用方法
创建于src目录同级的libs目录,将aar包放入其中。修改build.gradle添加
api(fileTree("libs"))
aar包支持的架构
原有master分支仅支持 ‘armeabi-v7a’, ‘arm64-v8a’ 架构,我添加了 'x86_64’架构进行了编译。
如果这篇文章帮到了你,请多多点赞!!如果文章有误,也欢迎指正!!