android 插件化介绍

插件化是什么?

说到插件化,其实在我们生活是很常见,比如u盘,用的时候插上,不用的时候拔下,任何品牌的u盘都可以插在电脑上,无线鼠标,无线键盘,外界屏幕等等,这些都是插件化的例子。

那么android中的插件化技术,目前已经比较成熟,比如微信,淘宝,携程,360手机助手中都应用到了插件化。他的特点是无需单独安装apk,即可运行,即插即用,无需升级宿主应用,减少app的更新频率,除此之外他还可以降低模块耦合,按需加载,节省流量等特点。

拿我们自己的考试app举例,我们的app主要做英语考试,那么英语考试分很多种,sat、toefl、ielts考试题目呈现方式都不相同,有的学生需要sat,有的学生需要sat、toefl,目前的解决方案是每个考试都是一个单独app成了很多功能的耦合。

为了解决这种问题,考虑引入插件化技术,按需引入所需考试类型的安装包。

介绍名词

插件化 – apk 分为宿主和插件部分,插件在需要的时候才加载进来

热修复 – 更新的类或者插件粒度较小的时候,我们会称之为热修复,一般用于修复bug

热更新 – 2016 Google 的 Android Studio 推出了Instant Run 功能 同时提出了3个名词

“热部署” – 方法内的简单修改,无需重启app和Activity。 “暖部署” – app无需重启,但是activity需要重启,比如资源的修改。 “冷部署” – app需要重启,比如继承关系的改变或方法的签名变化等。

所以站在app开发者角度的“热”是指在不发版的情况来实现更新,而Google提出的“热”是指值是否需要重新启动。 同时在开发插件化的时候也有两种情景,一种是插件与宿主apk没有交互,只是在用户使用到的时候进行一次吊起,还有一种是与宿主有很多的交互。

基本原理

插件化的原理实际是 Java ClassLoader 的原理,看其他资料前请先看:Java ClassLoader基础

Java类加载器

Android应用程序的.java文件在编译期会通过javac命令编译成.class文件,最后再把所有的.class文件编译成.dex文件放在.apk包里面。那么动态加载就是在运行时vm把插件apk直接加载到classloader里面的技术

反射原理

主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义

代理模式及Java实现动态代理

定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。

为什么用?

65535方法数天花板

随着业务的不断发展,外部库的引入,导致方法数的增加,应用中的Dex 文件方法数超过了最大值65536的上限,就会引爆android系统。这种情况可以通过削减重复方法数来治标,也有谷歌官方在API 21中提供了通用的解决方案,那就是android-support-multidex.jar. 这个jar包最低可以支持到API 4的版本(Android L及以上版本会默认支持mutidex),同时插件化也是解决方案的一种。

减少主包大小

编译提速

可选模块按需下载

​例如模块可以在需要时进行加载,减少App Size,如只用到sat就只下载sat,只用toefl就只下载toefl的插件

并行开发,独立Testing

可以独立开发A、B版本的模块,而不是将A、B版本代码写在同一个模块中。

app架构

崩溃隔离

某一插件的崩溃,影响仅局限当前插件,不会导致其他插件以及宿主的崩溃

有什么限制?

通知栏限制

无法在插件中发送具有自定义资源的Notification,例如: a. 带自定义RemoteLayout的Notification b. 图标通过R.drawable.XXX指定的通知(插件系统会自动将其转化为Bitmap)

系统适配

Dex的加载与系统版本依赖严重,可能会导致新版SDK不支持等问题

需要预先注册权限

宿主的权限要多于插件的权限, 否则会权限不足,无法在插件中注册一些具有特殊Intent Filter的Service、Activity、BroadcastReceiver、ContentProvider等组件以供Android系统、已经安装的其他APP调用。

国外资料少的原因

国外andrid以及所有app应用都上传google play store或apple store,这两个市场的审核较为严格,不经审核的热更新的应用很容易被下架

限制解决办法

占坑

对于service,ContentProvider需要提前在宿主注册

自己实现包管理服务PMS

使用方法与原生方式差异大

写一个“正常”的模块和写一个动态加载模块,写法是不一样的,插件内部对资源的访问只能通过自己定义的方式,包括对layout文件的inflate等,使用getResouces的方式,分分钟crash给你看,而且内部实现有些复杂,容易出现莫名其妙的

已有插件化框架对比
360 DroidPlugin
是360手机助手在Android系统上实现了一种新的插件机制,多进程实现,更新插件时,真正热更新. 后面会针对DroidPlugin详细学习

DL 动态加载框架

阿里ACCD(原OpenAtlas)
非代理Android动态部署框架

携程 DynamicAPK
实现Android App多apk插件化和动态加载,支持资源分包和热修复.携程App的插件化和动态加载框架.

未来趋势

插件化作为近几年比较火的技术,有他的适用场景,但是有很大的局限性,在扩展性,适应性方面都赶不上react-native,未来的趋势还是移动web化更占优势

其他资料

包建强:android插件化从入门到放弃

蘑菇街Android组件与插件化

使用DroidPlugin的示例

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

推荐阅读更多精彩内容