前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )

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

作者头像
韩曙亮
发布2023-03-29 13:20:39
5930
发布2023-03-29 13:20:39
举报
文章被收录于专栏:韩曙亮的移动开发专栏

Android 插件化系列文章目录

【Android 插件化】插件化简介 ( 组件化与插件化 )

【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

【Android 插件化】插件化原理 ( 类加载器 )

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

【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android 插件化系列文章目录
    • 文章目录
    • 一、" 插桩式 " 插件化
    • 二、插件包中的组件类 与 应用中的组件类 区别
    • 三、" 代理 " 组件 与 " 插件 " 组件
    • 四、" 插桩式 " 插件化框架实现思路
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档