Android插件框架机制研究

插件化的基本形式是将一个apk 中的不同功能模块进行拆分,并打入到不同的dex文件或者apk 文件中,主工程只是一个空壳,提供了用来加载模块dex 或者apk 的框架。

插件化的好处

提升Android studio 工程的构建速度

提升应用的启动速度:

支持多团队并行开发

在线动态加载或者更新模块

按需加载不同的模块,实现灵活的功能配置

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

资源和代码的加载

android 生命周期的管理和组件的注册

插件Apk 和宿主Apk

基本概念

宿主和插件

宿主apk 实现了一套插件的加载和管理的框架,它作为应用的主工程存在,插件apk 都是依托于宿主apk 而存在的

插件apk 是每个独立的功能模块,可以通过在线配置和更新实现插件apk 在宿主apk 中的上线和下线,以及动态更新实现插件apk 在宿主中的上线和下线,以及动态更新等功能。

ClassLoader 机制

android 中的ClassLoader 机制主要用来加载dex 文件,系统提供了两个api 可供选择

PathClassLoader:只能加载已经安装到Android 系统中的apk 文件,因此不符合插件化的需求,不作考虑。

DexClassLoader: 支持加载外部的apk ,jar 或者dex 文件,整好符合插件化的需求,所有的插件化方案都是使用DexClassLoader 来加载插件apk 中的.dex 文件的。

开源框架介绍

android-pluginmgr

项目地址

实现原理是使用DexMaker 的动态部署更能来生成Activity ,让这个Activity 集成目标插件所在的activity。

主要优点

插件app 不需要设置任何规则或者限制

技术方法相对成熟稳定

主要特征

基于热部署实现,隐藏框架的稳定性有待 加强,OOM 问题叫突出

只支持activity ,不支持其它组件,通用性较差

dynamic-load-apk

项目地址

基于代理的方式实现插件框架,需要按照一定的规则来开发插件apk,插件中的组件需要实现经过改造后的Activity,FragmentActivity,Service等的子类。

主要特征

插件需要遵循一定的规则,因此安全方面更加可控。

方案简单,适用于自身少量代码的插件化改造

主要缺点

不支持通过this调用组件的方法,需要通过that 去调用

由于Apk 中的Activity 没有注册,不支持隐式调用APK 内部的Activity

插件编写和改造过程中,需要考虑兼容性问题比较多,联调起来会比较费时费力

DynamicAPK

项目地址

是携程实现的一种多APK/DEX 加载的插件框架解决方案,使用这个框架,我们可以实现android studio 多个module 工程并行开发模式,同时可以实现在线热修复功能。

主要特征

很少的修改即可实现插件化改造

提升工程的编译速度,更好的实现并行开发

按需下载和更新模块的代码和资源,实现在线热更新和热修复

提高app 启动速度

主要缺点

插件工程不支持Native 代码,例如不支持so 库

插件工程不支持对Library 工程、aar、maven 远程仓库的依赖

DroidPlugin

项目地址

是360 手机助手实现的一种插件化框架,它可以直接运行第三方的独立apk 文件,完全不需要对apk 进行修改或者安装。

主要特征

支持android 四大组件,而且插件中的组件不需要再宿主apk 中注册

支持android 2.3 及以上的系统,支持所有的系统api

插件与插件直接,插件与宿主直接的代码和资源是完全隔离的

实现了进程管理,插件的空进程会被及时回收,占用内存低

主要缺点

插件apk中无法注册具有特殊IntentFilter 的四大组件

插件apk 中不支持自定义资源的notification

缺乏对native 层的Hook 操作,对于某些带有Native 代码的插件apk 支持不好,可能无法正常运行

由于插件与插件,插件与宿主之间的代码完全隔离,因此,插件与插件,插件与宿主直接通信只能通过android 系统级别的通信方式。

Small

项目地址

Small 目的是实现最轻巧的跨平台插件化框架,它最低支持Android api level 8 和 ios 7.0.

主要特征

所有的插件支持内置于宿主包中

插件的编码和资源文件的使用与普通应用没有差别

通过设定 URI,宿主以及Nativie 应用插件,Web 插件,在线网页等能够方便的进行通信

支持android ,ios 和html5 ,三者可以通过同一套javascript 接口实现通信

Small 目前唯一的不足时暂不支持Service 的动态注册,不过这个可以通过Service 预先注册在宿主的AndroidManifest.xml 文件中进行规避,因为Service 的更新频率通常比较低。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,394评论 25 707
  • 最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优...
    斜杠时光阅读 3,940评论 1 36
  • 动态加载技术 介绍 在程序运行的时候,加载一些程序自身原本不存在的可执行文件并运行这些文件里的代码逻辑。 动态调用...
    冰点k阅读 3,883评论 1 11
  • 从前对城市生活很向往 看过之后好像不过如此吧 看着钢筋水泥建起的高楼大厦 装满了都市人的欲望 这里的人满脸倦容高唱...
    视点说阅读 230评论 0 1
  • 你不愿意种花,你说,我不想看着它一点点凋落,是的,为了避免结束,你避免了一切开始。 ----顾城
    西湖泛舟客阅读 297评论 0 0