Android开发未来的出路何在

Android开发的现状

目前,移动开发已经处于饱和的阶段,Android开发也不如当年盛况,已经不再像前几年前那么火爆。正如一种编程语言如果经历过盛极一时,那么必然有这样的一条曲线,像我们学的正弦曲线先急速上升,然后到达顶点,然后再下降,最后再趋近一个平稳的值。
可以看到,从2016年的下半年开始,移动互联网基本处于缓慢发展的阶段,很多大佬称之为互联网的下半场。如果移动互联网的前半场是粗放式的强地盘阶段,那么下半场就是守地盘的阶段,这一阶段,会出现众多的寡头。
在技术上,相比之前之前面试只问Android四大组件,数据库,网络和项目经验不同,现在面试Android岗位会设计各种原理(包括系统的一些原理以及第三方库的原理及流程)、Android优化以及与Android相关的跨平台技术。除此之外,稍微大点的公司还会对App的用户体验、流畅度等等提出要求,所以说,Android的面试已经不可同日而语。

关于Android的面试,可以参考我之前的文章:
Android开发初级中级高级怎么划分
史上最全的Android面试题集锦

从Android 1.0版本诞生至今,Android已经走过了10余年,这一路走来Android遇到哪些问题?大版本升级朝着什么方向演进?Android的未来如何?

Android发展历程

先来看看Android系统的发展过程,从2008年发布Android 1.0系统,到2019年发布的Android 10.0系统,Android延续着每年发布新系统的频率。每年Android都会带来很多的系特性,特别是最近几年,随着Android对底层系统的优化,Android和iOS的差距越来越小。

下面我们来看一下Android发布重要时间节点。

  • 2003年10月,Andy Rubin团队创办Android公司;
  • 2005年8月,谷歌收购Android公司,Andy Rubin担任谷歌工程部副总裁继续负责Android项目;
  • 2008年9月,谷歌正式发布Android 1.0系统;
  • 2011年1月,Android系统设备的用户总数达到了1.35亿,成为智能手机领域占有量第一的系统;
  • 2011年8月,Android手机占据全球智能机市场48%份额,并在亚太地区市场占据统治地位,终结了Symbian系统的霸主地位,跃居全球第一;
  • 2012年1月,谷歌Android Market已有10万开发者,推出超过40万应用;
  • 2013年11月,Android 4.4正式发布,系统更智能、UI更现代;
  • 2013年到2018年,这个阶段安卓进入飞速发展期,被升级的有摄像头、内存、机身、芯片等,原来的3.5寸小屏已退出历史舞台,全面屏、刘海屏、水滴屏已成为当下主流屏幕方案。

系统演进

不管是什么系统,必然会面临多个版本的迭代。作为目前最流行的移动操作系统之一,Android系统也历经10余年的迭代和更新,在用户体验、流畅性、续航、安全、隐私、机器学习等方面都取得较大的改进。下图演示了Android每个版本的更新情况。
在这里插入图片描述图中是每个大版本中最具代表性的特征标记在图中,并不代表着该版本全部特征,同样专项计划也不是只在某一个版本执行,比如续航和性能优化,每一个版本都在持续改进中,Treble计划也一直在迭代至今。下面,我们来看一下Android历个版本的更新情况。

Android 1.0到Android 4.0,系统各项功能和特性迭代到一个较完善的阶段。

Android 4.1系统,Google开展了黄油计划(Project Butter),为了让Android系统摆脱UI交互上的严重滞后感,希望能像“黄油”一样顺滑。 核心原理是系统框架中的渲染和动画统一采用垂直同步技术(VSYNC),以及三重缓冲技术(Triple Buffer),让滑动、翻页等操作更加一致与顺滑。

Android 4.4系统,Google开展了瘦身计划(Project Svelte),力求降低安卓系统的内存使用,解决低端机型升级难的问题,让Android 4.4可正常运行在所有Android手机,从而减少安卓系统继续碎片化。UI设计上,支持新的“沉浸式模式”,用户界面由过去的黑色与蓝色为主的色调转向带有透明度的浅色系,视觉语言变得更加明亮与现代化。

Android 5.0系统,Google开展了伏特计划(Project Volta),力求提升续航能力,这方面Google落后于业界厂商,厂商直面用户对续航尤为迫切,往往系统资源管控更为严格。另外,系统采用全新的ART,抛弃Dalvik虚拟机,大幅提升运行效率。UI设计上,使用全新的扁平化Material Design设计风格,更加清新与质感的设计,统一Android设备的外观和使用体验。

Android 6.0系统,Google引入新的运行时权限,让用户能够更好地了解和控制权限;引入了Doze模式,进一步提升电池续航能力。UI设计上,新增夜间模式,大幅改进通知栏,让通知更简洁。

Android 7.0系统,引入新的JIT编译器,对AOT编译器的补充,可节省存储空间和加快更新速度;进一步优化Doze唤醒机制;UI设计上,支持分屏功能。

Android 8.0系统,Google开展了计划(Project Treble),重新架构Android,将安卓系统框架与Vendor层解耦,力求彻底解决安卓碎片化这一老大难的问题,这是安卓系统架构最大的变化。系统层面加强对后台服务、广播、位置的管控限制。UI设计上,改进通知栏,智能文本选择和自动填充功能。

Android 9.0系统,引入神经网络API,采用机器学习的思路来预测用户使用习惯来做省电优化,继续强化Treble计划;文件系统(sdcardf/F2FS)持续提升;私有API的限制进一步规范化Android生态,强化隐私和安全,硬件安全性模块以及统一生物识别身份验证界面。 UI设计上,新的手势导航,加强支持刘海屏,UI搜索界面使用到机器学习,AI正在逐步强化Android系统。

Android 10.0系统,Google开展了主线计划(Project Mainline),相关模块(Modules)不允许厂商直接修改,只能由Google应用商店来更新升级,强化用户隐私、系统安全与兼容性,支持脸部生物识别。

Android系统架构

不管Android系统如何升级,但是Android的整体架构是基本没有改变的,即从上到下可以分为应用程序层、 应用框架层、系统运行库层和Linux内核层,如下图所示。
在这里插入图片描述

1, 应用程序层

顶层中有所有的Android应用程序,包括通讯录、浏览器等,你写的应用程序也被安装在这层;所有的的应用程序都是使用Java语言编写的。

2,应用框架层

这一层主要提供构建应用程序是可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用API来构建自己的应用程序。

  • 活动管理者(Activity Manager):控制应用程序生命周期和活动栈的所有方面
  • 内容提供器(Content Providers):允许程序之间发布和分享数据。
  • 资源管理器(Resource Manager):提供对非代码嵌入资源的访问,如字符串、颜色设置和用户界面布局。
  • 通知管理器(Notification Manager):允许应用程序显示对话框或者通知给用户
  • 视图系统(View System):一个可拓展的视图集合,用于创建应用程序用户界面

3,系统运行库层

程序库

Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。他们通过Android应用程序框架为开发者提供服务,以下是一些核心库:

  • 系统C库(libc):一个从BSD继承来的标准C系统函数库,他是专门为基于embedded linux的设备定制的媒体库(Media Framework):基于Packet Video opencore; 该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括 MPEG4。H264、MP3、AAC、AMR、JPG、PNG。
  • Surface Manager:对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。
  • SGL:底层的2D图形引擎。
  • 3D libraries:基于OpenFLES1.0 APLs实现,该库可以使用硬件3D加速或者使用高度优化3D软加速。
  • FreeType:位图(bitmap)和矢量(vector)字体显示。
  • SQLite:一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

Android运行库

Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。

每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该个税文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由java编译器编译,然后通过SDK中的”dx”工具转化成 .dex格式由虚拟机执行

Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

4,Linux内核层

Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了底层驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,WIFI驱动,电源管理等

Android系统碎片化

Android历经10余年的迭代,在流畅性、内存、续航、安全、隐私等方面都取得很大的进步,但Android系统的碎片化一直是痛点问题,带来不一致的用户体验。

Android的开放性,是其长久发展的主要原因,让大多数的厂商都选择Android系统,但开放性的背后是碎片化,从Android诞生至今问题就一直存在,Google一直在努力从技术角度来解决碎片化问题。从Android 8.0提出Treble项目,重新架构系统将system与vendor解耦合,用于加快Android新版本的适配,效果并不明显,Google继续在后续的Android P以及Android Q一直在不遗余力地持续完善Treble项目,力争加快系统升级速度。

在这里插入图片描述
Android系统碎片化,让安全、隐私问题存在风险,且存在体验不一致性问题,但老版本手机的OTA维护升级对厂商来说成本是昂贵的,Google感觉到对Android系统掌控力度不足,要想彻底改变,除非不让各大厂商定制化,这势必导致Android手机完全同质化,手机厂商就没法玩了,等于自掘坟墓,Google肯定不会这么干。于是,Google在Android 10.0提出了”Project Mainline“,将对隐私、安全、兼容性造成重大影响的少数模块独立成module,每个module打包成APEX格式(一种类似于APK的新格式),由Google通过应用商店定期来升级,从而保证低版本的手机不会因为碎片化而得不到隐私、安全与兼容性的更新。

这些module是由Google维护的主线,各大厂商只能跟Google沟通并将代码upstream到AOSP主线。Google花费了大量的人力在努力完善并推行Mainline,Google希望统一管控的机制,厂商希望最大的自由定制空间,这是一场有趣的角逐,笔者跟团队一起跟Google协商落地module的落地计划,最终将某些module影响较大模块争取Android 11再上线,Mainline更新机制如下图。

在这里插入图片描述

Android应用开发演进

Android系统离不开各App来提供丰富的功能,下面再来说一说应用开发涉及的一些技术演进。

移动端跨平台技术

从最开始以Cordova为基础(依赖于WebView)的Hybrid混合开发技术,到React Native的桥接(将JS转为Native)的技术,再到最新的Flutter技术,都说明现在移动端在多端开发中的尝试。
Flutter是Google发布的全新的移动跨平台UI框架,渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用Dart语言,执行效率比JavaScript高。另外,Google内部正在开发的另一个操作系统Fuchsia的UI layer采用的是Flutter,也就是说Flutter天然可以支持Android、IOS以及未来的Fuchsia。在大前端方向,对于跨平台开发中一直在不断迭代中寻找更好、更优的解决方案,目前来看Flutter还是更有优势。

跨平台相关的内容可以参考:移动跨平台技术方案总结

应用架构

所谓软件架构(Software Architecture),是指软件开发过程中涉及的一系列抽象模式,用于指导大型软件系统各个方面的设计,软件架构是构建计算机软件系统的理论基础。在Android开发中,先后提出了MVC、MVP和MVVM等软件架构模式,这些软件架构模式为Android项目开发提供了理论基础。

MVC模式(Model–view–controller)但Activity类过于臃肿,为解决这个问题,有了MVP(Model–view–presenter),presenter不仅要操作数据,而且要更新view;再到MVVM(Model-View-ViewModel)解决了MVP大量的手动View和Model同步的问题,提供双向绑定机制。

热修复与插件化

所谓热修复,指的是为了修复线上问题而提出的修补方案,程序修补过程无需重新发版!热修复的主要应用场景是为了让用户无感得修复线上缺陷,比如Tinker,Andfix,Sophix等。
插件化则是为了减少模块耦合,可减少主程序的规模,可按需加载,比如DroidPlugin,OpenAtlas等。关于各个热修复与插件化的细节不再展开,这里就说一点,Android 7.0对Native的NDK的调用限制是手铐,尤其是Android 9.0对Java层SDK的调用限制就是脚铐,那么对于Android应用想再搞插件化之类的黑科技便是带着脚手铐跳舞,能跳但舞姿可能不太美观。

关于热修复可以参考:
Android热修复技术总结
Android 热修复框架比较

关于插件化则可以参考:
深入理解Android插件化技术
Android插件化常见冲突解决
Android 插件化的Hook方案
携程Android App的插件化和动态加载技术剖析
蘑菇街Android组件化与插件化
Android 插件化之ClassLoader详解

App动态化框架

随着应用不断演讲,功能越来越复杂,且应用针对不同屏幕设备、不同国家语言资源都打包在同一个App,导致应用包不断增大,据统计自2012年以来应用包大小增长5倍。虽然现在手机的存储空间越来越大,但用户照片、视频等媒体文件品质在逐渐提升,导致设备可用空间逐渐紧缩。为此Google在去年Google I/O大会讲述Android引入新的App动态化框架(即Android App Bundle,缩写为AAB)。利用Split Apk完成动态加载,使用AAB动态下发方式,可显著缩小应用体积,减少对存储空间的占用。

App Bundle相关的内容可以参考:
Android动态化框架App Bundles简介

Kotlin

Kotlin是Google推荐的官方静态编程语言,与Java互通,可相互转换。Kotlin编译成Java字节码,也可以编译成JavaScript,运行在没有JVM的设备上,简洁安全。使用Kotlin更快速地编写Android应用,可以提高开发者的工作效率,少编写样板代码,被称之为 Android 世界的Swift。
谷歌开发者社区做过一个问卷调查,大概有50%的Android开发者已使用过Kotlin。这里并非鼓励大家一定都要使用Kotlin,学习新语言就像一次投资,要权衡团队成本与收益之间的利弊。如果你是一位原生Android开发,那么掌握Kotlin将是你必须掌握的技能。作为一名移动开发老兵,笔者在2018年出版了一本《Kotlin入门与实战》,Kotlin简洁的语法至今令我印象深刻。

Fuchsia

Fuchsia,是由Google公司开发的继Android和Chrome OS之后的第三个系统,已在Github中公开的部分源码可以得知。不同于安卓使用的Linux内核,Fuchsia采用的比较新的Zircon的内核。该系统与当下Android相比,无论是存储器还是内存之类的硬件要求都大幅降低,可以看出这是一款面向物联网的家用电器用的系统。据悉Flutter引擎+Dart语言将很有可能成为Fuchsia系统主要的UI开发框架。谷歌Fuchsia选择Flutter作为UI并不令人意外,毕竟Dart语言由谷歌亲生,一方面不用担心被人起诉,另外当Fuchsia有需要时,也能灵活地在Dart虚拟机做出针对性的改变。

Fuchsia会是Android的终结者吗? 笔者认为至少未来三五年内不太可能取代Android。当年为了和苹果iOS抗衡,Android系统研发作为Google重中之重,在这种情况下,Android诞生依然花费了Google 3年时间。而Fuchsia只是公司目前的实验项目,且Fuchsia并非基于业界成熟Linux内核,而是采用全新Zircon内核,项目工程路还很远。下面是Fuchsia的整个技术架构图。在这里插入图片描述
从Fuchsia技术架构来看,内核层zircon的基础LK是专为嵌入式应用中小型系统设计的内核,代码简洁,适合嵌入式设备和高性能设备,比如IOT、移动可穿戴设备等,目前这些领域标准化级别的垄断者。以及在框架层中有着语音交互、云端以及智能化等模块,由此笔者揣测未来Fuchsia率先应用在音控等智能设备。

Fuchsia基于功能的模块化操作系统,应该会使各组件模块能独立升级更新能力,保证体验一致性。Fuchsia在IOT领域占据一定份额后,加之其良好的跨平台,可以再逐步渗透到移动手机、笔记本电脑等设备,进而三位一体,打造手机、电脑与IOT完美的互联互通的统一平台体验,让多端设备都离不开Fuchsia。在2018年10月,在“蓝牙特别兴趣小组(Bluetooth SIG)”举办的UnPlugFest(UPF)测试大会上,Google再展示了Fuchsia与Android设备的互联性,可以窥见一斑。Fuchsia的定位是物联网,相信随着5G时代的到来,Fuchsia将可能一统江湖。不过,目前来看,Fuchsia还有相当长的路要走。

Android开发的未来

移动操作系统的演变过程,从按键交互的塞班功能机到触摸屏交互的Android/IOS智能机,从小屏幕手机到全面屏、刘海屏、水滴屏。总结一下,任何系统无非干两件事:输入和输出,接收到外部输入信号后经过操作系统处理后输出信息。

Android发展至今,已成为全球用户量最广泛的移动操作系统,手机行业竞争异常激烈,经过几番洗牌,国内手机厂商主要是华米OV四大公司,并且随着移动互联网增长见顶,国内Android开发的需求也越来越少,那么Android的未来在哪里呢?

目前,Android在应用层次的发展已经见顶,未来的发展主要集中在人工智能和5G结合的产业,智能汽车、智能家居、IOT都将是Android发展的广阔市场。但就目前人工智能的奇点还没到来,技术还处于前期阶段,一旦奇点来临将会爆炸式发展,或将重新定义生活方式。汽车的智能化和互联网化是未来一大趋势,Google这两年确实在汽车领域发力,Android Auto在过去一年的用户增长250%。天生的移动特性加上越来越多的互联网服务需求,汽车需要一个具备多种感知能力的系统,或将成为是继手机、电视后Android的下一重点开拓领域。

对于Android开发人员来说,我有以下几点建议:

  • 在Android领域深耕,做到极致,努力成为这个方向的专家,提升工程架构思维和能力,因为软件工程思想都是相通的。只要一个领域做到极致,即便Android被淘汰了,换新领域面试官依然会相信你也能做到极致。
  • 在有深度的情况下,适当拓宽自己的广度,在每完成一个项目后就进行总结,并能够熟知整个系统的整体架构,对核心有深刻的认知。

关于作者:
作为一名移动开发老兵,我从11年开始从事移动开发,从业的时间基本见证了Android的诞生、成长、成熟到现在的稳定。并且,从16年开始,我更多的时间是专注在移动跨平台和移动架构上,也出版了诸如《React Native移动开发实战》、《Kotlin入门与实战》,《Weex跨平台开发实战》和《React Native开发进阶》等移动开发的书籍。未来我还将深耕在移动开发中,不过更多的是关注移动开发的效率和质量方面,因为移动开发需要的是沉淀。

发布了1009 篇原创文章 · 获赞 2039 · 访问量 425万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 成长之路 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览