Android插件化技术真正在国内得到迅速发展,是在2015年。
那时业务的发展暴露了Android Native的两大问题:
一是技术上代码量急剧膨胀,模块热更新有了更高要求;
二是功能模块的解耦以及维护团队的分离是大势所趋。
【RN会取代插件化吗?】
H5和Hybird可以解决这些问题,但是始终比不上native的用户体验。所以纯native的插件化技术在国内各大厂商中得到了广泛的应用。但有观点认为比起插件化,RN会是真正实现动态化的最佳方式。
不过至少目前插件化技术在中国是有市场的,比如做一款电商或旅游类的APP,非常频繁需要使用四大组件,四大组件又必须实现插件化。所以国内Android的未来必将是RN和插件化的天下。
【插件化技术解析】
插件化技术听起来高深莫测,实际上要解决的就是两个问题:代码加载和资源加载。
•代码加载
类的加载可以使用Java的ClassLoader机制,但是对于Android来说,并不是说类加载进来就可以用了,很多组件都是有“生命”的;因此对于这些有血有肉的类,必须给它们注入活力,也就是所谓的组件生命周期管理;
另外,如何管理加载进来的类也是一个问题。假设多个插件依赖了相同的类,是抽取公共依赖进行管理还是插件单独依赖,这就是ClassLoader的管理问题。
•资源加载
资源加载方案大家使用的原理都差不多,都是用AssetManager的隐藏方法addAssetPath;但是,不同插件的资源如何管理?是公用一套资源还是插件独立资源?共用资源如何避免资源冲突?对于资源加载,有的方案共用一套资源并采用资源分段机制解决冲突(要么修改aapt要么添加编译插件);有的方案选择独立资源,不同插件管理自己的资源。
【插件化开源项目推荐】
下面介绍国内应用极多的插件化开源项目:
▎DroidPlugin
Github:https://github.com/DroidPluginTeam/DroidPlugin
介绍:
DroidPlugin 是 360 手机助手实现的一种插件化框架,它可以直接运行第三方的独立 APK 文件,完全不需要对 APK 进行修改或安装。一种新的插件机制,一种免安装的运行机制,是一个沙箱, 是模块化的基础。
DroidPlugin 插件机制 :它可以在无需安装、修改的情况下运行APK文件,此机制对改进大型APP的架构,实现多团队协作开发具有一定的好处。
▎Small
Github:https://github.com/wequick/Small
介绍:
Small 是一种实现轻巧的跨平台插件化框架,基于“轻量、透明、极小化、跨平台”的理念。
▎VirtualAPK
github:https://github.com/didi/VirtualAPK
介绍:
VirtualAPK 是滴滴开源的一套插件化框架,支持几乎所有的 Android 特性,四大组件方面。
VirtualAPK 对插件没有额外的约束,原生的 apk 即可作为插件。插件工程编译生成 apk后,即可通过宿主 App 加载,每个插件 apk 被加载后,都会在宿主中创建一个单独的 LoadedPlugin 对象。通过这些 LoadedPlugin 对象,VirtualAPK 就可以管理插件并赋予插件新的意义,使其可以像手机中安装过的App 一样运行。
▎RePlugin
GitHub:https://github.com/Qihoo360/RePlugin
介绍:
RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。
目前360公司几乎所有的亿级用户量的APP,以及多款主流第三方APP,都采用了RePlugin方案。
RePlugin各特性描述:
插件数
103(核心57个)
插件占应用比
高达83%
年发版次数
高达596次(工作日均2次)
崩溃率
万分之一(0.01%),极低
时间
2014年应用,3年验证
▎Android-Plugin-Framework
GitHub:https://github.com/limpoxe/Android-Plugin-Framework
介绍:
Android-Plugin-Framework是一个Android插件化框架,用于通过动态加载的方式免安装运行插件apk。
尽管此框架支持独立插件,但目标并不是为了支持任意三方app,不同于平行空间或应用分身之类的产品。框架的做法是按需hook,即需要用到哪些系统特性和api,就对哪些特性和api提供支持。这种做法对开发非独立插件和二方独立插件而言完全足够。
▎DL动态加载框架
Github:https://github.com/singwhatiwanna/dynamic-load-apk
介绍:
DL框架动态加载主要解决两个复杂的问题:资源的访问和activity生命周期的管理。除此之外,DL框架也很好地解决了许多坑爹的小问题。需要说明的一点是,我们不可能调起任何一个未安装的apk,这在技术上是很难实现的,我们调起的apk必须受某种规范的约束,只有在这种约束下开发的apk,我们才能将其调起。
▎AndroidDynamicLoader
GitHub:https://github.com/mmin18/AndroidDynamicLoader
介绍:
Android 动态加载框架,他不是用代理 Activity 的方式实现而是用 Fragment 以及 Schema 的方式实现。可以下载演示:
▎DynamicAPK
GitHub:https://github.com/CtripMobile/DynamicAPK
介绍:
实现Android App多apk插件化和动态加载,支持资源分包和热修复。携程App的插件化和动态加载框架。
▎ACDD
GitHub:https://github.com/bunnyblue/ACDD/blob/master/README-Zh.md
介绍:
非代理Android动态部署框架,代码遵循MIT License,Activity 、Receiver支持stub模式,有bug的话可以在issue里面提交。
**Gif演示动画 **
(https://github.com/bunnyblue/ACDDExtension/blob/master/Dist/ACDDLauncher.apk)
Android资深工程师成长计划系列课程之《热修复和插件化专题》限20个优惠名额,
想学好本课程先掌握NDK和JNI基础↓↓↓
网友评论