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

举报
韩曙亮 发表于 2022/01/10 23:29:11 2022/01/10
【摘要】 Android 插件化系列文章目录 【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插...

在这里插入图片描述

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



在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/117430014

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。