现在的位置: 首页 > 移动开发 > 正文

Android 插件化 动态升级

2017年02月17日 移动开发 ⁄ 共 1448字 ⁄ 字号 评论关闭

Android 插件化 动态升级

最新内容请见原文:Android
插件化 动态升级

 

不少朋友私信以及 Android开源交流几个 QQ 群 中都问到这个问题,这里简单介绍下

1、作用

大多数朋友开始接触这个问题是因为 App 爆棚了,方法数超过了一个 Dex 最大方法数 65535 的上限,从这个介绍中也知道可以通过多个 Dex 来解决这个问题,因而便有了插件化的概念,将一个 App 划分为多个插件(Dex或相关格式)

常用的其他解决方法还包括:删无用代码,用 H5 代替部分逻辑,买付费版的 Proguard

插件化的其他作用包括:(1) 模块解耦,(2) 单个dex函数不能超过 65535,(3) 动态升级,(4) 高效开发(编译速度更快)

 

2、概念

Android 插件化 —— 是指将一个程序划分为不同的部分,比如一般 App 的皮肤样式就可以看成一个插件

Android 组件化 —— 这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指通用及复用性较高的构件,比如图片缓存就可以看成一个组件被多个 App 共用

Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运⾏状态下动态加载某个模块,从而新增功能或改变某⼀部分行为

 

3、相关资料

插件化的原理实际是 Java ClassLoader 的原理,看其他资料前请先看:Java ClassLoader基础及加载不同依赖 Jar 中的公共类

 

Android 也有自己的 ClassLoader,分为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,区别在于 PathClassLoader 不能直接从 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已经安装过的 apk(因为安装过的 apk 在 cache 中存在缓存的 dex 文件)。而 DexClassLoader 可以加载外部的 apk、jar 或 dex文件,并且会在指定的 outpath 路径存放其 dex
文件

 

(1) 开源项目
https://github.com/singwhatiwanna/dynamic-load-apk

这个项目实现了一部分的动态加载,原理是 DexClassLoader 加 Activity 代理,可以看看。

这个项目里有几个问题没解决,一个是 FragmentActivity 或是 ActionBarActiviy 的代理方式不行,因为存在 ClassLoader 隔离问题,可用打包方式去掉相同依赖包只保留一份来解决。that 指针可通过复写大部分接口从而改为 this 指针调用即可,另外 Activity 的创建过程有缺失

 

https://github.com/mmin18/AndroidDynamicLoader

这是点评一个工程师介绍的方式,和上面不同的是:他不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现

 

(2) 其他资料

淘宝伯奎:Android插件化及动态部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html

 

最后:Demo 实现起来很简单,但整体以及细节的考虑很多,还是很费时间的,大家有其他不错的资料也欢迎评论中告诉我

 

透露下:

如果时间允许的话,国庆前会把我上半年对于插件化分享的 PPT 放出来,至于整体的实现源码的开源因为还有不少小 Bug,还得等一段时间

中秋后会放出上半年一个关于 Java 注解以及几个常用开源项目注解原理的分析,欢迎围观

    推荐文章:

  • 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(五)代码复用
  • 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩.NET的B/S的教训(四)
  • 浅谈公司的技术方向 Java 与 .Net 的分工合作,一个公司的整体技术定位
  • 上个周末走访福州市2家软件公司,感受颇多,把经验分享给大家
  • 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java开源C/S的教训(二)
  • 去年这时候辞退了一个开发人员,不知道他现在是否还在写程序了,可以对比一下编程水平
  • 今天虽然被冤枉挨骂心情还是很好多写了一篇,“创业期间3元钱给大家带来的小小乐趣”
  • 这些年,亲眼所见的软件公司中混迹的老油条汇总
  • 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理
  • 折腾 VS2008 + ReportViewer + CrystalReports + PrintControl.cab 实现水晶报表本地打印
  • 标准功能模块组件 -- “文档管理组件,网络文档管理,网络存储”,B/S版本组件可独立运行,也可集成到其他项目里,数据结构清晰思路严谨
  • 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java开源B/S的教训(三)
  • 我是如何学习一门开发语言(适合最最菜的鸟,入门参考阅读)
  • 去年这时候又辞退了一个老油条,不知道他现在是否在开公司了,可以对比一下混工资的水平
  • 通过制定编码规范的过程来说明《学会放弃、妥协也是个大进步,也是相当的提高工作效率》
  • 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java技术的教训(一)
  • 抱歉!评论已关闭.