【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之后,发现也与主分支不一致。看到这里我也彻底懵了。你要说这个项目没人维护?也不是,两个月前还有提交记录。
在这里插入图片描述

    1. 架构不支持。master分支仅支持 ‘armeabi-v7a’, ‘arm64-v8a’ 架构,如需其他架构需要自己编译。
    1. 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’架构进行了编译。

如果这篇文章帮到了你,请多多点赞!!如果文章有误,也欢迎指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
接入Tencent/Shadow是一项比较复杂的工作,需要经验丰富的Android开发人员进行操作。以下是基本的步骤: 1. 下载Tencent/Shadow SDK Tencent/Shadow官网提供了给Android开发者使用的Android Studio插件包,需要先从官网下载并安装。 2. 创建一个新的Android Studio项目 在Android Studio工具栏中选择“File”->“New”->“New Project”。 3. 导入Tencent/Shadow SDK到项目 将刚刚下载的Tencent/Shadow SDK导入到项目中,具体操作可以参考官方文档。 4. 添加Tencent/Shadow Gradle插件 在根目录下的build.gradle文件中加入以下代码: ``` buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'gradle.plugin.com.tencent.shadow:gradle-plugin:2.1.1' } } apply plugin: 'com.android.application' apply plugin: 'com.tencent.shadow' ``` 5. 配置Tencent/Shadow的参数 在项目的build.gradle文件中加入以下代码: ``` shadow { // 设置Tencent/Shadow的插件版本号 pluginVersion = "2.1.1" transformVersion = "2.2.0" } ``` 还需要配置其他参数,具体可以参考官方文档。 6. 在应用程序的AndroidManifest文件中声明ShadowApplication 在AndroidManifest.xml中加入以下代码: ``` <application android:name="com.tencent.shadow.core.runtime.ShadowApplication" ... </application> ``` 7. 打包并运行 现在,你已经可以在Android Studio中打包并运行应用程序了。 需要注意的是,Tencent/Shadow插件的使用需要在Gradle版本必须为5.4.1及以上,Android Gradle插件版本必须为3.4.1及以上。同时,Android SDK版本必须支持Android 9.0(update 28)及以上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值