【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )

2023-03-29 13:20:39 浏览数 (1)

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 中的资源主动加载进来 ;

0 人点赞