前言
移动端APP发展到现在已经日趋成熟,当然随之带来的是业务越来越臃肿,APK体积越来越大。
为了解决这样的问题,当今行业内有一套非常火的方案————插件化方案。包括滴滴的VirtualAPK、360的RePlugin、腾讯的tinker,都是非常优秀的插件化方案。
基础
要学习插件化,我们可以从最基础但也是最重要的入手,把一个已安装|未安装的apk加载成功,并正常调用插件资源。
这样的实现实际上插件化的优点已经深深埋在根里,就是实现业务与接入的解耦。
生成插件Context
当我们需要了解一个APK,获取它的Context是最为直接有效的方法,但是插件是没有Context的,需要利用宿主Context才能生成自身的Context,从而获取插件资源并使用。根据包名可以通过以下方法获取:
生成插件ClassLoader
若想加载插件的类,需要一个类加载器,那通过上一篇的 ClassLoader加载原理(链接) 学习。因为要加载一个apk中的类而不是dex文件,这时候我们要创建一个PathClassLoader,
以下:
拿到这个插件的ClassLoader后,形同于整个插件APK就暴露在宿主应用前,可以对为所欲为了(邪恶脸+-+)。
调用插件APK的类
使用loadClass方法加载插件类,就能很愉快地使用到插件的资源。
Host:
Plugin:
最终安装Plugin后,再调起Host,就能看到以下log:
小结
本文章中示例代码都是用的很简单粗暴的搭建方式。通过下列方式,可以较为优雅地实现这次的插件化方案。
- 抽象接口类设计
- 构造缓存业务类对象池
但实际商用项目开发中,很少会使用已安装插件APK的方案,因为除了系统应用,不会有用户愿意主动安装插件。
不过咱们可以通过这个实现方式,学习到一个APK是如何调到另外一个APK的,更好地理解classloader的作用。