Android插件化初识

含义:能够简单理解为将一个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。

 

插件化必备基础:

ClassLoader类加载器

要想实现加载外部dex文件(即插件)来实现热部署,那么必然要把其中的class文件加载到内存中。

其中涉及到两种ClassLoader:DexClassLoader和PathClassLoader。而DexClassLoader能够加载外部的jar,dex等文件,正是咱们须要的。

Java反射

由于插件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的方式,都是对代理模式的应用。

相关文章
相关标签/搜索