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。
特性丰富:支持近乎所有在“单品”开发时的特性。包括静态Receiver、Task-Affinity 坑位、自定义Theme、进程坑位、AppCompat、DataBinding等。
易于集成:无论插件还是主程序,只需“数行”就能完成接入。
管理成熟:拥有成熟稳定的“插件管理方案”,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等。
数亿支撑:有 360 手机卫士庞大的数亿用户做支撑,三年多的残酷验证,确保App用到的方案是最稳定、最适合使用的。
图-RePlugin的优势
(2)RePlugin采用技术或手段:
Java反射机制,动态编译,占位,代理等
图-RePlugin的Hook方案
图-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、插件与宿主包引用了相同的第三方库如何处理?
五、奇虎360对RePlugin的应用场景
展示插件:如卫士首页、体检、信息流等
业务插件:如清理、骚扰拦截、悬浮窗等
合作插件:如程序锁、免费WiFi、安全桌面等
后台插件:如Push、服务管理、Protobuf等
基础插件:如安全WebView、分享、定位等