Android 插件化系列文章目录
【Android 插件化】插件化简介 ( 组件化与插件化 )
【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
【Android 插件化】插件化原理 ( 类加载器 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
文章目录
- Android 插件化系列文章目录
- 一、" 插桩式 " 插件化
- 二、插件包中的组件类 与 应用中的组件类 区别
- 三、" 代理 " 组件 与 " 插件 " 组件
- 四、" 插桩式 " 插件化框架实现思路
一、" 插桩式 " 插件化
将 " 插件 " 模块 编译打包成 apk 文件 , 该文件包含 classes.dex 文件 , 被打包在了 apk 压缩包中 ;
只要拿到了 apk 文件 , 就可以将其解压 , 获取到其中的 classes.dex 文件 , 可以自己实现一个 DexClassLoader 加载该 dex 文件 , 进而调用其中封装的字节码类对象 ;
" 插桩式 " 插件化 : 在 " 宿主 " 模块 应用中 , 将 " 插件 " 模块 apk 插入到程序中 , 可以调用这些 apk 安装包中的功能 ; " 宿主 " 模块中需要提前预留好 插件组件 对应的 代理组件 接口 ;
类似于电脑主板 , 提前预制好插槽 , 可以插入内存条 , 显卡等硬件设备 , 主板运行时调用这些设备 ;
二、插件包中的组件类 与 应用中的组件类 区别
应用中的组件 :
应用运行时 , 插件包 apk 是 运行后才加载的 , 将该 apk 文件中的 dex 加载到内存之后 , 其中的 Activity , Service 等组件类 , 与 当前应用运行的组件 是有区别的 , 这些新加入的组件类没有上下文 ;
应用中的 Activity , Service 等组件初始化 , 不需要开发者干预 , 都是由系统完成的 , 这些组件都在清单文件中注册过了 , 系统按照清单初始化相关组件 ;
插件包中的组件 :
插件包 apk 中的类 , 是通过 DexClassLoader 加载到内存中的 , 仅仅是加载了 字节码数据 , 组件的初始化 , 赋予上下文等 , 必须 由开发者手动完成 , 应用系统是不管的 ;
加载的插件中的 Activity 并不是 Activity 组件 , 只是 有 Activity 方法 , 成员 , 继承关系的字节码类 ;
插件 Activity 类没有生命周期 , 不在 ActivityManagerService 管理范畴内 ;
这些通过插件包加载进来的组件类的生命周期 , 需要开发者进行管理 ;
三、" 代理 " 组件 与 " 插件 " 组件
代理 Activity ( ProxyActivity ) 与 插件 Activity ( PluginActivity ) :
将加载进来的 Activity 类 ( PluginActivity ) 当做普通类 , 构造一个 代理 Activity , 命名为 ProxyActivity , 在 ProxyActivity 中 持有从 apk 插件包中加载的 PluginActivity 类对象 ;
ProxyActivity 是空的 Activity , 没有任何实际的业务逻辑 , 只是作为一个 生命周期的转接代理接口 ; 但是 ProxyActivity 有着完整的生命周期回调机制 , 在进入该界面时会回调 onCreate , onStart , onResume 生命周期方法 , 在退出该界面时会回调 onPause , onStop , onDestroy 生命周期方法 ;
在 ProxyActivity 中的生命周期方法中, 调用 PluginActivity 相应的生命周期方法即可 ;
ProxyActivity 运行时会有上下文 , PluginActivity 使用上下文时调用 ProxyActivity 的上下文 ;
四、" 插桩式 " 插件化框架实现思路
" 插桩式 " 插件化框架 实现思路 : 如果要加载 " 插件 " 模块 编译的 apk 插件包中的 Activity 类 , 需要执行如下流程 ;
① 加载类对象 : 使用 DexClassLoader 加载 Activity 对应的 Class 字节码类对象 ;
② 管理生命周期 : 处理加载进来的 Activity 类的生命周期 , 创建 ProxyActivity , 通过其生命周期回调 , 代理管理 插件包中加载的未纳入应用管理的组件 Activity 类 ;
③ 注入上下文 : 为加载进来的 Activity 类注入 上下文 ;
④ 加载资源 : 使用 AssetManager 将插件包 apk 中的资源主动加载进来 ;