插件化和热更新一直都是Android的热门技术,插件化目的是为了实现可插拔式的功能对接,而热更新则是为了方便修复代码漏洞在用户微感知情况下进行代码部署。今天我们来聊一聊360推出的插件化 replugin,具体集成步骤就不说了,我们来探讨下遇到的问题和解决思路

00a81c1e1051

image.png

可以看到已经有6.6K的点赞量,使用量广泛,但是目前存在的问题也是挺多的,而且这个库目前是很少有人维护和回复,这给使用者造成了不少的麻烦,而我最近一周也在竭力协助解决项目中插件化带来的问题。

资源Id问题

我们知道Android 程序都是.apk结尾,响应的代码和资源文件是被打包成了apk文件,而插件化则是把单独的apk文件依赖宿主(目标)apk上,实现即用即下载,其实当你点击插件化apk的时候,在Android 系统上相当于新开了一个app,由宿主app跳转到了插件化app上,用户虽然感知没有发生跳转,但是当你查看后台时,你会发现存在两个不同的后台进程。

ok,那我们来说资源Id报错问题。

00a81c1e1051

image.png

00a81c1e1051

image.png

当我尝试从宿主app打开插件app的时候,出现了闪退现象,报的是资源id

0x7f0e003f找不到,这就很麻烦了。

解决探索

首先我根据配置和代码,进行了代码追踪

00a81c1e1051

image.png

在debug模式下进行代码运行步骤追踪,我发现下载的app是正常的,插件名称也是正常的。之后我又在控制台发现了权限问题

00a81c1e1051

image.png

随后经过我的代码排查,发现工程里已经进行了该权限的申请,故排除该权限引发问题的可能性。

在我接到这个任务之前,我们组长和另一位组员已经对该问题进行了尝试修复,已经努力了2天,我也被参与进来后,发现我所经历的修复方法组长已经采坑完毕,并且,已经领先我几步,比如下面的,一直报插件化app MainActivity 代码报错

00a81c1e1051

image.png

经验代码调试和验证,发现这不是根本性问题,并且修复完成之后,又在报MainActivity 其他行数代码问题,就这样我也折腾了一上午,没有任何进展,心里想着

先吃个饭,下午再解决

突破点,转变思路

既然没有找到根源性问题,那么久从最开始地方入手,既然一开始是报的找不到资源ID为0x7f0e003f的资源,那么我们是否可以通过技术手段,查找到该资源呢?我把我的这个想法给组长汇报了下,组长说也在想,但是好像没方法,我决定搜索一番。

最终发现Android studio自带的apk解析工具可以查找资源

00a81c1e1051

image.png

通过定位发现该资源文件是个ic_launcher 图片文件,瞬间感觉找到了希望。后来发现原来是插件化app的工程里

00a81c1e1051

image.png

drawable文件夹资源文件里图片和mipmap 文件夹中不一致导致,修复完成这个之后,果然不会再报资源找不到,但是又在报图片格式问题,通过定位后恢复其中资源原始格式后也解决

00a81c1e1051

image.png

Ok,就这么修复了,还是很开心的。

关于插件化app 运行后无法全屏,像是弹窗一样存在问题

00a81c1e1051

Screenshot_20210225_092523_com.xinan.police.jpg

这就------,一时间不知道从何下手,我的第一感觉是app的theme问题,后来经过百度搜索,发现在一片文章里提到

00a81c1e1051

image.png

原来,虽然插件化app 依赖宿主app,但是插件化app也是要有自己资源管理的,也就是要自己依赖一份v7 support包,而不是共享宿主的。

这个问题解决完,也就算是功德圆满了。

好了,今天先写到这里,我也该下班了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐