专访罗升阳:老罗的Android之旅

转自:http://mp.weixin.qq.com/s?__biz=MzI3NzA5MzUxNA==&mid=415711810&idx=1&sn=de8337e627811f8a4c8acce2f426f4ad&scene=0#wechat_redirect

专访罗升阳:老罗的Android之旅

2016-01-16 钱曙光 Linux内核之旅linux

【编者按】咱们常说的智能手机实际上就是手机上加了一个操做系统,那么大部分人都会跟我同样不由发问,这个操做系统和咱们接触更多的电脑上的操做系统同样吗。道家云,看山是山,看山不是山,看山仍是山。这三个境界一样适用于前边的问题,你说是否是。
程序员

罗升阳(博客),1984年出生,2007年毕业于浙江大学计算机系,取得学士学位,2010年毕业于上海交通大学计算机系,取得硕士学位。毕业后一直从事于互联网软件开发,而且致力于移动平台的研究,特别是对Android平台有深刻的理解和研究。在国内知名IT技术社区CSDN上发表了一百多篇高质量的Android系统原创性文章,而且开设博客专栏——《老罗的Android之旅》。积极与网友交流互动,深受你们喜好,访问量一直居于前茅。同时,著有《Android系统源代码情景分析》一书。面试

CSDN:请和你们介绍下你和目前所从事的工做。算法

罗升阳:我如今正在作一款和手游相关的Android应用,玩家能够一边玩游戏一边录制以及直播。在中国,不管是传统的PC互联网,仍是如今的移动互联网,游戏都是一个巨大的市场。在手游超越页游追赶端游的今天,手游录制和直播做为链接玩家和玩家、玩家和厂商之间的一个平台,近年来在国内外都获得了追棒。在国外,今年5月初的时候,手游录制及分享社区Kamcord得到了710万美圆的A轮融资;到5月中的时候,又传来Google花10亿美圆收购游戏直播公司Twitch的消息。在国内,爱拍和ShareSDK也发布了手游录制和分享相关的产品。编程

手游录制和直播产品吸引个人,除了它的巨大市场以外,还有它的技术含量。坦白说,在Android平台上,至今尚未一款用户体验好的手游录制应用。目前Android市场上的手游录制应用,不是性能问题,就是稳定性或者兼容性问题。包括在iOS平台上已经作得至关不错的Kamcord,在Android平台上也表现平平。究其缘由有以下三点:浏览器

一是Android平台没有直接提供获取游戏画面和声音的接口。安全

二是Android平台的差别化致使很难找到一个通用的技术方案使其在大部分手机上都能行之有效。在Root过的手机上,虽然可使用截屏接口来获取游戏画面,可是直接使用效率是很低的,难以知足帧率要求。另一个经过读取Frame Buffer获取游戏画面的方法,在到4.0以后,就更行不通了。服务器

再者,因为是实时录制,对视频编码的性能要求是很高的。使用软编码基本上是不可行的,必需要使用硬编码。可是使用编码又要考虑硬件上的适配,不然就很容易产生稳定性和兼容性问题。网络

为了解决上述的技术难题,须要用到很底层的Android系统知识,例如Android系统的UI渲染机制和硬编码等知识。要利用这些知识,没有深厚的Android功底是很难办获得的。因为我对Android系统有比较深的研究,所以我以为去作这样的一个产品是一个颇有意思的挑战。架构

固然,目前除了作手游录制和直播应用以外,还在研究作一些基于Android系统的穿戴式设备,毕竟个人兴趣点在于Android系统,并且穿戴式设备也会是将来的方向之一。

CSDN:你是从何时接触到计算机的,是怎样走上编程这条道路的?又是在什么时候开始接触Android平台并进行如此深刻研究的呢?

罗升阳:我接触计算机的时间是比较晚的,上大学以前,除了在网吧,基本上就没接触过电脑了。大学选择了计算机专业,才开始真正的接触电脑。并且我很清楚地刻,大一开学大概一个月的时候,学校要进行计算机文化基础上机考试,实际上就是考一下Word和Excel的操做。考试前有大概两周时间让你有空的时候去机房练习。对于一个之前没怎么接触过计算机、打字都还不利索的孩子来讲,果不其然就考挂了。后来补考了一次才及格。

因为学的是计算机专业,大一的时候就要开始编程的了。一开始学的就是C语言,不像如今不少人一开始学的是都是C#、Java、PHP这些高级又至关易用的语言了。后来才逐渐学习了C++、Java和C#等这些高级语言。刚开始学C语言仍是很痛苦的,龙其学到指针、链表这些知识的时候。记得大一上学期的国庆节,还专门花了几天的时候去啃了链表的实现原理。如今回想起来,一开始就选择学习C语言是对的。由于不管你如今工做用的是什么语言,若是想要把它背后依靠的平台吃透,都不可避免地须要了解它的底层实现,而这些底层实现基本上都是离不开C/C++。或者换句话说,语言只是一个工具,要理解你的软件实现原理,关键都是要理解软件背后的计算机系统,而C是最接近计算机系统的语言。所以,我是很是建议有志于从事软件开发的同窗们,不管你如今、之后工做用的是什么语言,都必定要学好C/C++。

接触Android平台是研究生毕业后工做的事了。正式接触是2011年年初的时候,当时写了一个简单的五子棋游戏。不过在2010年下半年的时候,就开始计划要好好研究一下Android系统了。由于了解到Android系统是基于Linux内核实现的,因此2010年下半年的时候,主要就是去补Linux内核的基础知识。其实激发我要去深刻研究Android系统而不是单单是Android应用的动机,是当时在公司作的一款软件的应用程序框架,是彻底公司的一个团队自行开发的,没有采用在学校时接触的MFC等通用框架。那时候对这套自行开发的应用程序框架很感兴趣,但无奈咱们只是业务团队,平时只是使用这套框架,而没有机会去深刻研究。

2010年的时候,iOS已经很火了,Android也开始冒出尖尖头了。因为Android背后的靠山的Google,并且它的源码是开放的,所以,就准备去研究一下Android系统的应用程序框架是怎么实现的。这样一来能跟上移动潮流,一来也能知足本身的好奇心。今后就一发不可收拾,正式步入Android系统的世界了。

CSDN:你用两年的时间炼就了深厚的Android内功修养,请问期间的学习之路是怎样的?有什么学习的心得和体会可分享?

罗升阳:那两年基本是把全部的业余时间都花在了学习Android上,包括工做日的下班时间、周末、节假日等。因为是第一次接触这么系统又这么底层的知识,从一开始恶补Linux内核知识,到后来系统地学习Android系统的专用驱动、HAL层和应用程序架构层等知识期间,遇到的困难是可想而知的。以至于在花了两年的时间,完成Android系统研究的第一阶段任务以后,忍不住写了一篇文章《2012年的Android之旅:梦想、学习、坚持、自信、淡定》总结这段学习经历。就像文章所说的,那两年学习Android的心得和体会总结起来就是十个字:梦想、学习、坚持、自信、淡定。因为篇幅关系,这里就不一一展开来讲了。不过,我最想分享仍是关于坚持这一点。

坚持这两个字真的是提及来容易作起来难。哪怕是一件很简单的事情,要求日复一日地坚持去作,恐怕也是很多人作不到的。举个例子说,锻炼身体。咱们不说天天,就说每个星期拿出一个到一个半小时去锻炼,又有多少我的能坚持作到的呢?这仍是花时间去作就能完成的,不会遇到诸如学习、工做、生活上的挑战。因此咱们说坚持就是胜利,是颇有道理的。只要制定好了目标,就必定要下定决心坚持去完成,不管中间遇到什么样的困难和挑战。当坚持变成一种习惯的时候,离目标的实现就不远了。换句话说,主要你肯坚持,你就会发现:一、你的目标实现了;二、你养成了一种良好的习惯。

常常听到有人说,太难了,看/学/作不下去了。其实,没有什么事情是与生俱来就会的。既然是不会的,学习的过程就确定要付出代价。2010年下半年以前,我平时学习、工做、和娱乐基本上都是在Windows平台上,第一次学习Linux内核看的是《Linux内核源代码情景分析》 这本书。看过这本书的人都知道,那基本上就是一本天书。当时我对本身说,不紧要,看一遍不懂,我就再看第二遍、第三遍和第四遍。最后执行的过程是,看过第一遍后,内心只是大概有个谱。接着去找一些相关的经典书籍来继续看,例如《Linux内核设计与实现》。看完了《Linux内核设计与实现》,回过头来又接着第二遍看《Linux内核源代码情景分析》。这下就发现原来一些看不懂的地方如今懂了,可是仍是有其它地方看不懂。因而,又继续看了《Linux设备驱动程序》和《深刻理解Linux内核》等书。每次以为有必要的时候,都又从新去看一遍《Linux内核源代码情景分析》。通过这样的三四遍折腾以后,最后终于能够很愉快地看懂《Linux内核源代码情景分析》了。

固然,除了有毅力去坚持以外,还要懂得坚持的方法。借用马丁·路德·金的一句话:

If you can’t fly, then run; if you can’t run, then walk; if you can’t walk, then crawl, but whatever you do, you have to keep moving forward。

这句话我以为重点就是最后三个单词“keep moving forward”。在坚持的过程当中,你要让本身以为本身一直在“keep moving forward”,这样才会有坚持下去的动力。换句话说,就是要让本身在坚持的过程当中看获得事情又推动了一步,哪怕是一点点的进步。仍是以看书为例子。只要你天天坚持平均看20页,一年就能够看7300页。打个8折,也有5840页,也至关于10本书了。10本书看下来,能够学到的东西是至关多的了。在这个过程当中,天天看20页书这件事就是推你向前了一步。有人可能以为天天看20页书仍是太难了。是的,开始的时候多是有点难。可是,当你坚持一段时间以后,就会发现了解的知识变多以后,看书的速度也跟着加快,到时候不要说一天20页,一天50页都不是问题。

CSDN:你是《Android系统源代码情景分析》(试读地址)一书的做者,这本书是怎样诞生的?这是你的第一本书,写书过程当中经历了怎样的困难?随着Andriod的版本更迭,你会出第二版吗?还有其它著书计划吗?

罗升阳:一开始只是想经过博客记录本身学习Android系统的过程,并无计划写书的。随着博客的人气上升,不断有出版社编辑发出出书的邀请。开始的时候,基本上仍是拒绝的。再到后来,也有很多网友建议把博客整理一下成书出版。在出版社和网友的屡次建议下,也考虑到有些读者可能更喜欢阅读纸质书,最终就决定把博客的文章整理成书出版了。

第一次写书,怀着的是坐卧不安的心情,担忧能力有限,误人子弟。书与博客不同,出书包含有出版社、渠道和销售等成本,所以读者是不可能免费获得的。既然读者要付出钱来购买你的书,那你写书的时候就得负起责任,例如要保证内容的系统性、完整性和正确性,还有文字表达的通顺性,甚至还不能出现错别字。这与在网上写博客有很大的区别。写博客能够比较随意一点,漏掉的内容能够之后再补,错误字也能够立刻就修改过来。

基于面这些缘由,写书过程经历的困难是可想而知的。决定写书以后,一开始并无急着去写,而是将计划纲入书里面的内容都先发表到博客上,也就是我在2011年12月前发表的文章。主要是考虑到先将内容发表出来,让读者看到以后能够帮忙发现BUG以及提建议,这样能够帮助提升书的质量。整理博客不是简单的拷贝粘贴,比我想象中要困难多了。回过头来再看本身发表过的文字,百分之七八十都要从新表达。并且有些章节,要系统地描述清楚,单靠博客上的文章是远远不够的。例如,在写Binder那一章时,原觉得在博客写的一系列文章已经够完备了,可是发现只是写了一半不到。而后就拼命地一边整理已有的内容,而且一边补新的内容。

在时间上,从开始整理到出版的半年时间里,除了工做基本就是扑在写书上了,并且利用的都是工做之余的时间。没有周末,没有节假日,工做日也是常常熬夜到两三四点。对程序员来讲,写文字其实比写代码要累多了,这就是为何程序员都不喜欢给本身的代码写文档写注释的缘由。期间是想过要放弃的,可是已经跟出版社签订了合同,怎么都坚持下去啊。就这样一路走来,从博客文章整理获得初稿,又通过三遍逐行逐行的校对,终于完成了三大篇十六章830页近160万字的著做。说实话,当时要是再让我看第四遍的时候,感受都要吐了。

Android版本更新的确是比较快,不过目前是没有出第二版的计划了。主要是由于我写的内容都是很基础的东西,例如HAL、Binder IPC、Ashmem、Logger,以及四大组件Activity、Service、Broadcast Receiver和Content Provider的实现原理,它们在后来的版本中仍然是保持性当初的设计思想和运行原理的。我更但愿的是,读者看了个人书以后,可以本身去分析Android系统的源码,这样之后Android版本更新得再快也不怕了。

至于新书,之前是有计划的。完成了《Android系统源代码情景分析》一书以后,我又陆续在博客了发表了UI架构、UI渲染、窗口管理、Dalvik虚拟机、编译系统、SEAnroid安全机制等一系列的文章。这些内容加起来也能够有《Android系统源代码情景分析》这本书那么厚了。不过写书是费时费力的事情,并且产出投入比也不高,再加我也不是专职的图书做家,因此如今也不打算出新书了。可是博客是必定会坚持写下去的,但愿读者能够持续关注,而且能够在博客上与我交流。

CSDN:初学Android的时候,不少人搞不清Android和Java到底有什么不一样,你认为他们之间的区别是什么呢?另外,Android内核跟linux又有什么区别?

罗升阳:实际上,Android是Android,Java是Java。不用Java,用C/C++写的程序,也同样能够在Android上运行。对于这个问题,其实不仅是初学者,对于很多有经验的开发者,也会认为作Android应用开发,懂Java就好了。从最近面试的一些人来看,就很明显地感受到这个问题的广泛性。不少Android应用开发者只懂得使用Android SDK提供的Java接口来开发东西,可是没有进一步去学习一些更深层次的东西。

本质上说,Android是一个Linux系统,所以它是基于Linux内核开发的。可是Android与通常的Linux系统不一样的是,它有着本身的一套独特的用户空间运行时,也就是咱们一般说的应用程序框架。举个例子来讲,之前不少基于Linux的嵌入式开发,就是移植一个Linux内核,而后再用Qt做为应用程序框架,这样一个系统就跑起来了。所以,将Qt应用程序框架替换为Android本身的应用程序框架,就获得了一个现代化的移动操做系统。

在Android应用程序框架中,包含了不少开源工程,例如浏览器用的内核WebKit、管理Wi-Fi网络的wap_supplicant、播放音乐视频的StageFright等,它们都是使用C/C++来写的。并且Android系统专用的用来渲染UI的SurfaceFlinger、用来播放声音的AudioFlinger等,也是用C/C++来写的。更不用提每个应用程序都要使用到C库bionic、Dalvik虚拟机等了,它们都是用C/C++来写的。这些使用C/C++写的服务,实现了最基本的功能。这些最基本的功能被在Java层的提供的关键服务所使用,例如组件管理服务ActivityManagerService、应用程序安装服务PackageManagerService、网络链接服务ConnectivityService等。最后,Android再封装了一套基于Java语言的SDK给开发者去使用那些实如今Java层的系统服务。

也就是说:Android系统=Linux内核+Android用户空间运行时+ Android SDK,而Android用户空间运行时=C/C++ Runtime Framework + Java Runtime Framework。不少状况下,咱们调用Android SDK提供的一个API时,这个API调用会交给Java Runtime Framework处理,而Java Runtime Framework又继续将这个API调用交给C/C++ Runtime Framework处理,最后C/C++ Runtime Framework又有可能接着将这个API调用交给Linux内核来处理。

从上面的调用过程就能够看出,Java只是位于Android最上面的一层编程接口,而没有这一层编程接口Android也是能够正常运行的。咱们知道,Android除了提供SDK外,还提供有NDK。也就是说,咱们彻底能够不使用SDK,而是经过NDK提供的接口绕过Java Runtime Framework,直接将请求交给C/C++Runtime Framework处理。

至于Android系统使用的Linux内核,其实与传统的Linux内核并没有多大区别,甚至能够当作是同样的。要说真的区别,就是有两点。一是Android在传统的Linux内核中以模块的形式加入了一些专用的驱动,例如日志驱动Logger、匿名共享内存驱动Ashmem、进程间通讯驱动Binder。二是Android系统将在传统的Linux内核实现的硬件驱动程序划分红了两部分,一部分在内核实现,另外一部分在用户空间实现,也就是咱们常说的硬件抽象层HAL。Android系统之因此要这样划分,是出于商业考虑,而不是技术考虑。由于Linux内核使用的GPL许可协议,驱动所有放在内核实现就意味着须要所有开源代码,而用户空间使用的是Apaache License,能够不开源代码。经过这种方式,就能够保护厂家的商业利益,由于这些代码一般都会包含有硬件的相关参数。

CSDN:Android系统层次结构是怎样的?各个层之间关系是什么?

罗升阳:上面也提到了Android系统的层次,详细一点说,就是:Android = Linux Kernel + C/C++ Runtime Framework + Davik Virtual Machine + Java Runtime Framework + Java SDK。下面咱们再以APK的开发、编译、安装和运行来讲明这些层次之间的关系。

首先,咱们是在PC上使用Android SDK提供的接口来开发APK,用的Java语言。开发完成以后,使用Java编译器将源代码编译成Java字节码,也就是带.class后缀的文件。接下来这些.class再被Android SDK提供的dx工具转化成Dex字节码,最后打包在APK里面的classes.dex文件中。

接着,APK文件在手机上安装时,Java Runtime Framework里面的PacakgeManagerService就会对该APK文件进行解析,而且经过Socket IPC通知C/C++ Runtime Framework里面的installd守护进程对APK里面的classes.dex文件进行优化,获得另一个classes.odex文件。

APK安装完成以后,就能够运行了。咱们以APK从桌面Launcher启动的过程为例说明它的运行过程。当咱们从Launcher点击应用图标的时候,Launcher向Java Runtime Framework里面的ActivityManagerService发送一个启动应用的请求。ActivityManagerService又经过Socket IPC向C/C++ Runtime Framework里面的zygote守护进程请求建立一个应用程序进程。这个应用程序进程包含有一个Dalvik虚拟机。应用程序进程建立而且启动起来以后,就会经过它里面的Dalvik虚拟机加载前面提到的classes.odex文件。这样咱们的应用程序就运行起来了。

APK的运行过程是依赖于Dalvik虚拟机的。咱们能够将它当作是将classes.odex里面的字节码解释成本地机器指令执行。例如,咱们在APK里面经过FileInputStream或者FileOutputStream打开一个文件的时候,Dalvik虚拟机就会找到C/C++ Runtime Framework里面的C库bionic提供的系统接口open,而且经过它来打开指定的文件。

咱们再以应用程序界面的绘制和渲染过程来详细说明各个层次的关系。首先是应用程序经过SDK提供的UI类向Java Runtime Framework里面的WindowManagerService申请分配一块图形缓冲区。WindowManagerService又是经过Binder IPC向C/C++ Runtime Framework里面的SurfaceFlinger申请分配图形缓冲区的。图形缓冲区实际上不是由SurfaceFlinger分配的,而是由显示系统分配的,可能在显存里面,也有可能在GPU里面。这时候SurfaceFlinger就要经过HAL层次Gralloc模块向Kernel里面的显卡或者GPU驱动申请分配真正的图形缓冲区。HAL层能够看做是运行在C/C++ Runtime Framework中。

应用程序得经过上述方式获得绘制UI所须要的图形缓冲区以后,就开始绘制本身的UI了。假设应用程序使用的是硬件绘制方式,也就是经过C/C++ Runtime Framework里面的OpenGL来绘制。这时候SDK的UI类的与绘制相关的函数调用经过Dalvik虚拟机都转化成了C/C++ Runtime Framework里面的OpenGL操做。

应用程序UI绘制完成以后,结果就保存上述的图形缓冲区中。这时候若是要将该图形缓冲区渲染到手机屏幕上,那么还须要经过Binder IPC将该图形缓冲区发送给C/C++ Runtime Framework里面的SurfaceFlinger。SurfaceFlinger经过使用OpenGL或者HWComposer将全部请求要渲染到手机屏幕上的图形缓冲区合成以后,获得一个主图形缓冲区。最后这个图形缓冲区又会被SurfaceFlinger提交给Kernel的显卡驱动,而且在手机屏幕上进行显示。

上面描述的就是Android系统各个层次的调用关系。总的来讲,应用程序运行在Dalvik虚拟机上,而且经过SDK使用Java Runtime Framework里面的服务,而Java Runtime Framework里面的服务又经过C/C++ Runtime Framework里面的服务来实现本身的功能,最后C/C++ Runtime Framework里面的服务又会在须要的时候请求Kernel里面的模块或者驱动来为本身服务。

CSDN:Andriod能够说是开源的代名词,一些开发者为了保护本身的成果进行加密,而另外一些开发者为了学习,须要进行APK反编译,能够分享下您对加密和反编译的见解吗?

罗升阳:严格来讲,Android系统是开放不是开源。Linux内核才是严格意义上的开源。只要是运行在Linux内核里面的代码,均可以要求做者将代码开源出来。可是运行在Android系统用户空间的代码,做者就不须要将它们开源出来了。这些代码包括厂商对Android官方源码的修改,以及本身增长的代码,还有第三方为之开发的APK代码等。这是因为Linux内核使用的是GPL许可协议,而Android系统的用户空间代码使用的Apache许可协议。

我以为不管是开发者为了保护本身的成果而对APK进行加密,仍是另外一些开发者为了学习而反编译别人的APK,都是无可厚非的。固然前提是不要利用这些技术去作坏事,不然的话,就是违反法律的事情了。加密和反编译其实是一种技术竞争关系。咱们都知道,竞争实际上是能够推动技术进步的,而技术进步的最终结果对用户是有好处的。

我在这两个讲《Android安全机制》和《APK防反编译技术》的PPT中,有描述过经过DEX和SO加壳、添加非法指令、隐藏敏感代码和伪APK加密技术等办法来保护代码的方法。然而,再厉害的保护技术,只要计算机知识牢固,而且有足够的耐心,再加上一些工具,例如apktool和ida,都是够破解的。固然,在别人破解了你如今的保护技术以后,你能够再发明另外的技术来保护本身的代码。这就是技术竞争,比的是各自的技术水平。

CSDN:深刻理解框架层,须要具有哪些知识?对于开发应用具体有什么好处?而开发者在学习这一过程当中应注意哪些问题?

罗升阳:从上面对Android系统的描述能够知道,要学入去学习Android系统的框架,须要具有的知识是很多的。

从语言层面来讲,须要掌握C、C++、Java,甚至还有汇编。

从系统层面来讲,须要有Linux内核基础,包括进程管理、内存管理、文件系统等,还须要掌握Android的HAL、C/C++ Runtime Framework、Java Runtime Framework和Davivk等。

虽然应用开发者平时不用接触系统方面的东西,可是若是可以深刻理解Android的框架层,好处是不言而喻的。

首先,能够提升能力和拓宽眼界。由于要看得懂Android系统的代码,要求了解不少知识。要了解这么多的知识,又须要不断地去学习。在学习的过程当中,能力和眼界就会天然获得提升和拓宽。

其次,能够正确地使用SDK接口。学习SDK接口,咱们通常是经过阅读SDK文档。可是这些SDK文档只是告诉你它们是怎么用的,没有告诉你它们是怎么实现的。若是咱们既知道一个SDK接口是怎么用的,又知道它是怎么实现的,那么用起来确定会得心应用不少。并且在使用出错的时候,也能迅速地经过检查它的实现代码来定位缘由。

再者,能够有效地解决BUG。当程序运行出错的时候,系统除了会输出异常信息或者Crash信息以外,一般还有伴随着一些错误日志输出。每每这些系统输出的错误日志包含很丰富的信息,告诉究竟是哪些地方出错了。可是这些错误日志是由系统输出的,它们的含义以及输出条件都是由系统定义的。这时候若是要理解究竟是什么地方出错了,那就得对系统有必定的理解,甚至须要找到输出这些日志的系统代码来阅读一下。

总之就是技多不压身,学到的东西都是本身的,之后靠这些技术赚到的钱也是本身的。可是前面讲到,要学入理解Android系统,须要具有的知识是不少的。基于这个缘由,应用开发者最须要注意的问题就是不要被这个问题吓退。实际上是没有人与生俱来就具有这些知识的,并且知识是无究无尽的,活到老就能够学到老。因此必定要坚持学习,一点一滴的积累,哪些不懂就补哪里。开始学慢一点没有关系,等积累到必定程度的时候,就会发现本身的学习能力呈加速度趋势。

CSDN:移动互联网现在发展得如火如荼,Android在其中占居着重要的角色,其发展众说纷纭, 你如何看待Android的将来?

罗升阳:Android的发展问题,无非就是与iOS相比,孰优孰劣的问题。目前在移动互联网上,还找不到第三个能够与Android和iOS抗衡的系统。Android与iOS相比,不少人无非就是以为:

1. Android UI不够流畅;
2. Android不够安全;
3. Android更耗电;
4. Android兼容性差。

刚开始的时候,Android UI与iOS相比,流畅性的确是差不少。一方面是由于Android手机良莠不齐,有些在硬件配置上确实不如iOS。另外一方面确实是Android系统自身的问题。可是咱们看到自3.0以来,Android就一直在增强UI流畅性进行努力。Android在3.0在应用程序进程这一侧,容许使用硬件绘制UI。在4.1的时候,又经过Project Butter计划,极大地提升了UI的流畅性。到了L版本,又用ART代替了Dalvik,这意味着应用程序运行时执行的是本地机器指令,而再也不是虚拟机机指令,性能将获得极大的提高。总之,目前在同等硬件配置下,Android的UI流畅性与iOS相比,差距是愈来愈小了。咱们期待ART代替Dalvik以后,二者能够不相伯仲。

关于安全问题,iOS也有自身的安全问题,例如,每次iOS版本升级后,不也是有人很快就发布了越狱工具吗?同时咱们也看到,Android在4.3版本,引进了SEAndroid,用来增强其安全性。SEAndroid是美国国家安全局(NSA)在SELinux的基础上专门为Android系统开发的,用来保证系统即便在被root的状况下,也能最大限度地保护用户手机的安全。另外一方面咱们也看到,因为Android系统是开放的,有不少第三方的安全公司,例如Bluebox,积极地帮忙发现漏洞,以即可以及时进行修复。

加密算法有一个Kerckhoffs原则:秘密寓于密钥。意思就是说一个密码系统的安全性,应该仅仅依靠“密钥没有泄漏”这个前提。即便整个系统落到了敌人的手里,敌人了整个系统的全部细节,可是若是敌人不知道密钥,你的传输仍是安全的。不管是在战争仍是和平时期,不能把保密的但愿寄于系统/算法的保密性,由于机械的能够拆解,软件的能够看汇编。在这一点上,非公开算法和公开算法的区别就体现出来了:公开算法受全世界的密码学者研究,经受得考验;非公开算法只有除了做者外别人都不知道,可能有很好的***可是做者没有发现。我想因为Android系统是开源的,而iOS系统是闭源的,它们的安全性之间的比较能够类比于公开和非公开的加密算法安全性比较。

至于Android的耗电问题,很大程度是由应用程序引发的。因为某些缘由,Google官方提供的统一推送服务不能在国内使用,致使了每个须要网络推送的应用程序都自已在后台启用了一个服务,定时地检查服务器有没有新的通知。即便是手机已经休眠了,也会对其进行唤醒进行检查。这就形成了电量很是大的消耗。iOS有统一的推送服务,而且不容许应用本身设计一套推送服务,所以就能够保证电池的优化使用。为了必定程度上解决这个问题,Android在L版本提供了Job Scheduler服务,用来对齐应用对设备的唤醒,以达到优化电池使用的目的。

至于Android的兼容性,是因为Android系统的开放性形成的。各个厂商均可以将Android源码拿过来进行修改,而且跑在硬件配置各不相同的手机上,所以就形成在一个手机上运行得很好的程序,到了另一个手机上就可能会出现问题。

归结来说,Android的耗电问题和兼容性问题,很大程度都是因为Android的开放性致使的。然而,Android的开放性也正是它的优势所在。回想起上个世纪末期,苹果计算机与IBM兼容PC之争,咱们就会发现,IBM兼容PC正是靠开放性战胜了苹果计算机。固然,今时不一样往日,今天依然闭源的iOS和开放的Android,二者除了在手机以外,在车载、穿戴式设备、智能家居方面,也都展开全面的竞争,鹿死谁人还不知。可是,咱们如今看到的是,不少创业者,想要作本身的智能设备时,第一时间想到的确定是使用Android系统。这说明Android系统有群众基础。咱们指望众人拾柴火焰高,Android的发展愈来愈好。

CSDN:对于Android开发的学习者,他们如何在竞争如此激烈的移动互联网环境中提高本身的核心竞争力呢?另外,你能推荐一些书给他们吗?

罗升阳:要在激烈的移动互联网环境中提高本身的核心竞争力,关键仍是要提到本身的技术水平,最佳的途经就是持续的不断学习。学习既要有广度,又要有深度。本身感兴趣的知识,必定要深刻去研究。其它相关的知识,也要尝试去有必定的了解。

关于学习这个话题,有些人以为如今用不到的东西就没有必要去学习,不然就太浪费时间了。其实,不少东西等到要用到的时候再去学,就太迟了。要知道,咱们经过学习用到的东西,虽然不会直接反应在咱们如今工做的内容上,可是也会潜默移化地响应着咱们思考方式,把咱们往好的方向推进。还有的就是,咱们学的全部东西都不会白白浪费的,总有一天都会派上用场的,特别是在当今十年河东十年河西的科技时代。十年前,火的是传统互联网;十年后,轮到移动互联网上场;再过五年或者十年呢?谁都不知道会怎么样,可是只要咱们有技术在手,就能积极拥抱变化。毕竟从技术层面讲,不管时代怎么变化,核心的东西都相通的。

要推荐的书,我在《那两年炼就的Android内功修养》这篇文章中有提到,这里再列一下出来:

语言类:

  • 《深度探索C++对象模型》,对应的英文版是《Inside C+++ Object Model》

  • 程序编译、连接、加载类:

  • 《连接器和加载器》,对应的英文版是《Linker and Loader》

  • 《程序员的自我修养:连接、装载和库》

操做系统类:

  • 《Linux内核设计与实现》,对应的英文版是《Linux Kernel Development》

  • 《深刻理解Linux内核》,对应的英文版是《Understanding the Linux Kernel》

  • 《深刻Linux内核架构》,对应的英文版是《Professional Linux Kernel Architecture》

  • 《Linux内核源代码情景分析》

网络类:

  • 《Linux网络体系结构:Linux内核中网络协议的设计与实现》,对应的英文版是《The Linux Networking Architecture: Design and Implementation of Network Protocols in the Linux Kernel》

  • 《深刻理解LINUX网络技术内幕》,对应的英文版是《 Understanding Linux Network Internals》

设备驱动类:

  • 《Linux设备驱动程序》,对应的英文版是《Linux Device Drivers》

  • 《精通Linux设备驱动程序开发》,对应的英文版是《Essential Linux Device Drivers》

虚拟机类:

  • 《Java SE 7虚拟机规范》

  • 《深刻Java虚拟机》,对应的英文版是《Inside the Java Virtual Machine》

  • 《Oracle JRockit: The Definitive Guide》

嵌入式类:

  • 《嵌入式Linux开发》,对应的英文版是《Embedded Linux Primer》

  • 《构建嵌入式Linux系统》,对应的英文版是《Building Embedded Linux Systems》

ARM体系架构类:

  • 《ARM嵌入式系统开发:软件设计与优化》,对应的英文版是《ARM System Developer's Guide: Designing and Optimizing System Software》

综合类:

  • 《深刻理解计算机系统》,对应的英文版是《Computer Systems: A Programmer's Perspective》

同时,我本身也是处于不断的学习中,平时也会看其它比较多的书,你们有兴趣的话,能够关注个人新浪微博(@罗升阳),上面有不定时的推荐。

CSDN:你在CSDN的社区中具备着极高的人气,博客专栏“老罗的Android之旅”受到你们的追捧,当初你为什么选择写博客?写博客给你带来了什么好处?

罗升阳:当初选择写博客,是写给本身看的,当笔记用。不然若是什么都不写的话,研究过的东西很快就忘记了。直到如今,在须要的时候,我都会去翻本身的博客。随着博客读者愈来愈多,博客就再也不是给本身当笔记用了,仍是一个用来学习交流分享知识,以及结识志同道合的朋友的场所。

不过,我以为最重要的是,经过发表博客文章,可让对我Android的研究更加严谨、更加详细、更加系统。由于天天这么多读者浏览你的文章,你就必需要保证文章的质量,不然的话就会误人子弟,也会毁了本身的名声。为了写出有质量的文章,就必需要严谨、详细和系统地去研究Android系统的代码。所以,写博客和研究Android是一个相互促进的过程。

CSDN:你是何时接触CSDN的?它对你学习和工做都带来哪些影响?同时,对CSDN有什么建议?

罗升阳:在写博客以前,实际上是比较少接触CSDN。2011年6月决定要经过博客来记录本身研究Android的历程时,也尝试过找其它的博客网站来写文章。最后发现CSDN文章贴的代码显示格式用户体验挺好的。因而就决定使用CSDN博客了。

CSDN对学习和工做的影响,最主要的就是它让我用严谨、详细、系统的方法去研究Android,从而也使得我对Android系统的理解更加深刻。

对CSDN的建议,就是但愿CSDN能够增强稳定性,之前时不时都会出现访问不了的状况,不过最近半年状况好像是好一些了。另一个是增强对移动端的用户体验。我看到最近CSDN增长了对移动端的支持,不过在浏览我的博客时,看不到博主的相关信息,例如浏览量、积分、排名和评论等。有时候想看看有没有新的评论须要回复,看不到就麻烦的,没法与读者进行交流,并且又不能切换回PC端模式。

相关文章
相关标签/搜索