很久之前摸索过安卓热更新技术,顺带着插件化方案也试过挺多,最后还是觉得Tencent/Shadow: 零反射全动态Android插件框架 (github.com)符合自己的想法,不过在顺利跑通后也就因为觉得繁杂的原因没必要用就搁置一边了。
框架预期效果是运用于编写热更新应用,不过插件化的工具箱什么的也是不在话下才对。热更新和插件化目前应该是有很多成熟技术了,没去进行太多了解。这些文章边写边做,所以很多废话,预计最终放一个开源地址,把文章结果放出来,技术有限,仅供参考。
值得一提的是,框架里面会用到很多我的偷懒库和代码,很多是懒得写文档和传源码库的,只能确保主要意思到位。而具体实现要是展开,那我岂不是能写书啦(偷笑)。
好久没碰安卓应用,现在重新尝试整理一遍Shadow,打算搞个自用的插件开发框架出来,以免慢慢的忘掉这方面知识。说不准以后也能方便下自己呢。
之所以选择Shadow,是因为开源许可用的是Shadow/LICENSE.txt at master · Tencent/Shadow (github.com)(GND什么来着),至少没什么奇怪限制。主要还是,其它框架有很多编译条件的依赖,也就这个在我用Gradle7也能跑通了,和平时写代码的环境一样。
准备工作
这里准备,就是把代码拉本地编译一遍,当然也可以直接使用那些包,但为了以后方便的修改源码部分,这点准备还是得做。编译好的包不一定是发布到本地,也可以借用SonaType(好像是)自建Maven仓库或者发布到MavenCentral里方便以后使用。
事实上就是根据之前找到的参考教程跑一遍:Android Tencent Shadow 插件接入指南 - 简书 (jianshu.com)
克隆仓库
Shadow的发布版本看了一下,还是3.2.0,貌似并没有更新过,不过源码上周还是有维护的说。
然后呢,简简单单执行git clone git@github.com:Tencent/Shadow.git。
然后我改名为Shadow-2.3.1了,避免以后摸不着头脑。
于是这一步就结束了。
测试编译
执行./gradlew build,成功得到报错:Incompatible because this component declares an API of a component compatible with Java 11 and the consumer needed a runtime of a component compatible with Java 8。
查看java版本,java -version,噢,那估计就是版本问题:
马上换一个11的看看:
重新打开命令行,执行./gradlew build,开始正常构建,风扇狂转一会儿,结果有惊无险:
接下来修改一下版本号,这一步改不改没关系:
-
打开
Shadow-2.3.1\buildScripts\gradle\common.gradle -
添加如下:
versionName = "2.3.1" versionSuffix = ""然后就可以执行
./gradlew publish发布到本地了:貌似总有些编码错误,只要没报错就暂时不管了。
想看的发布结果可以随便打开一个比如,
C:\Users\sposer.m2\repository\com\tencent\shadow\core\activity-container,可以看到版本号已经有了,前面版本编辑忘了保存,多了一个,那不重要。至此准备工作完成。