背景
腾讯的Matrix,想必很多人都知道,也有很多人在使用,可是我们就遇到了一个很严肃的问题,那就是Matrix写的gradle插件,无法兼容Gradle6.5,而我们的几个B端和C端项目,都做了Gradle的升级,一不做二不休,也是趁着源码分析的功夫,将其做一下升级适配,而且我看了Matrix Github的Issues,发现有好多人纠结这个问题,那么这期就让我,带着大家搞一发适配吧。我就不吐槽它的更新速度了哈,毕竟已经用起来了,深陷泥潭,无法自拔,只能硬着头皮往前。。
上手开干,直接下载源码,配置升级
源码地址:https://github.com/Tencent/matrix
通过git下载完源码后,用studio打开matrix-android项目后,如下:

image
很干净是吧,来动个手脚

image
从4.7直接越到6.5,然后找到matrix-gradle-plugin项目,修改build-gradle依赖

image
从2.1.0,升级为4.1.0,然后重新build项目,你就会看到很漂亮的画面,就不让你看了哈,直接进入主题,看我如何改的

image
第一处将 variant.getVariantData().getScope() 改为 variant,com.android.tools.build 4.1的api改的面目全非,我是真找不到它要的Scope,好,既然改了这个方法,肯定也要这个函数了吧,我们来看这个inject函数。

image
对比之前的看一眼哈

image
还真被我找到了对应的值,上面的图值看到了三个哈,那个getName就是getTransformTaskName函数需要的一个参数,经过调试我发现是debug或者release,getBuildSrc这个是app的build目录,applicationId不用说了吧,dirName如果你配置了productFlavors,他就是productFlavorName + / + debug 或者release,这样以为就结束了?这么easy吗?no,还有细节,我怎么验证呢?第一想到的就是上传本地maven,这样改完后发布,就可以第一时间调试,下面告诉你怎么办
本地调试

image

image
升级插件版本,然后上传本地maven,然后在我之前创建的插桩项目中加入mavenlocal,如下:

image
在App build.gradle中加入这个

image
版本配置:

image
配置完后,build项目,开始远程调试了哈,在samtest项目的terminal中输入如下:
./gradlew :app:assembleDebug -Dorg.gradle.debug=true --no-daemon
然后在matrix-Android 项目中创建remote

image
启动remote

image
下面你就可以在代码中调试了

image
想要什么一目了然。经过调试我们发现这里根本没走进去

image
仔细看完源码后,发现task.getName名字跟之前规则不一样,多了':app:'

image
在代码中加入上面的配置,就行了。这次一切顺利,可当我运行项目后,发生了崩溃,找不到类,经过再三的检查,和结合之前写的插住,加入了如下代码:

image
在MatrixTraceTransform类doTransform函数中加入以上代码,这里就是将改好的.class文件copy的预设的目标目录,可我仔细查看源代码,其实是有copy的逻辑的,这里解决的不算完美,哪位大佬有经验,来碰撞一下撒。目前加了这个就完成了插件的升级,且插桩正常,如下:

image
通过反编译我们发现,插桩正常,且app可以正常运行。
总结
其实分析matrix整套源码中,学到了很多的知识,处处都是值得推敲的点,想看matrix源码分析系列文章的请评论哈,目前已经过准备了四篇,包括整体架构,App Checker,Trace Canary等,欢迎留言,免费送上。本篇代码改动,已上传至 https://github.com/ibaozi-cn/matrix 欢迎来做客。
网友评论