起因
因为我开发的ROneBot框架需要一个项目模板生成器, 之前是Jvm的ktor但是因为项目已经迁移到了Multiplatform所以还得单独为这个模块设置Jvm的Kotlin插件这样写起来很不美观,于是我就搜索了一下
在native二进制文件中嵌入资源的东西,然后就找到了kMBed
这个插件, 但是这个插件作者的maven仓库被墙了,我把项目拉下来自己发布到自己的仓库但是不生效, 我恍然大悟原来可以开发一个gradle插件
然后识别resources内的资源文件将其作为byteArrayOf
kotlin源码最后经过kotlin编译器编译生成的代码来实现"嵌入"到二进制文件内。
gradle插件
首先就是gradle插件了,由于只是获取resources内的资源文件并不需要扫描源码所以就不用ksp或者kcp了,创建一个设置里面可以设置kmp不同源码集的resources路径, 然后注册一个任务,将这些路径内的资源文件全部生成为.kt文件源码,说白了就是简单的源码生成器
运行时
既然生成了一个资源map,那肯定得提供一个简单的API来将其快捷的转换成字符串或者ByteArray, 当然如果所有东西都在内存操作的话是不需要额外的io库的,下面是Resource类的具体实现
public class Resource(uSource: UByteArray, private val compressed: Boolean = false) {
private val source = uSource.toByteArray()
public fun asByteArray(): ByteArray = if (compressed) source.zlibDecompress() else source
public fun asString(): String {
return asByteArray().decodeToString()
}
}
gradle插件会生成一个Map,map的键就是resources下的路径+文件名,值就是Resource对象, 当然也可以配置zlib压缩, 这个zlib压缩的库是我自己实现的使用到了posix + cinterop的API
这里是zlib的仓库地址 https://github.com/RTAkland/kzlib 这个库除了android(native) 、 js 、wasmJs不支持外其余所有的target都是支持的
gradle插件除了会生成一个map还会附带一个方法 这个方法的签名如下
public fun getResource(path: String): Resource
传入路径即可获取Resource对象, 再调用Resource内的两个方法即可转换成不同的类型
文件系统运行时
如果还想将这个资源文件保存到文件系统来减少内存占用可以引入这个模块,此模块由kotlinx-io驱动,
对Resource对象添加了一个拓展函数
public fun Resource.saveTo(path: Path)
最后
这个插件的仓库地址是 https://github.com/RTAkland/KEmbeddableResources 具体如何配置的话看README即可, 使用非常简单
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:[email protected],工作室将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有。