封装、发布一个腾讯 mars xlog 的 KMP lib

Posted by Piasy on November 26, 2022
本文是 Piasy 原创,发表于 https://blog.piasy.com,请阅读原文支持原创 https://blog.piasy.com/2022/11/26/KMP-XLog/

三年前我分享了基于 Kotlin multiplatform 的多平台 WebRTC SDK,其中就用到了腾讯开源的 mars xlog,几个月前我在再探 Kotlin multiplatform 的时候也用到了,但那时候是把 AvConf 里的 Logging 相关代码 copy 到了 OurBar 里,不优雅,现在要优雅起来了。

此外,Kotlin 官方对 Kotlin multiplatform 的简称为 KMP,所以后面我也就跟着改口了。

编译 mars xlog

第一步肯定是把腾讯的 mars xlog 编译出来了,三年前在 AvConf 项目里编译过 Android/iOS/Windows/Linux,所以这一步没有大问题,在最新的代码上再编译一次就好。

不过不得不吐槽,腾讯的这个开源项目确实也就是三分钟热度,目前基本已经处于不再维护的状态,虽然偶有提交,但是 README 里的使用说明没有同步更新,编译脚本也是有问题没法直接用的,Android 库也还是发布在 jcenter 里,而 jcenter 都已经关停了。他们内部可能还在使用和维护,但开源项目显然是没怎么维护的。

需要的朋友可以查看我 fork 的提交

如何发布 iOS 库?

xlog 的接口比较简单,所以封装起来很容易,之前的文章也介绍过,这次就不再赘述。

关键点是怎么发布,用户才能很方便的集成?

Android 的依赖管理工具链非常成熟,Java 代码和 so 库可以打包成 aar,只需要添加一行 gradle 依赖即可。iOS 我倒是花了一番心思,才琢磨出了一个办法。

在官方的 Create and publish a multiplatform library – tutorial 教程里,有手把手的介绍,但是我的情况略有不同,有自己编写的 objc 代码,以及依赖的 mars.framework 这个静态 framework。

我先是去 Kotlin 官方的 slack 群里问了一下,但是没人搭理,三年前的时候提问还是很快得到解答的 :(

后来我在 Awesome KMM 里逛了逛,想看看别人是怎么做的,最后想到可以把所有的静态库都合并成一个,然后就作为 cocoapods 创建的 framework 库文件,这样就可以通过 cocoapods 分发了,用户引入也会很方便。

在这个过程中我先是尝试编出动态 framework,但遇到了一个问题:我是把 mars 做成了 xcframework,但是 KMP 似乎链接 xcframework 有问题,会报错找不到 mars。这个问题先给 Kotlin 提了个 issue 看看,日后可能还是会有这种场景。不过编译成静态 framework 就可以先不管这个问题,因为编译成静态库时可以不链接依赖库。

把多个静态库合并,则是使用了 libtool 命令,具体可以查看 build_ios.sh

发布到 MavenCentral 和 cocoapods trunk

发布到 MavenCentral 主要是参考了 Publishing your Kotlin Multiplatform library to Maven Central 这篇文章,按照步骤一步步操作没有遇到什么问题。

发布到 cocoapods trunk 主要是参考官方教程,这个过程遇到了两个问题:

  • 因为我的 xcframework 是 gradle 编出来的,所以 podspec 的 source 设置过程遇到一点挫折,最后是直接把 xcframework 打包传到 GitHub,用 http 链接作为 source 选项;
  • license 始终报警告找不到文件,但文件我是放到了目录里的,而且 pod lib lint 都不报警告,最后只能通过 --allow-warnings 规避;

KMP XLog 的具体使用,感兴趣的朋友可以看 GitHub 主页。接下来我也计划把 AvConf 里其他可复用的模块,制作成单独的库,便于复用,到时应该会顺利得多。

朋友们,再会 :)