Android插件化主流框架和实现原理

  • PathClassLoader:只能加载已经安装到 Android 系统中的 APK 文件。因此不符合插件化的需求,不作考虑。
  • DexClassLoader:支持加载外部的 APK、Jar 或者 dex 文件,正好符合文件化的需求,所有的插件化方案都是使用 DexClassloader 来加载插件 APK 中的 .class文件的。

主流框架

在 Android 中实现插件化框架,需要解决的问题主要如下:

  • 资源和代码的加载
  • Android 生命周期的管理和组件的注册
  • 宿主 APK 和插件 APK 资源引用的冲突解决

下面分析几个目前主流的开源框架,看看每个框架具体实现思路和优缺点。

DL 动态加载框架 ( 2014 年底)

是基于代理的方式实现插件框架,对 App 的表层做了处理,通过在 Manifest 中注册代理组件,当启动插件组件时,首先启动一个代理组件,然后通过这个代理组件来构建,启动插件组件。 需要按照一定的规则来开发插件 APK,插件中的组件需要实现经过改造后的 Activity、FragmentActivity、Service 等的子类。

优点如下:

  • 插件需要遵循一定的规则,因此安全方面可控制。
  • 方案简单,适用于自身少量代码的插件化改造。

缺点如下:

  • 不支持通过 This 调用组件的方法,需要通过 that 去调用。
  • 由于 APK 中的 Activity 没有注册,不支持隐式调用 APK 内部的 Activity。
  • 插件编写和改造过程中,需要考虑兼容性问题比较多,联调起来会比较费时费力。

DroidPlugin ( 2015 年 8 月)

DroidPlugin 是 360 手机助手实现的一种插件化框架,它可以直接运行第三方的独立 APK 文件,完全不需要对 APK 进行修改或安装。一种新的插件机制,一种免安装的运行机制,是一个沙箱(但是不完全的沙箱。就是对于使用者来说,并不知道他会把 apk 怎么样), 是模块化的基础。

实现原理:

  • 共享进程:为android提供一个进程运行多个 apk 的机制,通过 API 欺骗机制瞒过系统。
  • 占坑:通过预先占坑的方式实现不用在 manifest 注册,通过一带多的方式实现服务管理。
  • Hook 机制:动态代理实现函数 hook ,Binder 代理绕过部分系统服务限制,IO 重定向(先获取原始 Object –> Read ,然后动态代理 Hook Object 后–> Write 回去,达到瞒天过海的目的)。

插件 Host 的程序架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优点如下:

  • 支持 Android 四大组件,而且插件中的组件不需要在宿主 APK 中注册。
  • 支持 Android 2.3 及以上系统,支持所有的系统 API。
  • 插件与插件之间,插件与宿主之间的代码和资源完全隔阂。
  • 实现了进程管理,插件的空进程会被及时回收,占用内存低。

缺点如下:

  • 插件 APK 中不支持自定义资源的 Notification,通知栏限制。
  • 插件 APK 中无法注册具有特殊的 IntentFilter 的四大组件。
  • 缺乏对 Native 层的 Hook 操作,对于某些带有 Native 代码的插件 APK 支持不友好,可能无法正常运行。
  • 由于插件与插件,插件与宿主之间的代码完全隔离,因此,插件与插件,插件与宿主之间的通信只能通过 Android 系统级别的通信方式。
  • 安全性担忧(可以修改,hook一些重要信息)。
  • 机型适配(不是所有机器上都能行,因为大量用反射相关,如果rom厂商深度定制了framework层,反射的方法或者类不在,容
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值