插件化由来:

  • 65536/64K【技术层面上】
    随着代码越来越大,业务逻辑越来繁杂,所以很容易达到一个65536的天花板,其65536指的是整个项目中的方法总数如果达到这个数量时则不无法创建新的方法了,所以基于这个原因插件化就产生了。
  • 功能层面的解耦、维护团队的分离,这也是大势所趋,每个团队会维护一个APK中的不同的业务模块,如果每个业务模块升级都需要对整个APK进行升级,代价实在太大,虽说目前有H5的方式能解决这个问题,但是体验上肯定是没法中Native的APP进行比较的。虽说来自Facebook的react native如今比较流行,但是在国内插件化用得比较多,毕境是纯native。

插件化要解决的问题:

  • 动态加载APK:
    指的是有一个宿主程序会从sdcard中动态加载APK,下面从代码层面来进行说明:在Android中有两个加载器:
    DexClassLoader:主要是从jar文件中加载字节码文件,主要用于动态加载、代码热更新等等,可以加载APK中的字节码。
    PathClassLoader:它只能加载文件目录下的APK。
    那具体如何动态加载呢?先用DexClassLoader通过反射去加载相印的Activity,如下:

    然后抽象一个BaseActivity,其大体的逻辑是如果有ProxyActivity则走它的逻辑,否则执行正常的逻辑,如下:

    接着在MainActivity中去设置contentView,值得注意的是因为读取不到另外一个APK中的xml文件,所以这里得用动态代码的生成View的方式来设置,如下:

  • 资源加载:
    其实是用的Android系统提供的AssetManager去调用它里面隐藏的一个方法来实现的,具体如下:
  • 代码加载:
    其实也就是利用Java中的类加载器来进行加载,不过Android有它特殊的地方,因为有组件的概念,而且组件有它的生命周期方法,所以这里通过反射来调用相应Activity的生命周期方法,首先获取生命周期的方法:

    最后再在相应的生命周期中调用相应的方法:

其中发现插件化中大量用到了反射,说到反射肯定会有性能问题~~这也是插件化技术的一个问题。

最新文章

  1. C# 的 Dictionary 寫入前應注意事項
  2. Asp.Net MVC中使用ACE模板之Jqgrid
  3. javascript向上向下取整
  4. Oracle DataGuard搭建(二)
  5. Java Struts2 的请求处理流程详解
  6. javascript数组基本方法
  7. Netmon: A light-weight network monitor for Windows
  8. SSH综合练习-仓库管理系统-第二天
  9. Linux查看系统信息(CentOS 7中测试通过)
  10. sqlserver存储过程及临时表在统计中的应用
  11. python 单例模式的四种创建方式
  12. Ubuntu16.04安装MongoDB的Ruby驱动
  13. C# 互通操作 (二)基础知识1
  14. AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
  15. CentOS7主机名修改
  16. (4opencv)对OpenCV中“旋转”的思考和实验
  17. Python 数据结构--排序
  18. 性能测试-2.Fiddler抓包工具的使用
  19. Java栈的简单实现
  20. with as 如何工作

热门文章

  1. STS中MyBatis的基本实现
  2. 【CSS】聊一聊css的选择器
  3. python标准库之shutil——可操作权限的文件操作库
  4. 菜鸟系列docker——搭建私有仓库harbor(6)
  5. Ubuntu更换科大源
  6. input框改变默认样式
  7. 在ASP.NET Core 2.0中使用Facebook进行身份验证
  8. Remainder Problem(分块) Educational Codeforces Round 71 (Rated for Div. 2)
  9. redis 事务 事务机制详解 MULTI、EXEC、DISCARD、WATCH
  10. win10 Snipaste 截图软件