Android学习笔记之插件化(未完成)

概述

插件化就是在开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包。

插件化的背景

  1. 应用体积越来越大;
  2. 每次修改都需要重新发布版本,降低用户粘性。
  3. 新功能的加入对于用户需求的不确定性。
  4. 需要对新应用进行导流的同时也可以免安装使用。

插件化的好处

  1. 宿主和插件分开编译:编译时只需要编译宿主app,插件app是在编译好后下发到宿主app里的。
  2. 并发开发:宿主app什么时候发布版本跟插件app什么时候开发完没有关系,宿主app只要开发完并且为插件app提供一个入口就可以了。
  3. 动态更新插件:插件app在开发完后下发到宿主app里,点击相应的入口就可以跳转到最新版的插件app了。
  4. 按需下载模块。
  5. 解决方法数超过天花板(65536)。

插件化要解决的问题

1.动态加载apk

  • 插件App需要在宿主App中进行插桩:ProxyActivity,专门用来加载插件App的Activity,并且在Manifest.xml中进行注册。
  • 实际场景中插件apk(plugin.apk)肯定是由服务端下发后,保存到SD卡的某个文件夹下,在宿主App中去加载插件App到ProxyActivity。
  • 由于插件App没有安装,使用DexClassLoader来加载apk,然后通过反射在运行时来实现获得方法和参数,这样就可以把Activity调用起来。

2.资源加载

  • 用AssetManager的隐藏方法addAssetPath。

3.代码加载

  • 类的加载可以使用Java的ClassLoader机制,但是对于Android来说,并不是说类加载进来就可以用了,很多组件都是有“生命”的;因此对于这些有血有肉的类,必须给它们注入活力,也就是所谓的组件生命周期管理;

插件化必要基础

1.ClassLoader类加载器

2.Java反射

3.插件资源访问

4.代理模式

插件化开源项目

  • Dynamic-load-apk:任玉刚,原理是在宿主中埋一个代理Activity,更改ClassLoader后找到加载插件中的Activity,使用宿主中的Activity作为代理,回调给插件中Activity所以对应的生命周期。
  • DroidPlugin:是张勇实现的一套插件化方案,它的原理是Hook客户端一侧的系统Api。

相关学习

  • Droid Plugin 插件框架
  • 《Android插件化开发指南》
  • https://www.jianshu.com/p/d9a823e94fb7

你可能感兴趣的:(Android学习笔记之插件化(未完成))