如何系统的学习Linuxandroid系统移植和驱动开发发

Android嵌入式底层开发课程

熟悉.NET,J2EE应用开发,希望往嵌入式底层学习的工程师

熟悉Android应用和框架开发,希望从上到下走通Android系统的工程师

不希望局限在上层,希望做驱动,做系统移植的工程师

基础良好的在读研究生或者即将毕业的应届毕业生

有手机硬件维修基础,希望走向软件开发的特殊爱好者

课程掌握后的能力值概述(技能目标)

再次复习操作系统原理,编译原理,数据结构,电路基础,数控模电知识

熟练掌握Linux操作系统使用,包括命令,Shell,系统配置

熟练进行Linux下应用编程及系统调用

掌握ARM体系结构以及基础裸板开发,Bootloader开发

掌握Linux内核原理,熟悉Linux系统开发,内核裁减,调试 。

掌握Linux常用接口驱动开发及系统移植

掌握Android常用驱动开发及系统移植

课程掌握后的职业定位(职业目标)

学完后具备相当于1-2年Linux及Android底层开发的经验

国内首套Android底层开发视频课程

吸取了目前主流嵌入式培训课程的长项,摒弃了虚的东西,试图打造为国内最好的嵌入式课程

还是本着深入浅出,剖析原理的风格 ,不仅仅讲操作,重在理解及自我创新

学完后具备相当于1-2年Linux及Android底层开发的经验


把linux在arm开发板上进行定制,并在arm开发板上运行起来。
更好地理解linux的构架过程。

驱动开发是在系统运行起来后,在内核中增加一些驱动子功能而已。


1、arm裸机程序系统结构图

ARM裸机程序系统结构图

硬件层:硬件工程师决定硬件放在哪个资源。如,是在GPA口,GPH口,还是GPG口。

驱动层:驱动工程师根据硬件的架构,把驱动的资源用代码去指向,比如C语言的指针去指向相应的资源;硬件需要什么样的高/低电平或组合的数据,让其工作,是由驱动层封装的。

应用层:根据传递的不同的值,来得到不同的结果。

耦合性太强,一旦一层发生改变, 其他层都会变。

2、类android等复杂功能系统结构图

为了解决上述问题,引入一个概念:OS;引入一层:kernel层。

可以让应用层程序员解放出来,不用关心底层。
同时,也可以进行资源管理、多进程多线程管理等。

类android等复杂功能系统结构图

驱动与内核:驱动把支持的设备向内核报告,内核根据传来的信息,会调用不同的驱动程序,来控制相应的硬件。

它们可以认为是一个整体,都属于底层软件的范围。

通过分层,可以实现软件复用性、可移植性。而且不同模块解耦。

不是分层越多越多,分层越多,速度也越慢。


系统一上电会运行一个程序:bootloader(启动加载),目的是load kernel。

可以做很多种方案的选择。
很多大型项目中,更多是选择适合项目的启动加载代码,然后再改改(移植)。
很多时候,买芯片的时候,芯片厂商就已经提供好了。

kernel的配置、编译、移植和调试

给用户用,还得提供文件系统。

这4个就是整个系统移植的精髓。


先整体后局部,层层推进。

每个子系统是如何编译的 ---> 在基本功能下,如何添加命令或功能 ---> 如何自定义自己的开发板,与自己的开发板具体硬件相联系

每个子系统都具有一个复杂的层次关系。
所以要先掌握整体,需要首先掌握相关子系统的藏宝图,有了这个地图,去探索它就有了方向。


四、系统移植的基本步骤

拿到一块板子,如何让整个系统跑起来呢?

1、确定目标机(开发板,客户端)和主机(PC,开发机器,服务端)的连接方式

主机性能会比目标机好太多,因此一般在主机开发,把主机编译好的内容数据传输给目标机。

(1)UART异步串行通信接口 (串口)
它是非常经典的与PC机通信的接口。

  • 功能很强大,既可以输入,也可以输出,比较万能。
  • 实用性强(90%的板子都支持)

缺点:速度比较低,效率比较差。
大文件一般不用串口传输,小文件可以。

(2)USB串行通信接口

缺点:USB的驱动要移植修改。
板子刚刚上电,就让串口工作,是不现实的。

(3)TCP/IP网络通信接口

TCP/IP已经很成熟了。开发板与PC可以以C/S模式进行数据的传输和下载。比较通用。而且网卡的速率也比较快,最少10M,100M网卡也很多。

通过网络接口去下载数据的情况很多。

方便快捷,但价格很高,很少使用。

PC的cpu架构是X86,X86程序和arm程序不兼容,因此需要交叉编译器。

(1)安装芯片厂商已经编译好的工具链

这个非常老了。很少见到了。

第二列:厂商名。开源的话,一般是none

第三列:该编译器默认编译出来的功能是针对linux操作系统去用的。
这个编译器内部有些标准C库,是与linux系统相关的。

eabi:嵌入式的标准调用接口。针对嵌入式精简的相关库。

自动动手编译非常耗时,而且会报很多不兼容的问题。调试需要功力,对编译原理要理解的很清楚。很多公司都不会去做。不建议使用该方法。

思路其实比较单一,唯一的不好是版本间的依赖关系比较大。

3、搭建主机-目标机数据传输通道

比如用网络,则需要网络相关服务器的配置。

一般嵌入式中,用的比较多的服务:

  • TFTP :基于UDP协议传输的,是FTP的简版。UDP比FTP简单。
  • NFS:网络文件系统。目的是linux与linux之间挂载用的。
    文件系统的调试,很多时候用NFS作为调试的工具。

整个进行集成,然后放到工厂进行集成化生产就可以了。


主机中的数据 如何传递 到开发板?

目的1:普通数据的传递:比如,uboot,kernel。
主要目的就是为了传递。
UART很少使用,更多使用的是网络接口。最主要的使用方式是TFTP服务。

uboot会通过其他方式烧写(当然网络接口也可以传输。看开发环境来决定。)

目的2:调试:主机的一块内存空间,直接挂载在板子上。

在x86上调好,再放到板子上。
但是,有可能调试不是很顺利,因此需要开发板与PC间建立更合理、方便的解决方案。

不能在板子上直接调试,就是因为板子容量太小。
要想办法扩大板子空间,但是flash太贵。

板子可以外挂很大空间的存储器,比如U盘。
但是U盘很麻烦,插开发板上,完了还得拔下来插PC上。

思路:调试时,不一定非要进行网络传输。只需要把数据挂到板子上就可以了。

办法:通过网线把共享的数据块(当作USB),通过TCP/IP来传。
共享的数据库就在PC上。

调试起来更加方便,PC上的修改板子上就可以直接看到了,不需要进行更多的数据传输了。

调试内核驱动、应用程序,很多时候是借助这种方式,在PC上进行软件开发,然后直接在板子上进行验证。


六、笔记本移植环境搭建

串口:连接方式方便,驱动简单。
少数据量的东西,会用串口。
标准输入/输出,会定位到串口驱动上。

笔记本都是USB接口,而开发板要用串口,因此要买USB转串口

如何排查目标机与主机的各层是否通了?

  • 传输层:主要是端口port没有开放。要不就是服务器开放端口不对或未开放端口,或者客户端访问的端口不对。
  • 网络层:通过ping看看在不在一个局域网段。
  • 物理层:查看插上的网卡灯有没有亮。

Android_驱动开发与移植实战详解-李骏_陈小玉.pdf

简介:本文档为《Android_驱动开发与移植实战详解-李骏_陈小玉pdf》,可适用于IT/计算机领域,主题内容包含第第章章迅迅猛猛发发展展的的AAnnddrrooiidd系系统统Android(安卓)是IT巨头谷歌公司推出的一款手机系统是建立在Linux内核基础符等。

第第章章迅迅猛猛发发展展的的AAnnddrrooiidd系系统统Android(安卓)是IT巨头谷歌公司推出的一款手机系统是建立在Linux内核基础之上的能够迅速建立手机软件的解决方案。Android的功能十分强大作为一个新兴的热点已经成为了软件行业中的一股新兴力量。据市场数据统计Android系统已经成为当今市场占有率第一位的智能手机系统。本章将简单介绍Android的发展历程和背景让读者了解Android的辉煌之路。智能手机世界智能手机是指具有像个人电脑那样独立的操作系统用户可以在上面安装自己需要的第三方软件或游戏程序并且可以通过移动通信网络接入无线网络。在Android系统诞生之前已经有很多优秀的智能手机产品例如家喻户晓的Symbian(塞班)系列和微软的WindowsMobile系列等。何谓智能手机当今公认的智能手机必须具备下面的功能标准:()操作系统必须支持新应用的安装()高速度处理芯片()支持播放式的手机电视()大存储芯片和存储扩展能力()支持GPS导航。后来手机联盟制定了一个标准在该标准中列出了智能手机的如下主要特点:()具备普通手机的全部功能例如可以进行正常的通话和发短信等手机应用()是一个开放性的操作系统在系统平台上可以安装更多的应用程序从而实现功能的无限扩充()具备上网功能()具备PDA的功能实现个人信息管理、日程记事、任务安排、多媒体应用、浏览网页()可以根据个人需要扩展机器的功能()扩展性能强并且可以支持很多第三方软件。当前主流智能手机系统当今最主流的智能手机系统有微软的WindowsPhone系列、塞班系列、PDA、黑莓、苹果的iOSAndroid驱动开发与移植实战详解和本书的主角Android。.微软的WindowsMobileWindowsMobile是微软公司的一款杰出产品WindowsMobile将熟悉的Windows桌面扩展到了个人设备中。使用WindowsMobile操作系统的设备主要有PPC手机、PDA、随身音乐播放器等。WindowsMobile操作系统有三种分别是WindowsMobileStandard、WindowsMobileProfessional、WindowsMobileClassic。当前的最新版本是WindowsPhoneWindowsPhone也即将发布。.塞班系统塞班系统Symbian是一款久负盛名的手机系统最初是由诺基亚、索尼爱立信、摩托罗拉、西门子等几家大型移动通信设备商共同出资组建的一个合资公司职责是专门研发手机操作系统。Symbian有着良好的界面采用内核与界面分离技术对硬件的要求比较低支持C、VisualBasic和JME。目前根据人机界面的不同Symbian体系的UI(UserInterface用户界面)平台分为Series、Series、Series、UIQ等。其中Series主要是给数字键盘手机用Series是为完整键盘所设计Series则是为触控笔方式而设计。年月诺基亚宣布将从年月起从Symbian基金会(SymbianFoundation)手中收回Symbian操作系统控制权。.PalmPalm是流行的个人数字助理(PDA又称掌上电脑)的传统名字。从广义上讲Palm是PDA的一种是Palm公司发明的。而从狭义上讲Palm是Palm公司生产的PDA产品区别于SONY公司的Clie和Handspring公司的VisorTreo等其他运行Palm操作系统的PDA产品。其显著特点之一是写入装置输入数据的方法能够点击显示器上的图标选择输入的项目。年月日Palm公司CEOEdColligan宣布以后将专注于WebOS和WindowsMobile的智能设备而将不会再有基于“PalmOS”的智能设备推出除了PalmCentro会在以后和其他运营商合作时继续推出。.黑莓BlackBerryBlackBerry是加拿大RIM公司推出的一种移动电子邮件系统终端其特色是支持推动式电子邮件、手提电话、文字短信、互联网传真、网页浏览及其他无线资讯服务其最大优势在于收发邮件。.iOSiOS是苹果手机产品iPhone的操作系统iPhone是一款手机产品由苹果公司在年月日举行的Macworld宣布推出并在年月日在美国上市。IPhone实现了将创新的移动电话、可触摸宽屏iPod以及具有桌面级电子邮件、网页浏览、搜索和地图功能的突破性因特网通信设备这三种产品完美地融为一体。每一件iPhone产品都是一件艺术品无论是外观还是品质和性能都拥有超高的人气。推出的每一款新iPhone都马上成为市面智能手机的标杆。在年月日推出了当前最新的iPhoneS。第章迅猛发展的Android系统.AndroidAndroid是本书的主角是一款基于Linux内核的开源手机操作系统的名称该平台由操作系统、中间件、用户界面和应用软件组成号称是首个为移动终端打造的真正开放和完整的移动软件。Android的自身优势Android采用了WebKit浏览器引擎具备触摸屏、高级图形显示和上网功能用户能够在手机上查看电子邮件、搜索网址和观看视频节目等同时Android还具有比iPhone等其他手机更强的搜索功能可以说是一种融入全部Web应用的平台。正是因为其特有的巨大优势在年下半年Android规模便超越了苹果iPhone大有一统手机系统之势!并且终于在年超越了塞班成为市场占有率最高的智能手机系统。开源Android出身于Linux世家是一款开源的手机操作系统。Android功成名就之后各大手机联盟纷纷加入这个联盟由包括中国移动、摩托罗拉、高通、宏达电子和TMobile在内的多家技术和无线应用的领军企业组成。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系希望借助建立标准化、开放式的移动电话软件平台在移动产业内形成一个开放式的生态系统。强大的开发团队支持Android的研发队伍阵容强大包括摩托罗拉、Google、HTC(宏达电子)、PHILIPS、TMobile、高通、魅族、三星、LG以及中国移动在内的家企业。它们都将基于该平台开发手机的新型业务应用之间的通用性和互联性将在最大程度上得到保持。并且还成立了手机开放联盟联盟中的成员由手机制造商、半导体公司和软件公司组成具体名单如下。.手机制造商台湾宏达国际电子(HTC)(Palm等多款智能手机的代工厂)摩托罗拉(美国最大的手机制造商)韩国三星电子(仅次于诺基亚的全球第二大手机制造商)韩国LG电子中国移动(全球最大的移动运营商)日本KDDI(万用户)日本NTTDoCoMo(万用户)美国SprintNextel(美国第三大移动运营商万用户)意大利电信(TelecomItalia意大利主要的移动运营商万用户)西班牙Telefónica(在欧洲和拉美有亿用户)TMobile(德意志电信旗下公司在美国和欧洲有亿用户)。.半导体公司AudienceCorp(声音处理器公司)BroadcomCorp(无线半导体主要提供商)英特尔(Intel)MarvellTechnologyGroupNvidia(图形处理器公司)SiRF(GPS技术提供商)Synaptics(手Android驱动开发与移植实战详解机用户界面技术)德州仪器(TexasInstruments)高通(Qualcomm)惠普HP(HewlettPackardDevelopmentCompanyLP)。.软件公司AplixAscendereBay的SkypeEsmertecLivingImageNMSCommunicationsNoserEngineeringAGNuanceCommunicationsPacketVideoSkyPopSonixNetworkTATTheAstonishingTribeWindRiverSystems。实行奖励机制安卓(Android)为了提高程序员的开发积极性不但为其提供了一流硬件的设置还提供了一流的软件服务。并且采取了振奋人心的奖励机制定期召开比赛创意和应用夺魁者将会得到重奖。.开发Android平台的应用在Android平台上程序员可以开发出各式各样的应用。其中Android应用项目是通过Java语言开发的只要具备Java开发基础就能很快地上手并掌握。作为单独的Android开发Java编程门槛并不高即使没有编程经验的门外汉也可以在突击学习Java之后而学会Android。另外Android完全支持D、D和数据库并且和浏览器实现了集成。所以通过Android平台程序员可以迅速、高效地开发出绚丽多彩的应用例如常见的工具、管理、互联网和游戏等。.奖金丰厚的Android大赛为了吸引更多的用户使用Android开发已经成功举办了奖金为万美元的开发者竞赛。鼓励开发人员创建出有创意的实用软件。这种大赛对于开发人员来说不但能练习自己的开发水平并且有机会获得高额的奖金。.在AndroidMarket上获取收益AndroidMarket地址是http:wwwAndroidcommarket。为了能让Android平台吸引更多的关注谷歌开发了自己的Android软件下载店AndroidMarket允许开发人员将应用程序在上面发布也允许Android用户随意下载获取自己喜欢的程序。开发者需要申请开发者账号有账号后才能将自己开发的作品上传到AndroidMarket并且可以对自己的软件进行定价。只要开发的软件作品足够吸引人就可以获得好的金钱回报。认识驱动驱动是硬件和软件之间的媒介和载体是计算机等电子产品运行的根本。生活中总会遇到这样的场景:买了一个新USB鼠标插在电脑上后会提示安装新的驱动买了一台新的打印机也需要安装驱动后才能使用。驱动含有推动和发动之意计算机领域中的驱动也含有推动之意。当我们在电脑中安装新硬件时总会被要求放入“这种硬件的驱动程序”。其实在Windows系第章迅猛发展的Android系统统中在安装主板、光驱、显卡、声卡这些硬件产品时都对应着一套完整的驱动程序。如果需要外接别的硬件设备也还需要安装相应的驱动程序例如外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序外接打印机要安装打印机驱动程序上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。和Windows系统一样在Android手机中也经常需要使用一些外部硬件设备例如蓝牙耳机、存储卡和摄像头。要想使用这些外部辅助设备也需要安装对应的驱动程序。驱动程序是添加到操作系统中的一段代码通常这段代码比较简短但是在里面包含了和硬件相关的设备信息。有了这些信息计算机就可以与设备进行通信从而使用这些硬件。驱动程序是硬件厂商根据操作系统编写的配置文件可以说没有驱动程序计算机中的硬件就无法工作。操作系统不同对应的硬件驱动程序也不同。硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断更新、升级驱动程序例如显卡芯片公司Nvidia平均每个月会升级驱动程序到次。驱动程序是硬件的一个构成部分当我们安装新的硬件时也必须安装对应的驱动程序。凡是安装一个原本不属于我们电脑中或手机中的硬件设备时系统就会要求你安装驱动程序将新的硬件与电脑或手机系统连接起来。驱动程序在此扮演了一个沟通的角色负责把硬件的功能告诉电脑系统并且也将系统的指令传达给硬件让它开始工作。手机中的驱动和电脑中的驱动一样当在手机中使用数据线、蓝牙、红外等连接方式连接电脑时在一般情况下需要驱动程序。而且在一部分手机中通过数据线、蓝牙、红外方式连接电脑后还需要软件才能传输数据到电脑或者传输数据到手机。此时可以使用购买手机时的随机光盘中的驱动程序解决问题驱动程序也可以在手机网站或论坛上下载。分析Android架构Android作为一个移动设备的平台其软件层次结构包括操作系统(OS)、中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图其软件层次结构自下而上分为以下层。()操作系统层(OS)。()各种库(Library)和Android运行环境(RunTime)。()应用程序框架(ApplicationFramework)。()应用程序(Application)。上述各个层的具体结构如图所示。操作系统层(OS)Android使用Linux作为操作系统Linux是一种标准的技术Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分Android的Linux核心为标准的Linux内核Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动如下所示。y显示驱动(DisplayDriver):常用基于Linux的帧缓冲(FrameBuffer)驱动。yFlash内存驱动(FlashMemoryDriver):是基于MTD的Flash驱动程序。y照相机驱动(CameraDriver):常用基于Linux的vl(VideoforLinux)驱动。Android驱动开发与移植实战详解y音频驱动(AudioDriver):常用基于ALSA(AdvancedLinuxSoundArchitecture高级Linux声音体系)驱动。主屏幕联系人电话浏览器……应用程序活动管理器窗口管理器内容提供器视图系统通知管理器包管理器本地管理器电话管理器资源管理器XMPP服务应用程序框架接口管理器包管理器包管理器包管理器位图及矢量浏览器引擎D图形引擎中间协议libc函数库库持久层库Dalvik虚拟机器Android运行环境显示驱动相机驱动蓝牙驱动Flash内存驱动BinderIPC驱动USB驱动键盘驱动WiFi驱动音频驱动能源管理Linux内核层图Android操作系统的组件结构图yWiFi驱动(CameraDriver):基于IEEE标准的驱动程序。y键盘驱动(KeyBoardDriver):作为输入设备的键盘驱动。y蓝牙驱动(BluetoothDriver):基于IEEE标准的无线传输技术。yBinderIPC驱动:Android一个特殊的驱动程序具有单独的设备节点提供进程间通信的功能。yPowerManagement(能源管理):管理电池电量等信息。各种库和Android运行环境本层次对应一般嵌入式系统相当于中间件层次。Android的本层次分成两个部分一个是各种库(Library)另一个是Android运行环境(RunTime)。本层的内容大多是使用C实现的。其中包含的各种库如下。yC库:C语言的标准库也是系统中一个最为底层的库C库是通过Linux的系统调用来实现的。第章迅猛发展的Android系统y多媒体框架(MediaFramework):这部分内容是Android多媒体的核心部分基于PacketVideo(即PV)的OpenCORE从功能上本库一共分为两大部分一部分是音频、视频的回放(PlayBack)另一部分则是音视频的纪录(Recorder)。ySGL:D图像引擎。ySSL:即SecureSocketLayer位于TCPIP协议与各种应用层协议之间为数据通信提供安全支持。yOpenGLES:提供了对D的支持。y界面管理工具(SurfaceManagement):提供了对管理显示子系统等功能。ySQLite:一个通用的嵌入式数据库。yWebKit:网络浏览器的核心。yFreeType:位图和矢量字体的功能。Android的各种库一般是以系统中间件的形式提供的它们均有的一个显著特点就是与移动设备的平台的应用密切相关。Android运行环境主要是指虚拟机技术Dalvik。Dalvik虚拟机和一般JAVA虚拟机(JavaVM)不同它执行的不是JAVA标准的字节码(Bytecode)而是Dalvik可执行格式(dex)中执行文件。在执行的过程中每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于JavaVM是基于栈的虚拟机(Stackbased)而Dalvik是基于寄存器的虚拟机(Registerbased)。显然后者最大的好处在于可以根据硬件实现更大的优化这更适合移动设备的特点。应用程序Android的应用程序(Application)主要是用户界面(UserInterface)方面的通常以Java程序编写其中还可以包含各种资源文件(放置在res目录中)。Java程序及相关资源经过编译后将生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)、浏览器(Brower)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。应用程序框架Android的应用程序框架(ApplicationFramework)为应用程序层的开发者提供API它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的因此本层次提供的首先包含了UI程序中所需要的各种控件例如View(视图组件)其中又包括了List(列表)、Grid(栅格)、TextBox(文本框)、Button(按钮)等甚至一个嵌入式的Web浏览器。一个基本的Andoid应用程序可以使用应用程序框架中的如下部分。yActivity(活动)。yBroadcastIntentReceiver(广播意图接收者)。yService(服务)。yContentProvider(内容提供者)。yIntentandIntentFilter(意图和意图过滤器)。Android驱动开发与移植实战详解开源的问题我们都知道Android是基于Linux内核的因为一直以来Linux是开源的所以基于Linux内核的Android也号称开源所以一经推出后就受到了广大程序员和手机厂商的青睐。但是在开源方面Android“半遮半掩”具体原因得从Android的发展历史谈起。雾里看花的开源在Android刚被推出的时候只能用Java语言开发应用程序这就需要所有的应用程序都运行在一个巨大的虚拟机上。在年月Android发布了NDK工具包这样就可以支持CC语言编程但是性能不如SKD工具包中的Java语言。年月LinuxKernel的维护者GregKroahHartman宣布将Android代码从LinuxKernel代码库中删除此事对于普通用户可能并没有什么影响但对于开发者尤其是开源社区的开发者来说算是一颗重磅炸弹。消息公布以后外界普遍觉得惊讶和可惜。好不容易才有了一个这么受欢迎的开源手机系统应该齐心协力共同开发才对为什么要“窝里斗”呢?到底是什么矛盾使得LinuxKernel小组剔除Android代码呢?从Linux版本开始Google智能手机操作系统Android核心代码全部被删除。这是因为提倡开源的Android在Linux面前使用了雾里看花的把戏它修改了Kernel内核但是又不提供修改的细节这相当于自己搞了一个封闭的系统。尽管Android取得了空前的成功但是Google也放弃了构建一个真正开源的手机系统的机会从而也就不能获得由全世界程序员提供智慧、分享代码和推动创新的好处。由此可见是因为Android的不真正开源所以才被从Linux体系中删除。Android与Ubuntu、Debian、Redhat等传统的Linux发行版相比只有系统的底层结构是一样的而其他东西在Android中都不一样尤其是程序员的编程接口是完全不同的。所以必须重新写Android应用程序后才能使用现存的Linux程序无法移植上去。由此可见Android是一种全新的系统它与Linux的距离有很远。从选择Java开始谈为什么不开源驱动程序()使用Java的好处。Android很好地解决了长期令手机制造商头痛不已的问题:在业界缺乏一个开源的Java虚拟机和统一的应用程序接口。使用Android后程序员只要编写一次程序就可以用在各种手机硬件平台之上。这就是Android应用程序使用Java语言开发的原因因为如果不这样做的话无法让程序实现和硬件无关。可能很多熟知Linux的读者会反问:传统的Linux系统也不依赖特定的硬件只要把源代码根据不同的平台分别编译同一个程序就可以在不同的硬件架构、不同的Linux发行版中使用。那么Android只采用Kernel、只允许用Java编程的真正原因到底是什么呢?()为什么驱动不开源。LinuxKernel的版权是GPL。在此版本下硬件厂商都希望自己的硬件能在LinuxKernel下第章迅猛发展的Android系统运行此时就必须使用驱动程序。但是如果把驱动程序的源码公开就等于公开硬件规格这是广大硬件厂商所不能接受的。所以硬件厂商只提供编好的驱动程序而不提供原始码。Android的重点是商业应用为了解决上述驱动开源的问题Google采用了自己的方法来绕过这个问题。Google把驱动程序移到“userspace”中即让驱动程序在LinuxKernel上面运行而不是一起运行这样就可以避过GPL规则。然后在Kernel开一个小门让本来不能直接控制到硬件的“userspace”程序也可以碰得到此时只需公布这个开的“小门”程序源码即可。由此可见Google在Kernel和应用程序之间设计了一个中间层这样既不违反GPL许可又能不让外界看到厂商的硬件驱动和应用程序的源码。()带来的问题。但是Google的上述做法随之带来了一个问题Kernel和Android采取不同的许可证Kernel采用GPL许可证而Android采用ApacheSoftwareLicense(简称ASL)许可证。在GPL许可证中规定对源码的任何修改都必须开源所以Android需要开源因为它修改了Kernel。而在ASL许可证中规定用户可以随意使用源码而不必开源所以建立在Android之上的硬件驱动和应用程序都可以保持封闭。这种封闭得到了更多硬件厂商的支持Google特意修改了Kernel使得原本应该包括在Kernel中的某些功能都被转移到了“userspace”中所以就避开了开源。()影响。Google的上述行为有利于推广Android并且可以吸引更多厂商和软件开发商的加入但是同时也宣布放弃了构建一个真正开源的手机系统的机会。所有为Android写的硬件驱动都不能合并到Kernel中因为它们只在Google的代码里才有效而在Kernel里根本没法用。对驱动开发者的影响所有为Android写的硬件驱动都不能合并到Kernel中。这些驱动程序只能在Google代码中有效而在Kernel中根本没法用。正是因为这个原因Google从不把大量的硬件驱动程序和平台源码提交给Kernel。既然硬件厂商都不开源驱动代码对于我们生存在Android底层的开发人员特别是从事驱动开发的成员来说就带来了巨大的就业机会。我们可以为硬件厂商开发不开源的驱动程序而获得报酬为此随着Android的异常火爆市面上有很多企业在招聘Android驱动开发人员。由此可见驱动的不开源给我们的学习带来了难题但同样也为以后的就业机会增加了砝码。

我要回帖

更多关于 android系统移植和驱动开发 的文章

 

随机推荐