随着移动应用(app)业务的扩展,原来传统的开发模式渐渐的无法满足现实需求,因此暴露出诸多问题,如65535问题、anroid stduio编译过慢的问题、应用修复成本过高等等..
在2015年,终于爆发一场热修复的技术革命,各大公司分别推出解决方案:以阿里的andfix、腾讯的tinker、360的droidplugin为代表纷纷入场,当然,他们的出发点都是针对自己旗下的产品而设计,因此,也是各有千秋,各有优劣。
andfix
实现原理:基于dex文件的插队,通过native层hook到java代码进而完成filed、method的替换而完成。
优点:这个框架的优点在于轻巧便捷,集成成本低,维护性强。
局限性:只能修复对应已经存在的方法,比如现在我想增加一个方法肯定不行的,如果想给修复方法增加参数信息也是不可的,
这个局限性就非常大了。还有一个局限性就是只能进行代码修复,资源是无法做到的。所以从这里可以看到这个框架更偏重于方法的热修复操作。
tinker
实现原理:基于动态代理,通过PathClassLoader加载全量补丁包完成修复。
优点:
支持类、资源、so修复
兼容性处理的很好,全平台支持
由于不用插庄,所以性能损耗很小
完善的开发文档和官方技术支持
gradle支持,再自己定义下可以一键打补丁包
dexDiff算法使得补丁文件较小
扩展性良好,代码中处处为开发者留出开放接口,简直业界良心
支持多次补丁
缺点:
不支持及时生效,下发补丁需要重启生效,MultiDex方案决定的
占用ROM空间较大,这点空间在如今的手机大ROM下也不算个事
对加固支持不太好
droidplugin
如果说andix和tinker是热修复的代表,那么droidplugin就是插件化的代表了。
实现原理:动态代理、占坑、Hook
资料:http://weishu.me/2016/01/28/understand-plugin-framework-overview/
优点:资源隔离,无需安装就可以启动应用等
缺点:难以维护,原因很多种(各种手机生产商之间利益关系)
而时间到2016年,对于一线互联网巨头公司来说没有什么变化,他们仍然可以使用他们技术积累不断完善框架,而对于小公司尤其是创业公司来说,热修复的成本其实是不低的,实用性
不是那么的强,反而被这些框架的各种兼容性问题困住。组件化的出现,不能不说是另外一个思路,通过对业务的拆分,达到解耦的目的,各个模块之间互不影响,每一个业务模块都可以当成一个小应用,这样效率就上来了。
不过,模块化开发需要解决一个问题,那就是模块之间如何实现通信,AIDL当然是一个思路,但是它用来进行数据传递和消息发送等等是很好的,如果用来进行普通的界面转跳等就显得大材小用,杀鸡用牛刀了,这个时候,一个重要的设计模式起了作用,它就是AOP,是不是很面熟,没错,有JAVAEE开发经验的同学再熟悉不过了---面向切面编程,android中APT, AspectJ, Javassist号称三大剑客。那我觉得哪一个可以解决问题呢?我们熟悉的APT框架很多,Eventbus就是基于APT开发的,注解、反射、生成代码一并打包巴拉巴拉...
思路有了,现成的框架也有,是不是说,那我们就选EventBus作为通信框架好了,那么,为什么它没有流行起来呢?
因为,EventBus作为单进程应用的订阅可以说是完美的,所以才叫做神器。但是,它还没有牛到可以跨进程通信。AIDL可以
跨进程通信,但是不那么好使,EventBus可以灵活的在模块之前进行通信,但前提是单进程应用。既然这样是不是就没有办呢?
什么问题能难倒我们天朝的程序员们啊,当然有办法,那就是阿里的--Arouter
Arouter的优势:
优势一:直接解析URL路由,解析参数并赋值到对应目标字段的页面中。
优势二:支持多模块项目,因为现在很少有APP是单模块的项目,一般都是多模块单工程的,由不同的团队负责不同的模块开发,这时候支持多模块项目开发就显得尤为重要。
优势三:支持InstantRun,目前很多路由框架并不支持InstantRun,而InstantRun是Google在AndroidStudio2.0阿尔法版本中提供的新功能,其类似于代码的日更新,其只不过面向的是开发过程,这样做可以在开发的过程中减少开发和编译的次数,可以简单地将代码修改即时地同步到APK中,从而可以大规模降低开发复杂度。
优势四:允许自定义拦截器,ARouter是支持拦截器的,而拦截器其实就是AOP的实现,可以自定义多个拦截器解决一些面向行为编程上出现的问题。
优势五:ARouter可以提供IoC容器,IoC其实就是控制反转,这一部分做过服务端开发的朋友可能比较了解,因为服务端开发经常用到的Spring框架能够提供的一个非常重要的能力就是控制反转。
优势六:映射关系自动注册,在页面不是很多的小型APP上面,自动注册并不会体现出太大优势,但是对于大型APP而言,可能页面数量已经达到的几十个或者数百个,在这样的情况下,自动注册就显得非常重要了,因为不可能将每一个页面都通过代码的方式进行注册。
优势七:灵活的降级策略,ARouter可以提供很多种降级策略供用户自行选择,而原生的路由方案存在无法灵活降级的问题,StartActivity()一旦失败将会抛出运营级异常。
最后推荐一篇文章,它介绍了为什么要这么做,为什么可以这么做。
http://blog.spinytech.com/2016/12/28/android_modularization
浅谈 Android 中的热修复、插件化、模块化开发的区别
最新推荐文章于 2024-03-20 01:26:12 发布