含义:能够简单理解为将一个app分为多个小的app,其中有一个为宿主app。java
解决的主要问题:代码加载、资源加载。app
插件的方式:apk安装,apk不安装,dex包框架
插件化的优势:函数
1) 模块解耦,应用程序扩展性强学习
2) 解除单个dex函数不能超过 65535的限制spa
3) 动态升级,下载更新节省流量插件
4) 高效开发(编译速度更快)代理
插件化的缺点:对象
1) 增长了主应用程序的逻辑难度生命周期
2) 技术有难度,目前一些成熟的框架都是闭源的
插件化开发—动态加载技术加载已安装和未安装的apk
动态加载技术就是使用类加载器加载相应的apk、dex、jar(必须含有dex文件),再经过反射得到该apk、dex、jar内部的资源(class、图片、color等等)进而供宿主app使用。
代码加载:
类的加载可使用Java的ClassLoader机制,还须要组件生命周期管理。
资源加载:
用AssetManager的隐藏方法addAssetPath。
插件化必备基础:
要想实现加载外部dex文件(即插件)来实现热部署,那么必然要把其中的class文件加载到内存中。
其中涉及到两种ClassLoader:DexClassLoader和PathClassLoader。而DexClassLoader能够加载外部的jar,dex等文件,正是咱们须要的。
由于插件apk与宿主apk不在一个apk内,那么一些类的访问必然要经过反射进行获取。因此了解反射对插件化的学习是必须的。
res里的每个资源都会在R.java里生成一个对应的Integer类型的id,APP启动时会先把R.java注册到当前的上下文环境,咱们在代码里以R文件的方式使用资源时正是经过使用这些id访问res资源,然而插件的R.java并无注册到当前的上下文环境,因此插件的res资源也就没法经过id使用了。
查看源码,经过“addAssetPath”方法从新生成一个新的Resource对象来保存插件中的资源,避免冲突。
插件化实现的过程主要靠欺上瞒下,坑蒙拐骗来实现。想一想虽然加载进来了Activity等组件,但也仅仅是最为一个对象而存在,并无在AndroidManifest中注册,没有生命周期的回调,并不能实现咱们想要的效果。所以不管是dynamic_load_apk经过代理activity来操控插件activity的方式,仍是DroidPlugin经过hook activity启动过程来启动插件activity的方式,都是对代理模式的应用。