不少朋友私信问到这个问题,这里简单介绍下我的了解
1、作用
大多数朋友开始接触这个问题是因为 App 爆棚了,方法数超过了一个 Dex 最大方法数 65535 的上限,因而便有了插件化的概念,将一个 App 划分为多个插件(Apk 或相关格式)
常用的其他解决方法还包括:Google Multidex,用 H5 代替部分逻辑,删无用代码,买付费版的 Proguard
当插件化作用不止于此,还包括:(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低 (5) 节省升级流量
2、概念
Android 插件化 —— 指将一个程序划分为不同的部分,比如一般 App 的皮肤样式就可以看成一个插件
Android 组件化 —— 这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指通用及复用性较高的构件,比如图片缓存就可以看成一个组件被多个 App 共用
Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运⾏状态下动态加载某个模块,从而新增功能或改变某⼀部分行为
3、相关资料
插件化的原理实际是 Java ClassLoader 的原理,看其他资料前请先看:Java ClassLoader基础
Android 也有自己的 ClassLoader,分为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,区别在于 PathClassLoader 不能直接从 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已经安装过的 apk(因为安装过的 apk 在 cache 中存在缓存的 dex 文件)。而 DexClassLoader 可以加载外部的 apk、jar 或 dex文件,并且会在指定的 outpath 路径存放其 dex 文件。
目前开源的插件化框架有:
(1) DynamicLoadApk
GitHub:https://github.com/singwhatiwanna/dynamic-load-apk
这个项目实现了一部分的动态加载,原理是 DexClassLoader 加 Activity 代理,可以看看。即在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,这样就解决了 Activity 必须注册的问题。
当然这个项目里也有不少问题没解决,有兴趣可以加入他们。
(2) AndroidDynamicLoader GitHub:https://github.com/mmin18/AndroidDynamicLoader
这是点评一个工程师介绍的方式,和上面不同的是:他不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现
(3) Android PluginManager GitHub:https://github.com/houkx/android-pluginmgr
这个项目的原理实际也是 DexClassLoader 加 Activity 代理,不同的是上面的 dynamic-load-apk 项目中,插件需要依赖框架的 lib,插件组件继承框架 lib 的 Base 组件。而这个框架通过字节码操作动态生成一个子类去继承插件组件解决插件必须依赖框架的问题,从而达到插件无需做任何改动(理论上)即可加载的效果。
(4) 最近的:
淘宝的 Atlas
360 的 DroidPlugin
(5) 其他资料
淘宝伯奎:Android插件化及动态部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html
更多插件化开源项目可见:插件化开源项目收集
对你有帮助的话,去知乎点个赞让更多人了解:怎么将 Android 程序做成插件化的形式
最后:插件化 Demo 实现起来很简单,但整体以及细节的考虑很多,还是很费时间的,大家有其他不错的资料也欢迎评论中告诉我
Pingback: Android 插件化 动态升级 | 转载文章 | android学习 – android开源码 – 移动互联网
动态加载啊,以前在做网页扒取的时候,因为网页结构可能会改变,所以就把网页内容解析的逻辑放在一个jar里,通过下发jar来更新,那时候还没想那么多啊,用的是java反射的功能,这是不是就是一种插件化啊
对,这也算,对于 Java 来说动态加载就是动态加载 Jar,Android 来说 Jar 和 Dex 都可以
那要是被调用apk中加载了第三方的so库呢?这种情况的流程是什么样子的啊??调用方如何模拟loadLibrary的操作?
这个没有具体测试过,你有时间测试的话欢迎给我反馈
分享精神
也可以分享出去让更多人受益
插件化有什么好处吗? 啥需求会需要这个呢?
第一部分作用中不是解释的很清楚了吗.
好顶赞,最近也看了些类似的文章,有了一些思路,楼主整理的很好ps: 那哥们不是点评的是点心的,我们这边一个点评的同事说不认识他
两个开源项目,实现的思路不一样,第一个在点心,第二个在点评
嗯,确认了下,是这样,点评那边是在用动态替换Fragment的方式 ,大部分地方都用Fragment开发,已分享到Twitter
嗯,是的
你有认识点评移动那边的人是吧?
嗯,是的,他们Android和iOS一直都在用动态更新
坐等分析,膜拜楼主
必须关注,谢谢LZ分享!
顶起 学习学习
前排占座