「java插件化」插件化开发

博主:adminadmin 2022-12-26 08:21:06 72

今天给各位分享java插件化的知识,其中也会对插件化开发进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

插件化技术采用二进制吗

通常,我们的app只有一个apk文件;而插件化是一种将app拆分为多个apk的技术,每一个apk都是app功能的一部分; App 的部分功能模块在打包时并不以传统方式打包进入 apk 文件中,而是以另一种形 式二次封装进 apk内部,或者放在网络上实时下载,在需要的时候动态对这些功能模块进行加载,称之为插件化

这些单独二次封装的功能模块 apk ,就称作「插件」,初始安装的 apk 称作「宿主」

总的来说:“插件化是组件化的更进一步推进”

插件化的用途

在学习一项新技能之前,我们首先要弄清楚它能为我们带来什么;那插件化能给我们带来什么呢?

从项目管理角度来说:

● 插件化将应用的不同功能划分到一个个的插件中,便于程序的维护

● 每个插件可以单独运行调试极大的提高了开发效率

● 每个插件互不影响,多人协同开发更加高效

从程序运行角度来说:

● 按需加载插件,占用内存更少

● 按需更新,更省流量

从公司运营角度来说:

● 实时更新,便于运营推广

● 修复线上BUG,将风险降到最低

使用插件化的好处

● 宿主和插件分开编译: 各个模块封装成不同的插件APK,不同模块可以单独编译,提高了开发效率

● 并发开发: 不同的团队负责不同的插件APP,这样分工更加明确

● 动态更新插件: 可以通过上线新的插件来解决线上的BUG,达到“热修复”的效果

● 按需下载模块

● 解决了方法数超过限制的问题

● 减小了宿主APK的体积

使用插件化所需要的理论基础

插件化像是一门十分高深的武功,它需要修习者有一定理论基础后才能修炼那它需要哪些理论支撑呢?

ClassLoader

● ClassLoader 叫做类加载器, 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到java虚拟机外部去实现,以便让应用程序自己决定去如何获取所需要的类,实现这个动作的代模块称之为“类加载器”

● ClassLoader是由JVM平台提供的类加载器,它允许程序从网络、硬盘甚至是内存加载Class,这就为Android插件化提供了最基础的技术保障

● ClassLoader负责在运行时将Java类动态加载到JVM中,而且ClassLoader是JRE的一部分。因此,由于ClassLoader的存在,JVM无需了解底层文件和文件系统即可运行Java程序

● ClassLoader并不会一次把所有Java类加载到内存中,而是在应用程序需要的时候加载。这就是ClassLoader发挥作用的地方,它们负责将类加载到内存中

反射和Hook技术

Hook动态注入代码

● Hook机制是回调机制的一种,普通的回调是静态的,我们必须提前写好回调接口;而Hook机制在Java中则可以利用反射,针对切入点(通常是一个成员变量),采用替换的手段,使代码在运行时改变

Android Hook

● 在Android操作系统中,有一套自己的事件分发机制,所有的代码调用和回调都是按照一定顺序执行的,Hook技术存在的意义就在于,我们可以在事件传送到终点前截获并监控该事件的传输,并且做一些自己的处理

Classloader、插件化开发(结合Presto)

注意:

双亲委派模式是在Java 1.2后引入的,其工作原理的是:

双亲委派模式优势

一般来说,例如程序 hello.jar 执行到:

会按照双亲委派模型进行加载类 Demo 。如果 Demo 在 hello.jar 内, AppClassLoader 就将其加载完成;但是如果例如 SPI 这种,既不在应用 hello.jar 内又不在系统类路径内,那么就要抛弃双亲委派模型,获取 线程上下文类加载器 加载( 线程上下文类加载器 默认是 AppClassLoader ,此时的 线程上下文类加载器 肯定是自定义的类加载器)。

自定义一个 破坏双亲委派模型的类加载器 的方法:

深入理解Java类加载器

这里介绍2种加载方式:

例如要加载类:

将其编译为class文件,存放在路径 /Users/root/Projects/idea/my/com 。

这时要加载它:

对于SPI这种,就需要用到ServiceLoader加载。可以参考地址:

需要注意:

知识点

插件化的一个重要目标就是利用类加载器实现类隔离(比如不同厂商版本的依赖包),其原理在于在类中(例如 Demo )隐式类加载器就是 Demo 的类加载器(一般为插件类加载器),对于插件中出现的插件外的类(例如SPI接口类)则不加载。

这里分析Presto的connector插件架构。

Presto的自定义类加载器 PluginClassLoader 继承 URLClassLoader 类并重写了 loadClass ,其类加载逻辑为:

注意:

Java 自定义 ClassLoader 实现隔离运行不同版本jar包的方式

从上面我们得知,如果采取ServiceLoader的SPI方案,应该在 resources/META-INF/services 中存放实现类的全限定名。有意思的是Presto的插件基本都没有这个声明文件,但是编译打包后插件模块的 target/classes 中却能找到。如果观察插件的 pom.xml 文件,就会发现 packagingpresto-plugin/packaging 。其实在根 pom.xml 中使用了presto自己的打包插件 presto-maven-plugin ,将该maven插件打开看就能发现 ServiceDescriptorGenerator 中会在打包时自动生成了声明文件。

SOFA-Ark 是蚂蚁金服开源的一款基于Java实现的轻量级类隔离加载容器。

具体可以参考博客: sofa-ark类隔离技术分析调研

站在插件的角度看待,我觉得:

你应该知道的Java Classloader - 知乎

如何将JAVA插件支持Chrome?

Chrome支持JAVA插件的步骤:\x0d\x0a1、首先,在Chrome地址栏输入chrome://flags/#enable-npapi .注意:输出的要完全正确,如果多了一个字,都不会正常显示\x0d\x0a2、然后单击 Enable(启用)\x0d\x0a3、然后重启浏览器(重启后的标签会重新打开)\x0d\x0a\x0d\x0a 注意: 现在8.5.10的Aurigma有一个功能,当Java上传加载到Chrome,会弹出一个怎么进行java插件支持的对话框。一旦java程序加载完毕进行初始化后,指示对话框将隐藏。

java插件化的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于插件化开发、java插件化的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。