插件化技术和热修复技术都属于动态加载技术
动态加载技术是他们的前身,分别派生出热修复技术和插件化技术
区别
其中热修复技术主要用来修复Bug
插件化技术则主要用于解决应用越来越庞大以及功能模块的解耦
插件化
插件化的客户端由宿主和插件两个部分组成,宿主就是指先被安装到手机中的APK,就是平常我们加载的普通APK。
插件一般是指经过处理的APK、so和dex等文件,插件可以被宿主进行加载,有的插件也可以作为APK独立运行。
Activity插件化
Hook技术实现(主流)
主要的方案就是先用一个在AndroidManifest.xml中注册的Activity来进行占坑,用来通过AMS的校验,
接着在合适的时机用插件Activity替换占坑的Activity。
反射实现
接口实现
Service 插件化
代理分发实现
-
ProxyService需要长时间对Service进行分发处理,所以在参数条件不满足、出现异常和代码执行完毕时需要返回START_STICKY,这样ProxyService会重新被创建并执行onStartCommand方法。
-
创建targetService并反射调用targetService的attach方法。
-
进行代理分发,执行targetService的onCreate方法。
ContentProvider 插件化
ContentProvider插件化的关键在于将ContentProvider插件共享给整个系统。
BroadcastReceiver的插件化
BroadcastReceiver的注册分为两种,分别是静态注册和动态注册
首先把静态注册的BroadcastReceiver全部转换为动态注册来处理,虽然静态和动态的BroadcastReceiver的生命周期不同,
但是为了实现插件化,这个缺点显然不是关键问题。
然后利用 VirtualApk 的实现
资源的插件化
资源的插件化方案主要有两种:
一种是合并资源方案,将插件的资源全部添加到宿主的Resources中,这种方案插件可以访问宿主的资源。
另一种是构建插件资源方案,每个插件都构造出独立的Resources,这种方案插件不可以访问宿主资源。
VirtualApk 实现
so的插件化
-
将so补丁插入到NativeLibraryElement数组的前部,让so补丁的路径先被返回和加载。
-
调用System的load方法来接管so的加载入口。