您的位置:首页 > 移动开发 > Android开发

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

2017-12-14 10:44 155 查看
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、分享、定位等

 
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: