Android插件化理解

212 阅读2分钟

    最近遇到了rom超基线的问题,提出了用插件化的方式去减小rom。在集成公司的框架的时候,遇到了一些问题没解决掉,自己之前没实际运用过这个技术,刚好周末有时间,所以整理一下自己的理解。

1.什么是插件化?

插件化里面有两个角色宿主和插件。宿主我理解就是用户安装在手机上的应用,插件app就是没有安装的应用。所以插件化的技术我是这么理解的,就是用户只安装一个app,但是可以使用其他app的功能。

2.插件化实现原理

通过查看源码(主要是PathClassLoader,BootClassLoader这两个类)知道 一个app的所有 class 文件都在 dexElements 里面,而dexElements是一个数组结构,所以我们宿主想要使用插件的类,可以把插件的类添加到dexElements里面去,我们就可以使用插件的方法了。所以插件化可以分为下面几步去实现

1.获取宿主dexElements 

2.获取插件dexElements 

3.合并两个dexElements 

4.将新的dexElements 赋值到 宿主dexElements

我们先创建一个插件app,里面定义一个方法

在宿主app里面,我们需要通过修改dexElements的值。代码如下

在Application中把插件的类加载进去,通过反射的方式直接找到类进行调用

最后就会发现插件中的方法被执行了

3.存在的问题

目前实现了普通类的调用,但是Android插件一般都会有四大组件的使用,但是插件中的activity没有注册的话,是直接不能进行启动,也没办法关联到生命周期。所以针对插件中的四大组件,我们需要通过hook ams,修改ams传输中的Intent值来达到目的。下一篇解决插件中activity的问题