Android 插件化

插件化技术和热修复技术都属于动态加载技术

动态加载技术是他们的前身,分别派生出热修复技术和插件化技术

区别

其中热修复技术主要用来修复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的加载入口。

原文地址:https://www.cnblogs.com/lukelmouse/p/14521513.html