总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
-
BAT大厂面试题、独家面试工具包,
-
资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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动态化框架
总结
找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。
最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档
喜欢文章的话请关注、点赞、转发 谢谢!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
里获取](https://bbs.csdn.net/topics/618156601)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!