Android之插件化框架RePlugin——献给Android世界的“最好礼物”

RePlugin——献给Android世界的“最好礼物”

 

RePlugin项目主导作者:360手机卫士团队张炅轩

项目地址:https://github.com/Qihoo360/RePlugin

 

 

一、什么是插件化

顾名思义,就是把一些核心复杂依赖度高的业务模块封装成独立的插件,然后根据不同业务需求进行不同组合,动态进行替换,可对插件进行更新等版本管理操作。

宿主:所谓宿主就是能给资源(插件)调用提供运行(上下文)环境,一般也就是主应用 APK,实现了完整的插件的加载、运行以及管理的平台。

插件:插件可以是一个独立的功能模块封装的 APK,可以单独安装运行,也可以依托于宿主平台进行自我版本更新、安装、卸载等功能。

案例:360手机卫士是宿主,360清理助手、360文件管理等是插件。

 

二、为什么使用插件化框架以及插件化的好处

(1)业务模块解耦

(2)模块动态升级

(3)高效并行开发

(4)按需加载插件,内存占用低

(5)节省升级流量

(6)“取代”热修复

(7)... ...

 

三、插件化的相关技术以及术语

(1)ClassLoader双亲委派模型:

双亲委派模型避免同一个类被不同的类加载器加载。每个ClassLoader实例都有一个上级加载器的引用,这里不是继承关系。

-ClassLoader的体系架构

(2)Hook技术:

Hook技术是一种用于改变API执行结果的技术。

AOP面向切面编程思想采用Hook机制通过JAVA反射原理实现。

(3)占坑思想:

Android系统是采用高度组件化架构,应用程序使用的所有四大组件必须在AndroidManifest.xml清单中进行静态注册。然而宿主并不能预先知道插件需要注册的组件,所以采用占位的方式,先在宿主的清单文件中预埋一些组件坑位,这些预埋的坑位将为插件服务。

(4)代理:

为其他对象提供一种代理以控制对这个对象的访问。

(5)Binder机制:

Android系统进程间通信方式之一(Client-Server)。

 

四、RePlugin插件化方案

RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案。

(1)RePlugin优势:

极其灵活:主程序无需升级(无需在Manifest中预埋组件),即可支持新增的四大组件,甚至全新的插件
非常稳定:Hook 点仅有一处(ClassLoader),无任何Binder Hook!如此可做到其崩溃率仅为万分之一,并完美兼容市面上近乎所有的Android ROM
特性丰富:支持近乎所有在单品开发时的特性。包括静态ReceiverTask-Affinity 坑位、自定义Theme、进程坑位、AppCompatDataBinding等。
易于集成:无论插件还是主程序,只需数行就能完成接入。
管理成熟:拥有成熟稳定的插件管理方案,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等。
数亿支撑:有 360 手机卫士庞大的数亿用户做支撑,三年多的残酷验证,确保App用到的方案是最稳定、最适合使用的。

 

-RePlugin的优势

 

(2)RePlugin采用技术或手段:

Java反射机制,动态编译,占位,代理等

 

-RePluginHook方案

 

 

-RePlugin动态编辑方案

 

-RePlugin坑位设计方案

 

(3)RePlugin框架图:

 

-RePlugin框架图

 

(4)RePlugin框架基本原理:

通过占坑替换方式欺骗系统完成组件启动。应用打包时,宿主的脚本项目在编译期间将坑位注册到AndroidManifest.xml中;启动插件时,RePlugin将目标Activity与坑位Activtity进行租赁关系映射,并启动坑位Activity

 

(5)Replugin相关项目介绍:

1、replugin-host-gradle 宿主的脚本项目:宿主编译期间自动生成坑位,进程数以及内置插件定义等。

2、replugin-host-library 宿主的依赖库:核心库,负责初始化、加载、启动管理插件等。

3、replugin-plugin-gradle 插件的脚本项目:插件编译期间自动替换组件基类以及配置插件打包相关信息等。

4、replugin-plugin-library 插件的依赖库:插件基础库,提供与宿主核心库交互能力等。

 

(6)Replugin相关类介绍:

1、RePlugin:用户操作RePlugin入口,提供插件管理以及行为操作API

2、RePlugin.App:插件上下文,Replugin各个模块初始化入口。

3、PmBase:初始化插件、加载插件等插件管理。

4、PluginContainers:插件容器管理,分配坑位,进程等。

5、PluginCommImpl:负责宿主与插件、插件间的跳转交互。

6、IPC:负责宿主与插件,插件与插件之间的进程间通信工作。

 

(7)RePlugin设计细节:

1、Hook时机:

RePluginApplication.attachBaseContext()

-> RePlugin.App.attachBaseContext()

-> PMF.init()

-> PatchClassLoaderUtils.patch()

 

 

 

2、RePlugin初始化流程:


 

-RePlugin初始化流程图

 

 

3、RePlugin启动Activity流程图:

 

-RePlugin启动Activity流程图

 

4、坑位租赁:

RePlugin.startActivity()  

-> Factory.startActivityWithNoInjectCN()

-> PluginCommImpl.startActivity()

-> PluginLibraryInternalProxy.startActivity()

-> PluginCommImpl.loadPluginActivity()  

-> PluginProcessPer.allocActivityContainer()

-> PluginProcessPer.bindActivity()

-> PluginContainers.alloc()

-> PluginContainers.allocLocked()

 

 

 

5、RePlugin插件安装流程:

RePlugin.install()

-> MP.pluginDownloaded()

-> PluginProcessMain.getPluginHost().pluginDownloaded()

-> PmHostSvc.pluginDownloaded()

-> PluginManagerServer.getService().install()

 

 

-RePlugin插件流程图

 

(8)问题:

1、热修复与插件化一起使用时,先热修复操作再插件化操作还是先插件化操作再热修复操作?分析下ClassLoader机制。

2、Android6.0之前的版本插件的权限注册怎么处理?

3、插件中的Activity集成自第三方库怎么办?

4、插件与宿主包引用了相同的第三方库如何处理?

 

五、奇虎360RePlugin的应用场景

展示插件:如卫士首页、体检、信息流等

业务插件:如清理、骚扰拦截、悬浮窗等

合作插件:如程序锁、免费WiFi、安全桌面等

后台插件:如Push、服务管理、Protobuf

基础插件:如安全WebView、分享、定位等

 

 

 

猜你喜欢

转载自blog.csdn.net/zsf442553199/article/details/78781572
今日推荐