由于项目需要,需要裁剪ROM,由于webview在新项目中是不必要的,所以有了想法对他下刀。
跟移除其他模块一样,这里采取的措施是将build/target/product/core_minimal.mk中
PRODUCT_PACKAGES +=webview屏蔽,这样重新编译就不会编译webview相关的模块了,可以在镜像编译后进入到out目录查看一下,可以看到webview文件夹没有了
很happy的进行到这没有什么毛病,然后开始烧录镜像。于是如预期一样的挂了,打印信息如下(由于编排问题,这里直接上异常截图):
根据log,我们马上定位到报错,在Zygote起来的时候,preload操作出现了问题,那这里我们已经移除了webview模块,那么肯定是不需要这个preload操作的,直接屏蔽,然后重新编译,烧录镜像。再次开机,上面那个异常已经没有了,但是又出现了新的问题
system_server神奇的结束了,然后Zygote起不来,最奇葩的是没有其他相关异常log的打印,一顿怀疑人生,然后我在没有裁剪的环境下,进入system目录,执行了下如下命令
屏蔽PRODUCT_PACKAGES +=webview,实际上会将与webview相关的so也移除,之前libwebviewchromium_loader.so移除导致了Zygote起不来,那么是不是libwebviewchromium_plat_support.so移除也会引出异常呢,带着疑问我将正常的libwebviewchromium_plat_support.so重新push到机器里,开机成功了。。。于是没说的,直接在源码中查找一下与这个so相关的东西
熟悉安卓N的应该知道,public.libraries.android.txt最后会编译成system/etc/public.libraries.txt,用以标识应用能够引用到的system目录下共用的so。对于不在这个清单中的so引用会出现异常,
java.lang.UnsatisfiedLinkError: dlopen failed: library “xxx.so” not found 或
java.lang.UnsatisfiedLinkError: dlopen failed: library “/vendor/lib64/xxx.so” needed or dlopened by “/system/lib64/libnativeloader.so” is not accessible for the namespace “classloader-namespace”
具体可以参考这篇博客的介绍 Framework基础:Android N 公共so库怎么定义呢?
将system/core/rootdir/etc/public.libraries.android.txt中的libwebviewchromium_plat_support.so删除后,再重新编译并运行,没有异常,webview移除成功