插件化的框架很多很多,比如360开源的DroidPlugin, 但是有时候用户不能接受第三方的库,尤其是他们<觉得>有风险的库,就不得不自己实现简单动态加载方法。
需求
1.提供A和B jar包,B是从服务器上download下来,可替换
2.A包定义一个接口InterfaceA和实现类InterfaceAImpl,App基于InterfaceA写业务代码
方案
- A包的InterfaceImpl的构造函数接收B.jar的路径,并通过DexclassLoader去加载B.jar
- 加载之后,通过findClass和findMethod的方式去调用B.jar的类和函数
实际上,InterfaceImpl的任何调用都是透传到B.jar的
要解决的问题
主要的问题都集中在UI资源处理上,这是在大多数插件方案里面要解决的。
-
布局
布局全部用Java代码实现,复杂的布局拆分成空间,最大化复用。 -
字符串资源及多语言
由于没有ID了,字符串资源是放在xml里面,解析之后放在HashMap,通过Key-Value的方式去选择显示。多语言就是根据机型多个XML。 -
图片
放在asset下面解压加载,好在图片不多。 -
so库
so库涉及业务的,为了能做到热更新,放在B.jar的assets目录下,运行的时候解压到目录,然后用System.load加载。这个地方主要要注意的是要根据CPU类型解压对应的so
网友评论