精华内容
下载资源
问答
  • android os
    千次阅读
    2016-09-19 10:26:58

    OS体系结构介绍:

    第一、操作系统层(OS)

    第二、各种库(Libraries)和Android 运行环境(RunTime)

    第三、应用程序框架(Application Framework)

    第四、应用程序(Application)

    以下分别介绍Andoid各个层次的软件的重点及其相关技术:

    ● 操作系统层(OS)

    Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。

    主要的驱动如下所示:

    显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动。

    Flash内存驱动(Flash Memory Driver)

    照相机驱动(Camera Driver):常用基于Linux的v4l(Video for )驱动。

    音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动。

    WiFi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序

    键盘驱动(KeyBoard Driver)

    蓝牙驱动(Bluetooth Driver)

    Binder IPC驱动: Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。

    Power Management(能源管理)

    ● 各种库(Libraries)和Android 运行环境(RunTime)

    本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容

    大多是使用C++实现的。

    在其中,各种库包括:

    ▅ C库:C语言的标准库,这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。

    ▅ 多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一个部分是音频、视频的回放(PlayBack),另一部分是则是音视频的纪录(Recorder)。

    ▅ SGL:2D图像引擎。

    ▅ SSL:即Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

    ▅ OpenGL ES 1.0 :本部分提供了对3D的支持。

    ▅ 界面管理工具(Surface Management):本部分提供了对管理显示子系统等功能。

    ▅ SQLite:一个通用的嵌入式数据库

    ▅ WebKit:网络浏览器的核心

    ▅ FreeType:位图和矢量字体的功能。

    Android 的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。

    Android 运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(Java VM)不同,它执行的不是JAVA标准的字节码(bytecode )而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。    二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。

    ● 应用程序框架(Application Framework)

    Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件:

    例如: Views (视图组件)包括 lists(列表), grids(栅格), text boxes(文本框), buttons(按钮)等。甚至一个嵌入式的Web浏览器。

    一个Andoid的应用程序可以利用应用程序框架中的以下几个部分:

    • Activity (活动)
    • Broadcast Intent Receiver (广播意图接收者)
    • Service (服务)
    • Content Provider (内容提供者,让开发者在不同应用程序之间共享数据。)

    应用程序框架也包括一些高级管理(Manager):

    • Activity Manager:控制界面的生命周期,包括管理活动(Activity)栈。
    • Notification Manager:提供一贯的非侵入式的机制来通知用户(例如:当你正在玩游戏时有人给你发短信,通知不会终止你的游戏,你会听到一个声音提示)。
    • Resource Manager:支持非代码资源,如字符串和图形被外部化
    • Window Maganger、Package Mananger、Power Manager、Service Manager等等

    ● 应用程序(Application)

    Android的应用程序主要是用户界面(User Interface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。

    开发者需要知道的Android库

    核心Android开发库

    所以在这个列表中,将帮助开发者了解哪些是可用的核心API。所有的Android设备将提供至少这些API支持:

    android.util:核心工具包中包含底层类,字符串格式化和XML解析工具、底层类​​。

    android.os:操作系统包提供了访问基本的操作系统服务,如消息传递、进程间通信、时钟功能和调试。

    android.graphics:图形API提供了支持画布、颜色和绘制图元的低级别的图形类并且支持绘制画布。

    android.text:用于显示和解析文本的文本处理工具。

    android.database:在数据库处理游标时提供底层类支持。

    android.content:content API管理数据访问,提供服务来管理资源、内容提供者(content provider)和包。

    android.view:视图是核心的用户接口类。所有用户界面元素使用的是一系列视图,以构成用户交互的组件。

    android.widget**:内置在View包内,小部件类是“这里是我们前面创建的”用户界面元素,可以在自己的应用程序中使用。包括列表、按钮和布局。

    com.google.android.maps:高级的API,它提供了访问本地地图控件,可以在自己的应用程序中使用。包括MapView的控制、用于标注和控制您的嵌入式地图的叠加以及MapController类。

    android.app:一个高层次的包,允许访问应用程序模型。该应用程序包包括Activity和Service的API等是Android应用程序的基础。

    android.provider:方便开发者访问标准的内容提供者(比如联系人数据库),provider包提供类给开发者访问标准的数据库。

    android.telephony:telephony API让开发者直接接触电话底层,开发者可以打电话、接电话、显示通话记录、通话状态和短消息。

    android.webkit:WebKit的软件包功能的API与基于Web的内容的工作,其中包括一个WebView控件在您的活动中嵌入浏览器和cookie管理器。

    同样,你刚才看到的是Android的库可以帮助您快速构建应用程序的简化列表!除了在Android API,Android栈还包括一组的C/C++库,可通过应用程序框架发布出来。它们包括:

    OpenGL:用于支持基于OpenGL ES1.0 API、3D图形库。

    FreeType**:这支持位图和矢量字体渲染。

    SGL**:用于提供2D图形引擎的核心库。

    ibc:标准C库,为基于Linux的嵌入式设备进行了优化。

    SQLite:用于存储应用程序数据的轻量级的关系数据库引擎。

    SSL:支持使用安全套接字层加密协议进行安全互联网通信。

    注意:到此,要介绍的就太多了,我将在这里结束。只是多一个部分,你可以做自己的事情。如果你不能看完整个帖子,可以将其加入书签,以备将来参考。因为,这里的大多数内容不会有太大变化!

    高级Android开发库

    我们所看到的核心库,到目前为止提供所有开发Android应用程序需要的功能。然而钻研高级API将会使用更高级的功能并带来额外的乐趣。

    尽管如此,值得注意的是,由于Android希望针对移动硬件有更广泛的适应性,因此要注意下列API适用的场合和以及使用时装置是否具备条件。

    android.location:基于位置的服务的API,使应用程序访问设备的当前物理位置。基于位置的服务提供通用的访问使用任何位置固定的硬件或技术设备上可用的位置信息。

    android.media:媒体API提供了用于播放音频和视频媒体文件,包括流媒体和录制的支持。

    android.opengl:Android提供使用的OpenGL ES API,你可以用它来创建动态3D用户界面为你的应用程序的强大的3D渲染引擎。

    android.hardware:如有可能,硬件API公开的传感器硬件,包括摄像头、加速计和指南针传感器。

    android.bluetooth,android.net.wifi,android.telephony:Android也提供了硬件平台,包括蓝牙、Wi-Fi和电话硬件的低级别的访问。

    更多相关内容
  • 全面认识Android OS

    万次阅读 多人点赞 2019-06-24 19:58:31
    缘起前几天CSDN有篇讲鸿蒙OS的文章,我觉得它是最近讨论自主开发OS的文章里很中肯的一篇了(链接不给了,.....)。我曾经在2012年介绍过Android OS的情况...

    缘起

    前几天CSDN有篇讲鸿蒙OS的文章,我觉得它是最近讨论自主开发OS的文章里很中肯的一篇了(链接不给了,.....)。我曾经在2012年介绍过Android OS的情况,现在来看依然不过时。作为一个技术人,我们探讨某个东西的前景的时候总该对它有一些了解。本篇就是一个非常简单的对Android OS的介绍。注意,本篇涉及的很多知识严格意义上都不会太严谨,主要还是把意思传达到位就行了。

    在Android刚起步的那几年(2011年前及左右),我们同时下注了Android、Intel联合几个厂商搞的Meego、还有基于Linux的嵌入式OS。那时,中移动的OMS也很火,甚至OMS搞出了一个叫播思的公司。播思里边有非常多的人才,其中很多人来自中国手机界的黄埔军校——摩托罗拉。从这个角度看,Android OS在早期也是看不准,没人觉得它一定会成。

    Android最终还是成功了,我个人感觉这个不全是技术的因素,但有几个关键因素还是和技术有关:

    1. 使用Java作为开发语言绝对是很关键的因素之一——毕竟,迎合开发者非常重要。Java终归是比C++/C要简单,容易上手。

    2. 另外,Android底层是Linux,这一块就把绝大部分做外设的厂商吸引过来了。它们本来就为Linux开发驱动或者相关模块,迁移到Android没太大工作量。

    3. 最后,还有关键的芯片厂商——高通的支持。如果当时只有Intel一家做芯片的话,Meego保不齐还能多蹦跶几年。

    以前CSDN《程序员》杂志里经常有一位作者的投稿,我看他的个人介绍就很有意思,说是要为Linux摇旗呐喊。所以,Android之所以成功,就在于太多人为它摇旗呐喊了。搞软硬件开发的,搞培训的.....真是人心齐泰山移呀!

    Android彻底占据市场之后,基于H5的OS又来了一波小高潮。2013-2014年左右有个Firefox OS,还在国外装了不少机器。FireFox OS是全兼容Android的。所谓的兼容,就是原来归属Android OS的功能都保留,然后再对H5的APP提供了一些功能扩展而已。

    相比Android,给Firefox OS摇旗呐喊的人就少多了。而且还要兼容Android OS——那么,每次Android OS更新,Firefox都要去适配,更改。这工作量就非常非常大了。最后Firefox OS就歇菜了。

    以上是历史情况——它说明了一个事实:没有哪个OS天生就是赢家,形势是变化的。另外,我们很多人要感谢Android,可以亲历一个OS从零到如此强大的过程,时间跨度非常短,七八年就搞起来了

    现在开始我们关于对Android OS的一些科普性介绍。

    整体视频

    由PPT转换而来的视频

    上面视频里介绍了5个部分,分别是:

    1. Android系统架构——垂直角度来看

    2. Android Framework——没有层次关系

    3. Android OS是微内核的OS

    4. Android手机发布和更新的过程示意

    每个部分都不长。大家可以先看下面的内容,等整体看完后,再来看上面的PPT视频。

    Android系统架构——垂直角度来看

    下图是Android OS的整体架构。99.999%搞Android的人都知道:

    640?wx_fmt=jpeg

    从垂直角度来看,Android OS分为四个层次(这是我的划分,别家的说法大同小异,其中有些内容比较老了,比如Dalvik虚拟机已经换成了ART,但不影响我们对这个架构的认识):

    • 最底层是Linux Kernel层。请各位看官特别注意这一点,它再强调一万次也不为过——Android OS的基石是Linux kernel。除了Kernel层,User Space中围绕Linux Kernel相关的东西也被Android OS照搬了过来,比如ueventd,wpa_supplicant等。

    • 中间两层由下到上是Native Framework层和Java Framework层。这两个是Android独有的。我们统称这两层为Android Framework

    • 最上层是应用层正是基于Android Framework,才使得Android上的应用如此与众不同——作为对比,如果写个无界面的比如ls,find这样的程序,它们在所有基于Linux/Unix的系统上都是一样的运行。这样的程序我们一般认为是Linux应用程序——肯定不会把ls当做Android应用。

    上述四个层次中,Kernel历史最悠久,到今天就剩下大概Windows,Linux、MacOS三个巨头了(Unix和Linux、Mac有亲缘关系,在消费类电子产品中见得少,所以不讨论Unix):

    • Windows归微软所有,搞了几十年,参与一起玩的设备厂商,软件开发商几十万家。

    • Linux:和Unix有亲缘关系,开源的Kernel,上面有好多发行版,比如Ubuntu,CentOS等,国产的优麒麟也是。

    • MacOS:也和Unix有一定亲缘关系,苹果独有。参与一起玩的设备厂商,软件开发商也有几十万家。

    以上唯有Linux不归某个公司独有。所以,Android使用Linux是必然的选择。如果我们要搞国产自主OS的话,最大可能性也是基于Linux,比如现在的优麒麟,以前的红旗都是这样。

    这并非技术牛不牛的问题,而是Linux Kernel可看做是全人类共有的软件财富。遵守它的要求,不要搞独立王国,一起用好它即可。再说,Linux Kernel发展了几十年下来,很多国人(包括国内很多公司)为它做出过许多大大小小甚至卓越的贡献。俗话说,前人栽好树,后人好乘凉。如果从头到尾,从上到下都要“自主”,干脆连计算机编程语言都不要用国外发明的了smiley_13.png

    继续我们的讨论。

    Android Framework——没有层次关系

    大部人眼里,Android OS的架构都是上面那样的垂直关系——这个认识没有错,但是并不完全准确。如果我们以功能模块为单位来观察其中的Android Framework(Native Framework和Java Framework的统称)的话,你会得到大概下面这样的图:

    640?wx_fmt=jpeg

    以功能为单位来观察Android Framework的话:

    • Java Framework包含几大类的服务,比如和应用中四大组件调度功能有关的组件,专门管理窗口的组件,应用程序安装有关的功能组件。还有和网络有关,蓝牙功能有关的组件等等。我在《深入理解Android 卷2》里将它们大概分了七大类。现在的最新版本里这个类别有所增加,比如对Android Auto(针对车载系统)里增加了几个和车载有关的功能模块。另外,请注意,上述划分纯属我个人的分类,并不存在什么标准。

    • Native Framework也可以像这样按功能来进行划分,比如和音频相关的AudioFlinger、AudioPolicyService等。

    通过这一节,你知道了:

    • Android Framework里其实是有很多功能模块的。

    • 这些功能模块有可能是放在Java Framework里,也有可能是Native Framework里。

    • 更有甚者,这些功能模块可以分布在多个进程中,彼此之间,或对应用层以Binder方式进行进程间交互。

    知道上面这些东西有什么用呢?接着看。

    Android OS是微内核的OS

    关于内核,一直有微内核宏内核之分。使用微内核的有Windows和Mac、使用宏内核的是Linux。那么,什么微内核,什么是宏内核?下图简单解释了微内核:

    640?wx_fmt=jpeg

    我里简单描述下微内核和宏内核的差异(点到即止,非技术严格):

    • 微内核就是内核只做一些基本的服务(比如操作CPU,进程调度,内存管理、设备管理等)。然后将其它功能独立为除内核之外的多个进程。微内核最大的诟病就是其它进程和内核之间的交互属于进程间通信,开销比较大

    • 宏内核就是把上图中的所有东西都塞到内核里。这样大家都运行在一个进程里(主要是指共享同一个内存空间——内核地址空间),如此可极大减少模块间交互的开销,但问题就是一旦有一个模块出问题,整个kernel都可能挂掉

    了解微内核和宏内核的差异后,我们再来看Android。如果我们认为Android是一个OS的话(后面会讲为什么可以将Android看成是一个OS),它是微内核还是宏内核呢?接着看下图:

    640?wx_fmt=jpeg

    上面这个图展示了Android 四个层级间的交互:

    • Native Framework、Java Framework均有和Linux交互。

    • Java Framework中的部分模块和Native Framework中的部分模块有交互。

    • APP和Java Framework有交互。某些情况下也可以和Native Framework模块交互(图中并未画出相关的箭头线)。

    结合我们上文提到的,Android Framework中的功能模块并非都挤在一个进程里,而是分散在不同进程中,功能模块之间通过进程间通信的手段交互。所以,从应用的角度看,Android OS肯定是一个微内核。

    现在,我们再看看为什么可以把Android称之为一个OS——这个问题的答案其实在上面已经隐含得回答过了,就是上面说的那句话“正是基于Android Framework,才使得Android上的应用如此与众不同”。

    是的,Android之所以可以说自己是个OS,在于它新搞了一套应用开发及交互规则。

    关于这个规则,下面举两个非常简单的例子。一个是启动应用时,源Activity和Android Framework的交互过程:

    640?wx_fmt=jpeg

    对于这个图,我并不是让大家去了解具体交互的细节。一看这个图,你就发现这玩意为Android独有。

    当然,在Android中你也可以做一个不遵守这样的应用程序。比如手机中的开机动画,就是Linux应用程序——程序名叫bootanimation,它就没有什么四大组件,也不需要Manifest,纯纯得一个播放动画/图片的Linux程序。

    我曾经在2010年左右实践过直接使用libskia来做UI控件相关的应用——Android中的那些控件其内部就是使用libskia为二维图形库(3维绘制则使用OpenGLES)。libskia也就是现在的Flutter底层绘制引擎。

    我当时想法很简单,就是想对一些使用Android系统的非手机设备(用在场景比较简单的设备上,比如刷卡买个汽水之类的。那个时候,这些设备的性能都非常简陋,跑不动全套Android,必须裁剪),完全可以使用自定义的基于libskia图像库的控件来画UI。因为大部分情况下,只要把UI画出来就好,剩下的调用驱动就行了。什么四大组件,统统都不需要。

    拜Flutter所赐,libSkia现在有一些知名度了,但它的价值依然被大部分人低估。目前我知道还没有哪本专业书籍是介绍这个的。车载系统(对时延要求很高,使用全套Android对速度影响很大,往往需要裁减)或者哪个公司想搞OS,开发一套二维绘制引擎非常关键——说白了,应用开发中很大部分比例都是UI。我记得还有好几个Linux发行版让界面看起来和Windows一样。BTW,3D绘制引擎反而不用在意,因为太难,怕各家瞎搞,所以早就有OpenGL标准.....

    接着来看另外一个例子——播放视音频:

    640?wx_fmt=jpeg

    Android上,一个应用要播放视音频的话,依赖MediaPlayerServiceSurfaceFlingerAudioFlinger、硬件编解码模块等。这套东西也不是Linux带过来的,而是Android搞出来的。

    我记得以前在Windows上做播放器的时候,应用程序需要自己加上编解码和播放的功能,使用DirectX。这就是每个应用的独家秘籍,谁家支持得格式多,谁就厉害了。

    放到Android上来,编解码,播放功能均由系统提供了,应用程序再也不用操心这些东西。这无疑是一个很大的进步。

    上面举了两个非常简单的例子,想必现在我们确实可以大大方方将Android称之为OS了。因为它在Linux Kernel之上做了大量的非同一般,独立自主的功能。说实话,对Android应用来说,它是不是与运行在Linux上都不重要,只要有Android Framework就足够了——早在2011年,我的CSDN博客文章“移植之乱谈

    (https://blog.csdn.net/Innost/article/details/6954556)中,有个哥们把Android Framework整个移植到了Windows上。注意,并不是现在模拟器那样的使用虚拟机喔!上面的视频好像还可以看,大家可以看一下。

    Android手机发布和更新的过程示意

    很多人不了解Android手机系统发布和更新的过程,总吐槽AOSP新版本发布后还要过好久自己的手机才能更新到新版本。这个问题的解释见下图:

    640?wx_fmt=jpeg

    • 谷歌首先发布版本,我们称之为AOSP原生代码。AOSP原生代码只支持极少数几款手机。

    • 然后是芯片厂商在AOSP基础上发布自己的版本。比如高通,华为,MTK。①和②的过程有重叠,主要还是为了加快发版速度。在这个阶段,每个芯片厂商会在AOSP原生代码上叠加自己的功能,比如以前AOSP没有双卡双待功能,这些功能有一些是芯片厂商自己加的。另外,芯片厂商还要针对自己发的版本做大量稳定性测试。

    • 华米OV等终端厂商并不直接使用谷歌的原生代码,它们其实使用的是所用芯片厂商提供的Android代码。然后,设备厂商还得魔改一下,加上终端厂商自己的特性。这就是MIUI,EMUI,ColorOS等的功能。

    • 现在大部分终端厂商使用芯片厂商的Turnkey方案,主要是CPU+通讯模组,芯片+软件打包卖给终端厂商。少数公司比如魅族使用的CPU是三星,而通信模组不知道哪一家,那么魅族就需要把三星的CPU和别家的通讯模组整合到一起,难度比使用Turnkey方案得大一些。

    • 终端厂商集成完后,还需要考虑运营商定制的情况,然后加上对应的运营商定制功能,并做对应的测试。

    了解上面的情况后,光从测试角度看,源码从谷歌发布到最终的手机上,测试的工作量都非常大——所以到终端消费者手里的速度会慢多了。厂商的解决办法就是在新款手机上直接使用新版系统,老款手机往往要等一段时间才会发布新版升级包。

    总之,在Android手机世界里,谷歌、芯片厂商、终端厂商,运营商都是生态链里的关键玩家,四者互相影响。从终端厂商角度看,我觉得芯片厂商对终端厂商的影响力更关键和致命。最简单来说,高通要是不更新更好的芯片,很多手机商的产品也就停滞不前了。

    对比苹果,人家从芯片到OS都自己搞,也不太拿运营商当回事。所以苹果发版和覆盖速度都相对较快,碎片化问题绝对是比Android低好几个数量级。当然,通信芯片是苹果的大问题,所以老有人吐槽iphone的信号不好。这个问题能靠苹果自己开发通信芯片来解决吗?理论上可以,但是不现实,因为其中有很多专利问题不好搞。

    再说下我对国产自主OS的一些看法和判断。

    • 不出意外的,中长期(十几年之内,如果量子计算机还没有普及的话)看,依然会以Linux Kernel为核心(这里不考虑那些特殊场景的OS,比如工控机用的实时OS等)。只要使用Linux Kernel,绝大部分硬件厂商都能适应。否则来个新OS,硬件厂商又得开发驱动,还要做大量测试,这个所需的时间和金钱成本都非常巨大。

    • 如果这个国产自主OS兼容Android的话,说明Android那套东西大概率会保留。这是从应用角度来看的。当然,也可以魔改Anndroid Framework,把内部实现都换成自己写的。但是要做到兼容的话,就必须对应用没有影——这就回到软件界的一句老话,如果一个东西叫起来,走起路来都像鸭子的话,那它就是鸭子。从这个角度看,自主实现只是为了搞成看起来和之前一样的话,这个意义并不重大,这种自主也很难被认可。当然,如果能提升原有系统的性能则另当别论,这属于优化和改善,和我们讨论的不是同一个东西。

    • 所以,国产自主OS要么像Android一样搞个基于Linux的,但是套路和Android完全不一样的。比如像Meego、Tizen这样的。要么就是拓展Android OS,搞一个H5 OS或者什么之类的。

    • 最后,如果抛弃Linux的话,可参考谷歌的Fuchsia了,据说那是一个微内核的新OS架构。不过,这个OS的前途并不明朗。OS从来就不是一个纯软件的事情,还涉及到海量硬件厂商。它们甚至是一个OS生死存亡的决定者。

    《深入理解Android ART》宣传

    加一个《深入理解Android ART》一书的宣传。这本书是目前我花费心血最多,也是最难的一本书。有几个印象深刻的记忆:

    • 时间跨度长达三年,非常孤独,幸好有几位审稿专家的陪伴。

    • 中间无数次想放弃。反正也没签合同,也没承诺什么,甚至也没几个人知道我在干这事。放弃就放弃了。好在坚持下来了。

    • dex2oat一章曾经写到了100多页,实在是写不下去了。因为发现如果没有搞明白编译技术的话,后面根本没法玩。所以只能暂时放下dex2oat,花了8个多月研究编译技术,写完第六章,然后才逐步完成后续章节。

    顺带把我们这个“深入理解Android系列”做个宣传,八年Android之旅,九本书的作者都是精益求精,为基业长青付出了坚实可见的努力。感谢大家的认可。

    640?wx_fmt=jpeg

    下一步

    开公众号以后得到很多朋友的关注,所以很想回报下大家。打算和出版社搞一个签名送《深入理解Android ART》一书的活动。获奖的朋友可以把要说的话告诉我,我亲自写到书上快递给你。快递费不收者点广告方式给我也行。本人的字很丑,请不要嫌弃smiley_13.png

    精华文章

    我们神农教立教的三篇基石文章比任何传授具体技术知识的内容都要有长远价值,它们是:

    1. “深入理解”的目标是什么?

    2. 关于Android学习的三个终极问题

    3. 一专多能、刻意练习和终身成长

    最后的最后

    • 我期望的结果不是朋友们从我的书、文章、博客后学会了什么知识,干成了什么,而应该是说,神农,我可是踩在你的肩膀上得喔。

    • 关于学习方面的问题,我已经讨论完了。后面这个公众号将对一些基础的技术,新技术做一些学习和分享。也欢迎你的投稿。不过,正如我在公众号“联系方式”里说的那样——郑渊洁在童话大王《智齿》里有一句话令我印象深刻,大意是“我有权保持沉默,但你说的每一句话都可能成为我灵感的源泉”。所以,影响不是单向的,很可能我从你那学到的东西更多。

    640?wx_fmt=jpeg

    神农和朋友们的杂文集

    长按识别二维码关注我们

    展开全文
  • Android OS历史版本

    千次阅读 2018-02-19 00:14:01
    文章共约2000字,阅读需要约5分钟说起Android OS,大家都知道是Google的Android,但是Google却不是Android的“亲生父亲”。最初的Android OS,由酷爱机器人的Andy Rubin(安迪鲁宾)所研发。因为酷爱机器人,所以...

    文章共约2000字,阅读需要约5分钟

    说起Android OS,大家都知道是Google的Android,但是Google却不是Android的“亲生父亲”。

    最初的Android OS,由酷爱机器人的Andy Rubin(安迪鲁宾)所研发。因为酷爱机器人,所以我们看到的Android的Logo是一个绿色的萌萌哒的机器人,并且“Android”这个英文单词就是人形机器人的意思,诞生在科幻电影中。有趣的是,据说这个绿色机器人Logo的创意来源是厕所上的男女小人标识。Andy Rubin在2003年成立“Android”公司,并和他的团队共同研发这一款智能操作系统,顺理成章,Andy Rubin也就被成为了“Android 之父”。

    Android 之父——Andy Rubin

    随着,“Android”项目的推进,庞大的开销费用几乎烧尽了Andy Rubin所以的资金,虽然有朋友帮助,但也只是杯水车薪,终于Andy Rubin不得不去寻找投资公司。可能你认为后来的故事就是Google收购了Android。但在Google之前,Andy Rubin和他的团队共八个人先是飞过大洋来到彼岸的韩国的Samsung(三星)公司,来商讨投资事宜。但过程并不愉快,还被Samsung公司嘲笑,八人失落而归。两周后,被Samsung嫌弃的项目,却被Google相中,并跳过投资的过程,选择直接收购“Android”公司。

    之后的故事就是,被Google改良并开源后的Android,迅速侵占了移动智能终端的市场,并与Apple(苹果)公司的i OS各分天下,杀掉了其他众多移动系统,统一了杂乱的智能移动终端市场,其中包括我们熟知的Symbian OS(塞班系统)。

    Logo创意

    2007年11月5日,Google面向开发者发布了Android 0.5 测版本的开发包,这算是Android的首次问世。以Astro Boy(铁臂阿童木)为代号。

    2008年9月23日,Android 1.0测试版本发布,以Bender(发条机器人)为代号。第一款使用Android OS 1.0的手机为HTC G1,也是第一个使用Android OS的手机。

    发条机器人

    在之后的2009年2月2日发布的Android 1.1中由于版权问题,放弃了使用机器人名称做为代号,转而使用各种甜点的名字来命名,一直至今。据说是因为Android高管层喜欢甜点。1.1版本被命名为Petit Four(花色小蛋糕)。

     

    2009年4月30日,发布了Cupcake(纸杯蛋糕)Android 1.5版本。此次版本升级中支持了中文的显示与输入,并支持了中文在内的十几种语言,此前只支持英语和德语。

    2009年9月15日,发布了Donut(甜甜圈)Android 1.6版本。支持了CDMA网络,增加了对听觉视觉困难人士的服务等功能及改进,并从此版本开始决定使用英文首字母排序的甜点来对各版本进行命名。

    甜甜圈

    2009年10月26日,发布了Eclair(松饼)Android 2.0版本。支持了HTML5、Microsoft Exchange、蓝牙2.1和动态桌面等功能。

    松饼

    2010年5月20日,发布了Froyo(冻酸奶)Android 2.2版本。支持了Adobe Flash、软件可安装至存储卡、USB分享器和WiFi热点等功能。

    冻酸奶

    2010年12月7日,发布了Gingerbread(姜饼)Android 2.3版本。支持了NFC、多镜头和屏幕截图等功能。

    Android 2.3系统彩蛋

    2011年2月2日,发布了Honeycomb(蜂巢)Android 3.0系统。该系统为平板电脑专门设计,这也是为什么智能手机史上为什么不见其踪影的原因。

    Android 3.0系统彩蛋

    2011年10月19日,发布了Ice CreamSandwich(冰淇淋三明治)Android 4.0系统。从本次系统版本更新开始,Google整合了手机与平板的系统,使得Android系统更加统一。支持了系统虚拟按键、电源+音量下截屏、面部识别解锁、流量监控、WiFi直连和1080P视频播放和录制等功能。

    Android 4.0系统彩蛋

    2012年6月28日,发布了JellyBean(果冻豆)Android 4.1版本。支持了离线语音输入和(Google Now)语音助手等功能,并大幅改变用户界面设计,取消了内置Flash Player。

    Android 4.1系统彩蛋

    2012年10月30日,发布了以” A new flavor of Jelly Bean”(新口味的果冻豆)为口号的Android 4.2版本。这场原定于10月29日的发布会,无奈被“桑迪”飓风吹到了30日以新闻稿的形式发布。此次升级版本支持了PhotoSphere 360° 全景拍摄、手势输入和Miracast多媒体无线传输等功能,增强了盲人模式的语音输出及手势导航等功能。

    2013年7月25日,发布了又一个“果冻豆”Android 4.3版本。支持了蓝牙4.0低功耗和4K视频等功能。

    2013年10月31日,发布了Kitkat(奇巧)Android 4.4版本。更换了全新的Java虚拟机运行环境ART(Android RunTime),使性能提升巨大,并完全封锁了Adobe Flash player功能。

    Android 4.4系统彩蛋

    2014年10月16日,发布了Lollipop(棒棒糖)Android  5.0版本。支持了64位处理器、蓝牙4.1、RAM格式拍摄。更换了全新的Material Design UI界面,使用户交互体验瞬间增强。为色弱人士增加了低视力设置。全面采用了ART(Android RunTime)编译虚拟机。

    Android 5.0系统彩蛋

    2015年3月10日,发布了另一只“棒棒糖”Android 5.1版本。

     

    2015年10月5日,发布了Marshmallow(棉花糖)Android 6.0版本。增加了全新的敏感权限的管理机制、Android pay 支付功能、指纹识别。支持了USB Type-C接口,可更加快速的充电。

    Android 6.0系统彩蛋

    2016年8月22日,发布了Nougat(牛轧糖)Android 7.0版本。主打实用功能,支持了多窗口模式。

    Android 7.0系统彩蛋

    2017年8月21日,发布了Oreo(奥利奥)Android 8.0版本。对APP的后台操作增加了限制,减少了额外的耗电。系统稳定性与安全性逐步想i OS靠拢。增加了PinnedShortcuts功能,类似于之前iPhone 6s上的3D Touch,长按可弹出子菜单。

    Android 8.0系统彩蛋

    对于越来越完善的Android OS,在系统性能和用户体验上,与i OS的差距正在越来越小,越来越多的开发者与用户对Android OS也有了更多的期待。

    Android历经十年到目前,Android Oreo(奥利奥)为当前Android OS的最新版本,Android 9.0将会在2018年5月8日的Google I/O大会上与大家正式见面,根据Google的风俗,版本代号为P,推测系统版本代号为PineappleCake(凤梨酥),让我们拭目以待吧。

    参考:维基百科、百度百科

    *所有图片来源于网络

     

    每文一句:没有理想的人不伤心

     

    展开全文
  • 全面认识 Android OS

    千次阅读 2019-06-26 19:51:29
    我曾经在 2012 年介绍过 Android OS 的情况,现在来看依然不过时。作为一个技术人,我们探讨某个东西的前景的时候总该对它有一些了解。本篇就是一篇非常简单的对 Android OS 的介绍。 在 Android 刚...

    640?wx_fmt=gif

    640?wx_fmt=jpeg

    作者 | 邓凡平

    责编 | 屠敏

    640?wx_fmt=png

    缘起


    前几天,CSDN 曾发过一篇有关鸿蒙 OS 的文章,我觉得它是最近讨论自主开发 OS 的文章里很中肯的一篇了。我曾经在 2012 年介绍过 Android OS 的情况,现在来看依然不过时。作为一个技术人,我们探讨某个东西的前景的时候总该对它有一些了解。本篇就是一篇非常简单的对 Android OS 的介绍。

    在 Android 刚起步的那几年(2011 年前及左右),我们同时下注了 Android、Intel 联合几个厂商开发的 Meego、还有基于 Linux 的嵌入式 OS。彼时,中移动的 OMS 也很火,甚至 OMS 带出了一个叫播思的公司。播思里边有非常多的人才,其中很多人来自中国手机界的黄埔军校——摩托罗拉。从这个角度看,Android OS 在早期也是看不准,没人觉得它一定会成。

    Android 最终还是成功了,我个人感觉这个不全是技术的因素,但有几个关键因素还是和技术有关:

    1. 使用 Java 作为开发语言绝对是很关键的因素之一——毕竟,迎合开发者非常重要。Java 终归是比 C++/C 要简单,容易上手。

    2. 另外,Android 底层是 Linux,这一块就把绝大部分做外设的厂商吸引过来了。它们本来就为 Linux 开发驱动或者相关模块,迁移到 Android 没太大工作量。

    3. 最后,还有关键的芯片厂商——高通的支持。如果当时只有 Intel 一家做芯片的话,Meego 保不齐还能多蹦跶几年。

    以前 CSDN《程序员》杂志里有一位投稿作者,他的个人介绍中,有一句很有意思——要为 Linux 摇旗呐喊。所以,Android 之所以成功,就在于太多人为它摇旗呐喊了。软硬件开发、搞培训.....真是人心齐泰山移!

    Android 彻底占据市场之后,基于 H5 的 OS 又来了一波小高潮。

    2013-2014 年左右有个 Firefox OS,还在国外装了不少机器。FireFox OS 是全兼容 Android 的。所谓的兼容,就是原来归属 Android OS 的功能都保留,然后再对 H5 的 App 提供了一些功能扩展而已。

    相比 Android,给 Firefox OS 摇旗呐喊的人就少多了。而且还要兼容 Android OS——那么,每次 Android OS 更新,Firefox 都要去适配,更改。这工作量就非常非常大了。最后 Firefox OS 就消亡了。

    以上是历史情况——它说明了一个事实:没有哪个 OS 天生就是赢家,形势是变化的。另外,我们很多人要感谢 Android,可以亲历一个 OS 从零到如此强大的过程,时间跨度非常短,七八年就搞起来了。

    现在开始我们关于对 Android OS 的一些科普性介绍。


    640?wx_fmt=png

    整体视频


    由 PPT 转换而来的视频:

    上面视频里介绍了四个部分,分别是:

    1. Android 系统架构——垂直角度来看;

    2. Android Framework——没有层次关系;

    3. Android OS 是微内核的 OS;

    4. Android 手机发布和更新的过程示意。

    每个部分都不长。大家可以先看下面的内容,等整体看完后,再来看上面的 PPT 视频。


    640?wx_fmt=png

    Android 系统架构——垂直角度来看


    下图是 Android OS 的整体架构。99.999% 搞 Android 的人都知道:

    640?wx_fmt=jpeg

    从垂直角度来看,Android OS 分为四个层次(这是我的划分,别家的说法大同小异,其中有些内容比较老了,比如 Dalvik 虚拟机已经换成了 ART,但不影响我们对这个架构的认识):

    • 最底层是 Linux Kernel 层。请各位开发者特别注意这一点,它再强调一万次也不为过——Android OS 的基石是 Linux Kernel。除了 Kernel 层,User Space 中围绕 Linux Kernel 相关的东西也被 Android OS 照搬了过来,比如 ueventd、wpa_supplicant 等。

    • 中间两层由下到上是 Native Framework 层和 Java Framework 层。这两个是 Android 独有的。我们统称这两层为 Android Framework

    • 最上层是应用层。正是基于 Android Framework,才使得 Android 上的应用如此与众不同——作为对比,如果写个无界面的比如 ls、find这样的程序,它们在所有基于 Linux/Unix 的系统上都是一样的运行。这样的程序我们一般认为是 Linux 应用程序——肯定不会把 ls 当做 Android 应用。

    上述四个层次中,Kernel 历史最悠久,到今天就剩下大概 Windows,Linux、macOS 三个巨头了(Unix 和 Linux、macOS 有亲缘关系,在消费类电子产品中见得少,所以不讨论 Unix):

    • Windows 归微软所有,搞了几十年,参与一起玩的设备厂商,软件开发商几十万家。

    • Linux:和 Unix 有亲缘关系,开源的 Kernel,上面有好多发行版,比如 Ubuntu、CentOS 等,国产的优麒麟也是。

    • macOS:也和 Unix 有一定亲缘关系,苹果独有。参与一起玩的设备厂商,软件开发商也有几十万家。

    以上唯有 Linux 不归某个公司独有。所以,Android 使用 Linux 是必然的选择。如果我们要搞国产自主 OS 的话,最大可能性也是基于 Linux,比如现在的优麒麟,以前的红旗都是这样。

    这并非技术牛不牛的问题,而是 Linux Kernel 可看做是全人类共有的软件财富。遵守它的要求,不要搞独立王国,一起用好它即可。再说,Linux Kernel 发展了几十年下来,很多国人(包括国内很多公司)为它做出过许多大大小小甚至卓越的贡献。俗话说,前人栽好树,后人好乘凉。如果从头到尾,从上到下都要“自主”,那么我们也要为计算机编程语言的使用而担忧了。

    640?wx_fmt=jpeg

    继续我们的讨论。


    640?wx_fmt=png

    Android Framework——没有层次关系


    大部人眼里,Android OS 的架构都是上面那样的垂直关系——这个认识没有错,但是并不完全准确。如果我们以功能模块为单位来观察其中的 Android Framework(Native Framework 和 Java Framework 的统称)的话,你会得到大概下面这样的图:

    640?wx_fmt=jpeg

    以功能为单位来观察 Android Framework 的话:

    • Java Framework 包含几大类的服务,比如和应用中四大组件调度功能有关的组件,专门管理窗口的组件,应用程序安装有关的功能组件。还有和网络有关,蓝牙功能有关的组件等等。我在《深入理解 Android 卷2》里将它们大概分了七大类。现在的最新版本里这个类别有所增加,比如对 Android Auto(针对车载系统)里增加了几个和车载有关的功能模块。另外,请注意,上述划分纯属我个人的分类,并不存在什么标准。

    • Native Framework 也可以像这样按功能来进行划分,比如和音频相关的 AudioFlinger、AudioPolicyService 等。

    通过这一节,你知道了:

    • Android Framework 里其实是有很多功能模块的。

    • 这些功能模块有可能是放在 Java Framework 里,也有可能是 Native Framework 里。

    • 更有甚者,这些功能模块可以分布在多个进程中,彼此之间,或对应用层以 Binder 方式进行进程间交互。

    知道上面这些东西有什么用呢?接着看。


    640?wx_fmt=png

    Android OS 是微内核的 OS


    关于内核,一直有微内核宏内核之分。使用微内核的有 Windows 和Mac、使用宏内核的是 Linux。那么,什么微内核,什么是宏内核?下图简单解释了微内核:

    640?wx_fmt=jpeg

    我简单描述下微内核和宏内核的差异(点到即止,非技术严格):

    • 微内核就是内核只做一些基本的服务(比如操作 CPU,进程调度,内存管理、设备管理等)。然后将其它功能独立为除内核之外的多个进程。微内核最大的诟病就是其它进程和内核之间的交互属于进程间通信,开销比较大。

    • 宏内核就是把上图中的所有东西都塞到内核里。这样大家都运行在一个进程里(主要是指共享同一个内存空间——内核地址空间),如此可极大减少模块间交互的开销,但问题就是一旦有一个模块出问题,整个 kernel 都可能挂掉。

    了解微内核和宏内核的差异后,我们再来看 Android。如果我们认为 Android 是一个 OS 的话(后面会讲为什么可以将 Android 看成是一个 OS),它是微内核还是宏内核呢?接着看下图:

    640?wx_fmt=jpeg

    上面这个图展示了 Android 四个层级间的交互:

    • Native Framework、Java Framework 均有和 Linux 交互。

    • Java Framework 中的部分模块和 Native Framework 中的部分模块有交互。

    • App 和 Java Framework 有交互。某些情况下也可以和 Native Framework 模块交互(图中并未画出相关的箭头线)。

    结合我们上文提到的,Android Framework 中的功能模块并非都挤在一个进程里,而是分散在不同进程中,功能模块之间通过进程间通信的手段交互。所以,从应用的角度看,Android OS 肯定是一个微内核。

    现在,我们再看看为什么可以把 Android 称之为一个 OS——这个问题的答案其实在上面已经隐含得回答过了,就是上面说的那句话“正是基于 Android Framework,才使得 Android 上的应用如此与众不同。

    是的,Android 之所以可以说自己是个 OS,在于它新搞了一套应用开发及交互规则。

    关于这个规则,下面举两个非常简单的例子。一个是启动应用时,源 Activity 和 Android Framework 的交互过程:

    640?wx_fmt=jpeg

    对于这个图,我并不是让大家去了解具体交互的细节。一看这个图,你就发现这玩意为 Android 独有。

    当然,在 Android 中你也可以做一个不遵守这样的应用程序。比如手机中的开机动画,就是 Linux 应用程序——程序名叫 bootanimation,它就没有什么四大组件,也不需要 Manifest,纯纯得一个播放动画/图片的 Linux 程序。

    我曾经在 2010 年左右实践过直接使用 libskia 来做 UI 控件相关的应用—— Android 中的那些控件其内部就是使用 libskia 为二维图形库(3 维绘制则使用 OpenGLES)。libskia 也就是现在的 Flutter 底层绘制引擎。

    我当时想法很简单,就是想对一些使用 Android 系统的非手机设备(用在场景比较简单的设备上,比如刷卡买个汽水之类的。那个时候,这些设备的性能都非常简陋,跑不动全套 Android,必须裁剪),完全可以使用自定义的基于 libskia 图像库的控件来画 UI。因为大部分情况下,只要把 UI 画出来就好,剩下的调用驱动就行了。什么四大组件,统统都不需要。

    拜 Flutter 所赐,libSkia 现在有一些知名度了,但它的价值依然被大部分人低估。目前我知道还没有哪本专业书籍是介绍这个的。车载系统(对时延要求很高,使用全套 Android 对速度影响很大,往往需要裁减)或者哪个公司想搞 OS,开发一套二维绘制引擎非常关键——说白了,应用开发中很大部分比例都是 UI。我记得还有好几个 Linux 发行版让界面看起来和 Windows 一样。BTW、3D 绘制引擎反而不用在意,因为太难,怕各家瞎搞,所以早就有 OpenGL 标准.....

    接着来看另外一个例子——播放视音频:

    640?wx_fmt=jpeg

    Android 上,一个应用要播放视音频的话,依赖 MediaPlayerService、SurfaceFlinger、AudioFlinger、硬件编解码模块等。这套东西也不是 Linux 带过来的,而是 Android 搞出来的。

    我记得以前在 Windows 上做播放器的时候,应用程序需要自己加上编解码和播放的功能,使用 DirectX。这就是每个应用的独家秘籍,谁家支持得格式多,谁就厉害了。

    放到 Android 上来,编解码,播放功能均由系统提供了,应用程序再也不用操心这些东西。这无疑是一个很大的进步。

    上面举了两个非常简单的例子,想必现在我们确实可以大大方方将 Android 称之为 OS 了。因为它在 Linux Kernel 之上做了大量的非同一般,独立自主的功能。说实话,对 Android 应用来说,它是不是与运行在 Linux 上都不重要,只要有 Android Framework 就足够了——早在 2011 年,我的CSDN博客文章“移植之乱谈”(https://blog.csdn.net/Innost/article/details/6954556)中,有人把 Android Framework 整个移植到了 Windows 上。注意,并不是现在模拟器那样的使用虚拟机喔!(文章中的视频好像还可以看,大家可以看一下。


    640?wx_fmt=png

    Android 手机发布和更新的过程示意


    很多人不了解 Android 手机系统发布和更新的过程,总吐槽 AOSP 新版本发布后还要过好久自己的手机才能更新到新版本。这个问题的解释见下图:

    640?wx_fmt=jpeg

    上图是 Android 手机系统的发布和更新过程,图比较久了,现在情况会好点,但大致如此:

    • Google首先发布版本,我们称之为AOSP原生代码。AOSP原生代码只支持极少数几款手机。

    • 然后是芯片厂商在 AOSP 基础上发布自己的版本。比如高通、华为、MTK。①和②的过程有重叠,主要还是为了加快发版速度。在这个阶段,每个芯片厂商会在 AOSP 原生代码上叠加自己的功能,比如以前 AOSP 没有双卡双待功能,这些功能有一些是芯片厂商自己加的。另外,芯片厂商还要针对自己发的版本做大量稳定性测试。

    • 华米 OV 等终端厂商并不直接使用谷歌的原生代码,它们其实使用的是所用芯片厂商提供的 Android 代码。然后,设备厂商还得魔改一下,加上终端厂商自己的特性。这就是 MIUI、EMUI、ColorOS 等的功能。

    • 现在大部分终端厂商使用芯片厂商的 Turnkey 方案,主要是 CPU+通讯模组,芯片+软件打包卖给终端厂商。少数公司比如魅族使用的 CPU 是三星,而通信模组不知道哪一家,那么魅族就需要把三星的 CPU 和别家的通讯模组整合到一起,难度比使用 Turnkey 方案得大一些。

    • 终端厂商集成完后,还需要考虑运营商定制的情况,然后加上对应的运营商定制功能,并做对应的测试。

    了解上面的情况后,光从测试角度看,源码从 Google 发布到最终的手机上,测试的工作量都非常大——所以到终端消费者手里的速度会慢多了。厂商的解决办法就是在新款手机上直接使用新版系统,老款手机往往要等一段时间才会发布新版升级包。

    总之,在 Android 手机世界里,谷歌、芯片厂商、终端厂商,运营商都是生态链里的关键玩家,四者互相影响。从终端厂商角度看,我觉得芯片厂商对终端厂商的影响力更关键和致命。最简单来说,高通要是不更新更好的芯片,很多手机商的产品也就停滞不前了。

    对比苹果,它从芯片到 OS 都自己的,也不太拿运营商当回事。所以苹果发版和覆盖速度都相对较快,碎片化问题绝对是比 Android 低好几个数量级。当然,通信芯片是苹果的大问题,所以老有人吐槽 iPhone 的信号不好。这个问题能靠苹果自己开发通信芯片来解决吗?理论上可以,但是不现实,因为其中有很多专利问题不好搞。


    640?wx_fmt=png

    国产自主 OS 的未来


    再说下我对国产自主 OS 的一些看法和判断。

    • 不出意外的,中长期(十几年之内,如果量子计算机还没有普及的话)看,依然会以 Linux Kernel 为核心(这里不考虑那些特殊场景的 OS,比如工控机用的实时 OS 等)。只要使用 Linux Kernel,绝大部分硬件厂商都能适应。否则来个新 OS,硬件厂商又得开发驱动,还要做大量测试,这个所需的时间和金钱成本都非常巨大。

    • 如果国产自主 OS 兼容 Android 的话,说明原有 Android 的功能等大概率会保留。这是从应用角度来看的。当然,也可以魔改 Android Framework,把内部实现都换成自己写的代码。但是要做到兼容的话,就必须对应用没有影响——这就回到软件界的一句老话,如果一个东西叫起来、走起路来都像鸭子的话,那它就是鸭子。从这个角度看,自主实现只是为了开发一套看起来和之前系统类似的话,意义并不重大,这种自主也很难被认可。当然,如果能提升原有系统的性能则另当别论,这属于优化和改善,和我们讨论的不是同一个东西。

    • 所以,国产自主 OS 要么像 Android 一样基于 Linux 开发,但是套路和 Android 完全不一样的,比如像 Meego、Tizen 这样的。要么就是拓展 Android OS,开发出类似一个 H5 OS 之类的。

    • 最后,如果抛弃 Linux 的话,可参考 Google 的 Fuchsia 了。Fuchsia 据说是一个微内核的新 OS 架构。不过,目前 OS 的前途并不明朗。OS 从来就不是一个纯软件的事情,还涉及到海量硬件厂商。它们甚至是一个 OS 生死存亡的决定者。

    作者简介:邓凡平,资深 Android 技术专家,国内早期从事 Android 技术研究和开发的工程师之一。运营个人公众号「神农和朋友们的杂文集」(ID:alashennong_gh)。

    目前就职于民生银行总行科技部创新技术研究院,钻研和探索物联网等新技术在金融领域中的应用。从底层的虚拟机,到中间的系统层和框架层,再到上层的各种应用,他对整个 Android 系统的源代码有非常深入的研究和理解。策划并撰写了“深入理解Android”系列图书(目前已出版 8 本),累计销量超过 10 万册,是广大 Android 工程师系统、深入了解 Android 系统源代码。

    【End】

    640?wx_fmt=jpeg

     热 文 推 荐 

    5G 来了,我们可以做什么?

    V神已抵京, 倒计时4天! 6大理由告诉你为什么要参加"2019以太坊技术及应用大会"

    华为获首张 5G 终端进网许可证;Linux 之父来华;Eclipse 4.12 发布 | 极客头条

    “我不是个优秀的 Web 开发人员,我只是擅长搜索谷歌”

    盖茨承认犯下价值 4000 亿美元的错!

    听说,私有云也出新一代了?

    Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

    Python处理图片九宫格,炫酷朋友圈

    ☞她说:程序员离开电脑就是 “废物” !

    640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢
    展开全文
  • Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。 下面是官方的解释 在Android4.0以后,会发现,只要是写在主线程(就是Activity...
  • android.os.Build类是一个非常方便使用的类,不需要任何权限。 说明如下: android.os.Build.BOARD:获取设备基板名称 android.os.Build.BOOTLOADER:获取设备引导程序版本号 android.os.Build.BRAND:获取设备品牌 ...
  • android.os.Build 常用常量

    万次阅读 2017-12-23 13:34:51
    android.os.Build常量
  • android.os.Build详解

    千次阅读 2018-08-13 13:59:38
    android.os.Build是安卓的一个类,获取安卓的一些系统信息 android.os.Build.VERSION.RELEASE 获取当前系统版本号字符串:4.4.2 android.os.Build.MODEL 获取手机型号 android.os.Build.VERSION.SDK_INT 获取当前...
  • 这是适用于Android-x86的Lineage OS(以前称为CyanogenMod)14.1的第三个稳定版本。主要特征cm-x86-14.1-r3是cm-x86-14.1-r2的更新。它基于Android-x86 7.1-r3和最新的LineageOS 14.1。发布文件此版本包含四个文件:6....
  • Over the last few years, Android OS has come to dominate the mobile OS landscape with over 86% market share as of 2019. The system provides high-performing and secure usage and comes with regular vers...
  • android.os.TransactionTooLargeException

    千次阅读 2022-03-16 17:07:01
    android.os.TransactionTooLargeException 原因 通过Bundle在两个页面间传递的数据太大了。 解决 通过全局变量的方式传递数据。
  • 安卓os耗电高怎么解决

    千次阅读 2021-06-02 21:08:26
    安卓os耗电高怎么解决,如果您在使用安卓系统的手机遇到耗电高的情况,不妨看一下下面几种解决耗电高的方法,希望能够解决您的疑问。安卓os耗电高怎么解决1、首先打开手机的【设置】,在电池耗电量的列表中找到耗电...
  • android.os.DeadSystemException

    千次阅读 2022-04-25 14:16:48
    在程序压测的过程中,出现过此类... * The core Android system has died and is going through a runtime restart. All * running apps will be promptly killed. */ public class DeadSystemException extends D
  • 引入第三方项目到我的项目中,第三方项目引用了android.os.systemporperties。 报的错是:can t find dynamically referenced class android os systemproperties。 2.解决方案: 当你确定无需引用这个类时(实际是...
  • android.os.Build.VERSION_CODES对应的值

    千次阅读 2019-08-14 16:09:40
    static int BASE //October 2008: The original, first, version of Android. static int BASE_1_1 //February 2009: First Android update, officially called 1.1. static int CUPCAKE //May 2009: Android ...
  • Android开发中遇到了android.os.NetworkOnMainThreadException报错,由于刚开始接触并不熟悉所以走了写弯路,在此记录下问题。 官方解释是从SDK3.0开始,Google不再允许网络请求(HTTP、Socket)等相关操作直接在...
  • java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String, boolean)' on a null object reference 这个是什么鬼!能正常运行但就是看他不...
  • Android Studio解决办法如下: ... //以下是为了找到android.os.SystemProperties这个隐藏的类 String SDK_DIR = System.getenv("ANDROID_SDK_HOME") //("TAG", "SDK_...
  • android.os.RemoteException:

    千次阅读 2022-06-12 11:38:01
    1、调用了ActivityThread的handleRequestAssistContextExtras方法(主进程)源码: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/app/ActivityThread
  • 我们需要将layoutlib.jar导入Android Studio,就可以通过import android.os.SystemProperties引入SystemProperties 找到layoutlib.jar包 #该jar包在Sdk/platform/android-XX/data下 cd Android/Sdk/platforms/...
  • HarmonyOSAndroid深度对比

    千次阅读 2021-06-04 17:56:53
    HarmonyOS APP 工程结构HarmonyOS应用发布形态为APP Pack(Application Package,简称APP),它是由一个或多个HAP(HarmonyOS Ability Package)包以及描述APP Pack属性的pack.info文件组成。一个HAP在工程目录中对应一...
  • 最后查阅资料了解到,在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。下面是官方的解释 在Android4.0以后,会发现,只要是写在...
  • 如何判断android OS是32位还是64位 ?

    千次阅读 2017-03-30 14:57:26
    DESCRIPTION 一台手机,有时需要判断kernel是32位还是64位。 SOLUTION 简单的方法是查看是否存在/system/lib64目录,可以通过adb shell ls /system/lib64看是否可以 看到。
  • 菜鸟新手写android应用demo,遇到android.os.NetworkOnMainThreadException异常,根据大神的指示,去查了一下官方文档,上面是这样说的: The exception that is thrown when an application attempts to perform ...
  • HarmonyOSAndroid的全面对比

    万次阅读 多人点赞 2021-07-25 00:27:07
    二、HarmonyOSAndroid的对比 2.1 HarmonyOS并不是Android的替代品 2.2 系统定位 2.3 内核对比 2.4 运行速度 三、方舟编译器 一、前言 这段时间我在寻思这学习一下鸿蒙, 第一是因为在着手做一个自己的开源...
  • Androidandroid.os.Build

    千次阅读 2017-10-18 18:12:34
    一、类概述:从系统属性中提取设备硬件和版本信息。二、内部类: 1、Build.VERSION 各种版本字符串 2、Build.VERSION_CODES 目前已知的版本代码的枚举类 三、常量:UNKNOWN 当一个版本属性不知道时所设定的值。...
  • Android和HarmonyOS对比

    千次阅读 2021-08-26 15:50:04
    知乎中相关介绍
  • Android 源码查看网站分享

    千次阅读 2022-04-04 22:44:42
    Android OS 在线源代码 - https://www.androidos.net.cn 这个主要是有Android各版本内容方便一点 https://android.googlesource.com/platform/packages/apps/ google官方源代码查看,开源网站。支持repo下载 ...
  • OkHttp,android.os.strictmode.LeakedClosableViolation 错误
  • android.os.NetworkOnMainThreadException

    万次阅读 多人点赞 2019-02-27 00:22:49
    android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常。然后我就去了解了下这个异常,先看看官方的说明: ublic class NetworkOnMainThreadException extends ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 463,595
精华内容 185,438
关键字:

android os