android插件化的一种实现

插件化的框架很多很多,比如360开源的DroidPlugin, 但是有时候用户不能接受第三方的库,尤其是他们<觉得>有风险的库,就不得不自己实现简单动态加载方法。

需求

1.提供A和B jar包,B是从服务器上download下来,可替换
2.A包定义一个接口InterfaceA和实现类InterfaceAImpl,App基于InterfaceA写业务代码

方案

  1. A包的InterfaceImpl的构造函数接收B.jar的路径,并通过DexclassLoader去加载B.jar
  2. 加载之后,通过findClass和findMethod的方式去调用B.jar的类和函数
    实际上,InterfaceImpl的任何调用都是透传到B.jar的

要解决的问题

主要的问题都集中在UI资源处理上,这是在大多数插件方案里面要解决的。

  1. 布局
    布局全部用Java代码实现,复杂的布局拆分成空间,最大化复用。

  2. 字符串资源及多语言
    由于没有ID了,字符串资源是放在xml里面,解析之后放在HashMap,通过Key-Value的方式去选择显示。多语言就是根据机型多个XML。

  3. 图片
    放在asset下面解压加载,好在图片不多。

  4. so库
    so库涉及业务的,为了能做到热更新,放在B.jar的assets目录下,运行的时候解压到目录,然后用System.load加载。这个地方主要要注意的是要根据CPU类型解压对应的so

你可能感兴趣的:(android插件化的一种实现)