首页 编程 软件学院 查看内容

Android插件开发初探

2015-4-15 11:47 982 0

摘要: 对 于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用。这里我们就尝试性的对比一下Java中,我们使用插件 化该是一个怎么样的流程,且我们如何将此流程移植...
关键词: nbsp 8226 插件 InterfacePlug public Class 应用 function DexClassLoader plaincopyprint

对 于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用。这里我们就尝试性的对比一下Java中,我们使用插件 化该是一个怎么样的流程,且我们如何将此流程移植到Android框架上去使用。很多代码都是内部资料,不喜勿喷,谢谢~ 为什么要插件化 •功能越来越多 •代码、安装包越来越大 •小的更新也需要重新发布 •更新频繁 •用户无法选择性加载需要的模块 •。。。 插件化的好处 •主安装包较小 •强制模块化,降低耦合度 •减少整体更新的次数 •插件可单独静默更新 •用户可以有所选择 •。。。 插件化的要求 •没有独立运行的入口 •主应用控制,下载、安装、删除、静默升级、打开和关闭 •主应用和插件资源共享 安装包的组成 需要安装的插件 •主应用可以以Intent方式启动具体的插件,同时带入Map类型参数或者json串参数 •使用相同的android:sharedUserId,资源数据共享 •根据sharedUserId来查找插件 •queryIntentActivities查找符合这个action的所有activity(或其它)即插件 •query方式可以获得插件的路径以及实现接口类的类名 •通过检索sharedUserId能够得到路径却无法获得到类名 •通常可以使用一个描述文件(xml、json)描述插件结构 •createPackageContext() •getResourcesForApplication() 动态加载普通类 •Java 可以用 ClassLoader 动态加载.jar 中的Class文件,android可以吗? •PathClassLoader •DexClassLoader •接口类 [java] view plaincopyprint?package com.plug;  public interface InterfacePlug {          public String function_01();          public int function_02(int a,int b);  }   •实现类 [java] view plaincopyprint?import com.plug.InterfacePlug;  public class PlugImpl  implements InterfacePlug{      @Override      public String function_01() {          return null;      }        @Override      public int function_02(int a, int b) {          return a+b;      }  }   主应用类 [java] view plaincopyprint?package com.host;    public class MyhostActivity extends Activity {      public void useDexClassLoader() {          DexClassLoader cDexClassLoader =                  new DexClassLoader("/mnt/sdcard/Myplugdex.jar", "/data/data/com.host", null, this.getClass()                          .getClassLoader());          try {              Class<?> class1 = cDexClassLoader.loadClass("com.plug.PlugImpl");              InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance();              int ret = interfacePlug.function_02(12, 13);              tv.setText(" return value :" + ret);          } catch (Exception e) {          }      }  }   •导出插件包时只能导出实现类,否则会出现 Classref in pre-verified class resolvedtounexpected implementation 重复定义错误 •不是普通类怎么办? •系统组件如何接收回调? •如何加载资源? •PackageInfo? •Resources? •Assets? 动态加载系统组件和资源 •PluginLib •PluginHost •PluginTest •主应用列出安装的Plugins,点击启动对应的PluginActivity •可以基本完整实现一个Activity •可以继续增加其他组件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?) •缺点 –Manifest中注册的信息由系统控制,因此插件需要权限信息需要预先注册在主程序中。 –目前实现有一定的限制 基于Fragment的开源插件框架 •https://github.com/mmin18/AndroidDynamicLoader •UI基于Fragment •反射得到Resources •通过uri进行页面跳转 –Intent i = newIntent(Intent.ACTION_VIEW,Uri.parse("app://helloworld")); –startActivity(i);
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部