精华内容
下载资源
问答
  • android 安卓系统

    千次阅读 2012-02-23 11:07:49
    Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用安卓(非官方)或安致(官方)。Android操作系统最初由Andy Rubin开发,最初主要支持手机。...
     
    

    Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用安卓(非官方)或安致(官方)。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%。

    中文名: 安卓、安致
    外文名: Android
    开发商: Google/开放手持设备联盟
    发行商: Google
    发行时间: 2008年9月23日
    编程语言: C/C++(底层) Java等(应用层)
    源码模式: 混合(自由免费,开放源码)
    包类型: APK
    支持平台: ARMMIPSx86
    内核类: 整块性核心(Linux)

    名称来源

      Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。

    版本

    命名规则

      Android用甜点作为它们系统版本的代号的命名方法开始于 Android 1.5 发布的时候。作为每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序:纸杯蛋糕甜甜圈松饼冻酸奶姜饼蜂巢冰激凌三明治,根据最新消息新一代Android版本将命名为果冻豆(Jelly Bean)。

    发行版本

      
    版本 备注
    Android1.1 2008 年9月发布的Android第一版
    Android 1.5
    Cupcake
    (纸杯蛋糕)
    2009年4月30日,官方1.5版本(Cupcake 纸杯蛋糕)的Android发布。主要的更新如下:
    1、拍摄/播放影片,并支持上传到Youtube
    2、支持立体声蓝牙耳机,同时改善自动配对性能
    3、最新的采用WebKit技术的浏览器,支持复制/贴上和页面中搜索
    4、GPS性能大大提高
    5、提供屏幕虚拟键盘
    6、主屏幕增加音乐播放器和相框widgets
    7、应用程序自动随着手机旋转
    8、短信、Gmail、日暦,浏览器的用户接口大幅改进,如Gmail可以批量删除邮件
    9、相机启动速度加快,拍摄图片可以直接上传到Picasa
    10、来电照片显示
    Android 1.6
    Donut
    (甜甜圈)
    2009年9月15日,1.6(Donut 甜甜圈)版本软件开发工具包发布。主要的更新如下:
    1、重新设计的Android Market手势
    2、支持CDMA网络
    3、文字转语音系统(Text-to-Speech)
    4、快速搜索框
    5、全新的拍照接口
    6、查看应用程序耗电
    7、支持虚拟私人网络(VPN)
    8、支持更多的屏幕分辨率。
    9、支持OpenCore2媒体引擎
    10、新增面向视觉或听觉困难人群的易用性插件
    Android2.0/2.0.1/2.1
    Eclair
    (松饼)
    2009年10月26日,2.0(Eclair 松饼)版本软件开发工具包发布。主要的更新如下:
    1、优化硬件速度
    2、"Car Home"程序
    3、支持更多的屏幕分辨率
    4、改良的用户界面
    5、新的浏览器的用户接口和支持HTML5
    6、新的联系人名单
    7、更好的白色/黑色背景比率
    8、改进Google Maps3.1.2
    9、支持Microsoft Exchange
    10、支持内置相机闪光灯
    11、支持数码变焦
    12、改进的虚拟键盘
    13、支持蓝牙2.1
    14、支持动态桌面的设计
    Android 2.2/2.2.1
    Froyo
    (冻酸奶)
    2010年5月20日,2.2(Froyo 冻酸奶)版本软件开发工具包发布。主要的更新如下:
    1、整体性能大幅度的提升
    2、3G网络共享功能。
    3、Flash的支持。
    4、App2sd功能。
    5、全新的软件商店。
    6、更多的Web应用API接口的开发。
    Android 2.3
    Gingerbread
    (姜饼)
    2010年12月7日,2.3(Gingerbread 姜饼)版本软件开发工具包发布。主要的更新如下:
    1、增加了新的垃圾回收和优化处理事件
    2、原生代码可直接存取输入和感应器事件、EGL/OpenGL ES、OpenSL ES。
    3、新的管理窗口和生命周期的框架。
    4、支持VP8和WebM视频格式,提供AAC和AMR宽频编码,提供了新的音频效果器
    5、支持前置摄像头、SIP/VOIP和NFC(近场通讯)
    6、简化界面、速度提升:
    7、更快更直观的文字输入:
    8、一键文字选择和复制/粘帖:
    9、改进的电源管理系统:
    10、新的应用管理方式:

    Android 3.0
    Honeycomb
    (蜂巢)
    2011年2月2日, 3.0(Honeycomb 蜂巢)版本主要更新如下:
    ·优化针对平板
    ·全新设计的UI增强网页浏览功能
    ·n-app purchases功能
    Android 3.1
    Honeycomb
    (蜂巢)
    2011年5月11日在Google I/O开发者大会宣布发布,版本主要更新如下:
    Honeycomb蜂巢(改进3.0BUG)
    经过优化的Gmail电子邮箱;
    全面支持GoogleMaps
    将Android手机系统跟平板系统再次合并从而方便开发者。
    任务管理器可滚动,支持USB 输入设备(键盘、鼠标等)。
    支持 Google TV.可以支持XBOX 360无线手柄
    widget支持的变化,能更加容易的定制屏幕widget插件。

    Android 3.2
    Honeycomb
    (蜂巢)
    2011年7月13日发布,版本更新如下:
    支持7英寸设备
    引入了应用显示缩放功能

    Android 4.0
    Ice Cream Sandwich
    (冰激凌三明治)
    2011年10月19日 在香港发布,
    4.0(Ice Cream Sandwich 冰激凌三明治)版本主要更新如下:
    1、全新的ui
    2、全新的Chrome Lite浏览器,有离线阅读,16标签页,隐身浏览模式等。
    3、截图功能
    4、更强大的图片编辑功能
    5、自带照片应用堪比Instagram,可以加滤镜、加相框,进行360度全景拍摄,照片还能根据地点来排序
    6、Gmail加入手势、离线搜索功能,UI更强大。
    7、新功能People:以联系人照片为核心,界面偏重滑动而非点击,集成了Twitter、Linkedin、Google+等通讯工具。有望支持用户自定义添加第三方服务。
    8、新增流量管理工具,可具体查看每个应用产生的流量。
    9、正在运行的程序可以像电脑一样的互相切换
    10、人脸识别功能
    11、系统优化、速度更快
    12、支持虚拟按键,手机可以不再拥有任何按键
    13、更直观的程序文件夹
    14、平板电脑和智能手机通用
    15、支持更大的分辨率
    16、专为双核处理器编写的优化驱动
    17、全新的Linux内核
    18、增强的复制粘贴功能
    19、语音功能
    20、全新通知栏
    21、更加丰富的数据传输功能
    22、更多的感应器支持
    23、语音识别的键盘
    24、全新的3D驱动, 游戏支持能力提升
    25、全新的谷歌电子市场
    26、增强的桌面插件自定义

    Android N.n
    Jelly Bean
    “果冻豆”
    继“冰激凌三明治”之后的下一版Android系统。

    大事纪

      2005年事件
      Google收购了成立仅22个月的高科技企业Android。
      2007年事件
      11月5日,Google公司正式向外界展示Android操作系统。
      11月5日,Google与34家手机制造商、软件开发商、电信运营商和芯片制造商共同创建开放手持设备联盟。

    2008年

      5月28日,Patrick Brady于Google I/O大会上提出Android HAL架构图。
      8月18日,Android获得美国联邦通信委员会的批准。
      9月22日,谷歌正式对外发布第一款Android手机——HTC G1。
      9月23日,谷歌发布Android1.0。
      9月24日,全球业界都表示不看好Android操作系统,并且声称最多1年,Android就会被Google关闭。

    2009年

      4月30日,Android1.5正式发布。
      5月10日,HTC G1和HTC G2市场大卖,成为仅次于iPhone的热门机型。
      9月25日,Android1.6正式发布。
      9月29日,HTC Hero G3广受欢迎,成为全球最受欢迎的机型。
      10月28日,Android 2.0 智能手机操作系统正式发布。
      11月10日,由于Android的火热,Android平台出现第一个恶意间谍软件:Mobile Spy,该程序会自动记录用户所输入的任何信息并发送到黑客的邮箱中,还可以视频录下用户的所有操作过程。

    2010年

      1月7日,Google发布了旗下第一款自主品牌手机:Nexus one(HTC G5)。
      1月,谷歌与Linux基金会就Linux内核的同步和维护意见不一致而产生了矛盾。
      2月3日,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”上除去,从此,Android与Linux开发分道扬镳。
      5月19日,Google正式对外发布Android2.2智能操作系统。
      5月20日,Google对外正式展示了搭载Android系统的智能电视-Google TV,该电视为全球首台智能电视。
      7月1日,Google宣布正式与雅虎、亚马逊合作,并且在Android上推出多项Kindle服务和雅虎服务。
      7月9日,美国NDP集团调查显示,Android系统已占据了美国手机市场28%的份额,全球17%的市场份额。
      8月12日,Android平台出现第一个木马病毒:Trojan-SMS.AndroidOS.FakePlayer.a,该木马病毒会伪装成应用程序,当用户不小心安装之后,它便会疯狂地发送短信,使用户的手机开通高额的收费服务。
      9月,Android应用数量超过9万个。
      9月21日,Google对外公布数据,每日销售的Android设备的新用户数达到20万。
      10月26日,Google宣布Android达到第一个里程碑:电子市场上的Android应用数量达到10万个。
      12月7日,Google正式发布Android2.3操作系统。

    2011年

      1月,Google对外宣布Android Market上的应用数量超过20万。
      1月,Google对外公布数据,每日Android设备的新用户数达到30万。
      2月2日,Android3.0正式发布。
      2月3日,谷歌发布了专用于平板电脑的Android 3.0Honeycomb系统,它带来了很多激动人心的新特性。这是首个基于Android的平板电脑专用操作系统。
      6月,Android在日本的智能手机操作系统市场占有率达到57%。
      7月,Android在欧洲的智能手机操作系统市场占有率达到了22.3%
      7月,Google对外公布数据,Android每天的新用户达到55万,Android设备用户总数达1.35亿。
      8月,谷歌收购摩托罗拉移动。
      8月,Google对外宣布Android Market上的应用数量超过30万。
      8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。
      8月,Android在韩国的智能手机操作系统市场占有率达到了95%。
      8月,Android系统在35个国家市场占有率第一,平均市场占有率达到48%。
      8月,Android系统成为亚太地区第一大系统,市场占有率为亚太地区第一大。
      9月,Android在美国的智能手机操作系统市场占有率达到43%。
      10月19日,谷歌正式发布Android 4.0操作系统。
      11月,Android Market上提交审核的应用程序数量达到50万。随后,谷歌对Android Market上的应用程序进行了大清理,据统计,此次清理共清理了约18万个应用程序,包括流氓应用、病毒软件、侵犯版权、低质量和滥竽充数的各种程序,谷歌将这一系列应用删除后,使得Android市场中的优质应用程序总数到31.5万。
      11月15日,Android在中国大陆的智能手机操作系统市场占有率达到了58%。
      11月20日,谷歌宣布启动了Android Market应用审核、取缔、清扫行为,定期对电子市场上存在的不合格、低质量、违法恶意的应用程序进行清理,保证Android优质应用程序的增长。
      11月18日,美国NPD数据显示,Android和iOS平台上的游戏占有率都首度超过任天堂DS掌机和索尼PSP掌机,手机游戏玩家也超过了掌机玩家,游戏开发商更倾向于向Android和iOS手机上开发游戏。
      11月18日,谷歌报告显示,通过谷歌服务器激活的Android设备用户总数已经超过2亿,每天通过谷歌服务器激活的新用户数超过55万,而这仅仅是通过谷歌服务器激活的用户设备数。
      12月9日,Google对外宣布,Android达到另一个里程碑,Android电子市场即Android Market的累计下载量已经突破100亿次,平均每月的下载量为10亿次。 12月18日,Google移动事业部副总裁Andy Rubin表示,每天激活的Android设备已达到70万部。
      12月26日,Andy Rubin通过Twitter宣布,圣诞节的前两天24日和25日,共有370万部Android设备被激活。

    2012年

      1月4日,应用商店调研公司Distimo的数据显示,Android电子市场(Android Market)上的应用程序数量突破40万个,每4个月增加10万个应用程序。同时在谷歌电子市场上登记的Android开发者达到了10万名。
      1月20日,谷歌报告显示,通过谷歌服务器激活的Android设备用户总数已经超过2.5亿,距离去年11月的数量,在短短2个月时间内全球共卖出5000万台安卓设备,平均每秒钟就卖出10台安卓设备。
      2月4日,comScore等多家数据市场研究机构的数据都一致显示,安卓在美国手机市场以47.3%的占有率巩固了自己的霸主地位。

    系统架构

      Android的系统架构和其它操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
      Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。
      在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:pythonluatclphp等等),还有其他诸如:Qt(qt for android)、Mono(mono for android)等一些著名编程框架也开始支持Android编程,甚至通过MonoDroid,开发者还可以使用C#作为编程语言来开发应用程序。另外,谷歌还在2009年特别发布了针对初学者的Android Simple语言,该语言类似Basic语言。而在网页编程语言方面,JavaScriptajax,HTML5,jquerysencha、dojo、mobl、PhoneGap等等都已经支持Android开发。
      而在Android系统底层方面,Android使用C/C++作为开发语言。

    应用程序(部分)

      早期的Android应用程序开发,通常通过Android SDK(Android软件开发包)下使用Java作为编程语言来开发应用程序,但通过不同的软件开发包,则使用的编程语言也不同。
      例如开发者可以通过Android NDK(Android Native开发包)使用C语言或者C++语言来作为编程语言开发应用程序。同时谷歌还推出了适合初学者编程使用的Simple语言,该语言类似微软公司的Visual Basic语言。此外,谷歌公司还推出了Google App Inventor开发工具,该开发工具可以快速地构建应用程序,方便新手开发者。
      Java开发方面
      Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。 其中Activity等同于J2ME的MIDlet,一个 Activity 类(Class)负责创建视窗(Windows),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行的效果。如果运行中的 Activity 全部画面被其他 Activity 取代时,该 Activity 便被停止(Stopped),甚至被系统清除(Kill)。
      View等同于J2ME的Displayable,程序人员可以通过 View 类与“XML layout”档将UI放置在视窗上,Android 1.5的版本可以利用 View 打造出所谓的 Widgets,其实Widget只是View的一种,所以可以使用xml来设计layout,HTC的Android Hero手机即含有大量的widget。至于ViewGroup 是各种layout 的基础抽象类(abstract class),ViewGroup之内还可以有ViewGroup。View的构造函数不需要再Activity中调用,但是Displayable的是必须的,在Activity 中,要通过findViewById()来从XML 中取得View,Android的View类的显示很大程度上是从XML中读取的。View 与事件(event)息息相关,两者之间通过Listener 结合在一起,每一个View都可以注册一个event listener,例如:当View要处理用户触碰(touch)的事件时,就要向Android框架注册View.OnClickListener。另外还有BitMap等同于J2ME的Image。
      C/C++开发方面
      早期的Android开发只支持Java作为编程语言开发应用程序,因而使得其他语言开发者只能望而却步。2010年4月,谷歌正式对开发者发布了Android NDK,NDK允许开发者使用C/C++作为编程语言来为Android开发应用程序,初版的NDK使得开发者看到了C/C++在Android开发中的希望。
      但是,当前版本的NDK在功能上还有很多局限性:NDK并没有提供对应用程序生命周期的维护;NDK也不提供对Android系统中大量系统事件的支持;对于作为应用程序交互接口的UI API,当前版本的NDK中也没有提供。但是相对于初版的NDK,现在的NDK已经进行了许多重大的功能改进。
      由此可见,NDK仍然需要完善和发展,相信未来随着NDK的发展,NDK可以做得更多更好。

    中介软件

      操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari 浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。
      Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
      Android 使用skia 为核心图形引擎,搭配OpenGL/ES。skia与Linux Cairo功能相当,但相较于Linux Cairo, skia 功能还只是雏形的。2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,目前Skia 也是Google Chrome 的图形引擎。
      Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。
      Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。
      Dalvik虚拟机可以有多个实例(instance), 每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。

    硬件抽像层

      Android 的 HAL(硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL 的目的是为了把 Android framework 与 Linux kernel 隔开,让 Android 不至过度依赖 Linux kernel,以达成 kernel independent 的概念,也让 Android framework 的开发能在不考量驱动程序实现的前提下进行发展。
      HAL stub 是一种代理人(proxy)的概念,stub 是以 *.so 档的形式存在。Stub 向 HAL“提供”操作函数(operations),并由 Android runtime 向 HAL 取得 stub 的 operations,再 callback 这些操作函数。HAL 里包含了许多的 stub(代理人)。Runtime 只要说明“类型”,即 module ID,就可以取得操作函数。

    内核

      Android 是运行于 Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 userspace,使得Linux driver 与 Linux kernel彻底分开。bionic/libc/kernel/ 并非标准的kernel header files。Android 的 kernel header 是利用工具由 Linux kernel header 所产生的,这样做是为了保留常数、数据结构与宏。
      目前Android 的 Linux kernel控制包括安全(Security),存储器管理(Memory Management),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型(Driver Model)等。下载Android源码之前,先要安装其构建工具 Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。

    安全权限机制

      Android本身是一个权限分立的操作系统。在这类操作系统中,每个应用都以唯一的一个系统识别身份运行(Linux用户ID与群组ID)。系统的各部分也分别使用各自独立的识别方式。Linux就是这样将应用与应用,应用与系统隔离开。
      系统更多的安全功能通过权限机制提供。权限可以限制某个特定进程的特定操作,也可以限制每个URI权限对特定数据段的访问。
      Android安全架构的核心设计思想是,在默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。
      安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款Android应用通常会要求如下的权限:
      拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。
      一款应用应该根据自身提供的功能,要求合理的权限。用户也可以分析一款应用所需权限,从而简单判定这款应用是否安全。如一款应用是不带广告的单机版,也没有任何附加内容需要下载,那么它要求访问网络的权限就比较可疑。

    程序组成

      一般来说Android 程序主要由下列四个部分组成,分别是:活动(Activity) - 用于表现功能服务(Service) - 相当于后台运行的Activity广播接收器(BroadcastReceiver) - 用于接收广播意图(Intent)- 用于连接以上各个组件,并在其间传递消息

    1 Activity 介绍

      Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Acitivity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 的概念和网页的概念相当类似。
      一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。
      当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android 会把每个应用的开始到当前的每一个屏幕保存在堆栈中。Activity 是由Android 系统进行维护的,它也有自己的生命周期,即它的一个产生、运行、销毁的一个周期,对于Activity,关键是其生命周期的把握,其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity 之间的跳转和数据传输(intent)。

    2 Service 介绍

      Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。Service 是一种程序,它可以运行很长的时间,但是它却没有用户界面。这么说有点枯燥,我们来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android 的浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲的播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

    3 Broadcast

      在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast () 将它们自己的intent broadcasts广播给其他应用程序。注册BroadcastReceiver有两种方式:

    4 Intent 介绍

      Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android 各个组件之间的通讯。Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此Intent 的描述,负责找到对应的组件,将Intent 传递给调用的组件,并完成组件的调用。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity 为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)。为了实现这个目的,listActivity需要构造一个Intent,这个Intent 用于告诉系统,我们要做"查看"动作,此动作对应的查看对象是"某联系人",然后调用startActivity(Intent intent),将构造的Intent 传入,系统会根据此Intent 中的描述,到ManiFest中找到满足此Intent 要求的Activity,系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity 则会根据此Intent中的描述,执行相应的操作。Intent 主要是用来启动其他的activity 或者service,所以可以将intent 理解成activity 之间的粘合剂。Intent具体有一下3 种形式:
      通过startActivity 方法来启动一个新的Activity;
      通过broadcast Intent 机制可以将一个Intent 发送给任何对这个Intent 感兴趣的BroadcastReceiver;
      通过startService (Intent) 或bindService(Intent,ServiceConnection,int) 来和后台的Service 进行交互。[1]
    展开全文
  • function lunch() { local answer # 如果lunch后面没有参数,那么打印菜单,并将选择值放入answer # 如果有参数,直接赋值 if [ "$1" ] ; then answer=$1 else print_lunch_menu echo -n "Which would you ...
  • 从大的方面来说,Android系统的启动可以分为两个部分:第一部分是Linux核心的启动,第二部分是Android系统的启动。第一部分主要包括系统引导,核心和驱动程序等,由于它们不属于本篇要讲的内容,这里就不再讨论。在...

    从大的方面来说,Android系统的启动可以分为两个部分:第一部分是Linux核心的启动,第二部分是Android系统的启动。第一部分主要包括系统引导,核心和驱动程序等,由于它们不属于本篇要讲的内容,这里就不再讨论。在本篇博客中,我们重点讲解Android系统的启动,这一过程主要经过两个阶段,分别是应用的初始化流程与system_service进程及核心服务的创建流程。


    1.初始化流程


    初始化流程,顾名思义,它完成Android的一些初始化工作,包括设置必要的环境变量,启动必要的服务进程,挂载必要的设备等,而这些工作将会为整个Android打下坚实的基础。


    ①应用的初始化流程


    在核心启动完成以后,将进入Android文件系统及应用的初始化流程,此时将会转向执行init.c中的main()函数(路径:/system/core/init/init.c),该函数的执行流程如下图所示:





    下面我们了解一下上图中的注解


    注解1:/dev表示设备文件系统或者udev挂载点,/proc用来挂载存放系统过程性信息的虚拟文件系统,/sys用于挂载“sysfs文件系统”。由于前面调用了umask(0),因此mkdir(“/dev”,0755)得到的权限应该是0755.


    注解2:init.rc的解析结果是形成action_list(on关键字相关的部分),service_list(service_关键字相关的部分)以及action_queue(需要执行的命令或服务),以便后续流程使用。


    注解3:解析/proc/cmdline文件,将其中的属性导入Android系统全局变量。


    注解4


    Ⅰget_hardware_name()方法用于解析/proc/cpuinfo文件获取硬件信息,并用于拼接成一个init.<hardware_name>.rc文件,继续解析。


    Ⅱ在解析init.rc文件的过程中,系统会根据该文件的内容形成一些需要命令,动作或者触发器的列表并将这些存入在内在中,以便在必要的时候使用。不同的厂商可能根据不同的硬件需求定制不同的.rc文件,这些.rc文件的名称一般为“init.<hardware_name>.rc”,而解析这些.rc文件的结果同样也会形成一些命令,动作或者触发器的列表,而这些列表将会合并解析init.rc所得的命令和动作的列表中,并且形成最终需要执行的命令和动作。


    注解5:添加顺序为:early-init下的所有动作,wait_for_coldboot_done_action,property_init_action,keychord_init_action,console_init_action,set_init_properties_action,init下的动作,property_service_init_action,signal_init_action,check_startup_action,early-boot下的所有动作,boot下的所有动作,queue_property_triggers_action。这些动作组成了开机过程中看到的设备的状态,比如开机动画等。


    注解6:这里会启动执行设置属性,创建或挂载动作以及启动服务等操作。需要注意是的这里启动的服务包括最重要的servicemanager和zygote服务进程。


    至此,init进程进入死循环中处理一些消息以等待命令的到来。在这个过程中,我们将要了解以下知识。


    Ⅰ在init运行的过程中产生了许多服务,它们是整个Android的基础,分别是ueventd,console,adbd,servicemanager,vold,netd,debuggerd,ril-daemon,surfaceflinger,zygote,drm,media,bootanim,dbus,bluetoothd,installd,flash_recovery,racoon,mtpd,keystore和dumstate。


    Ⅱ整个init的行为甚至整个Android核心的属性都受到启动脚本init.rc的影响。


    下面我们就重点介绍zygote的启动行为,详细了解init.rc的语法。


    ②init.rc的用法


    Android初始化语言由声明的4个类型组成,它们分别是动作(action),命令(command),服务(service),和选项(option),以#开头的行表示注释。动作和服务声明新的一节并且有唯一的名字,所有的命令或者选项属于最近声明的节。如果下一个动作或者服务的名字已存在(也就是重名),则它将作为错误被忽略。


    Ⅰ动作


    动作是命令序列,它有一个触发器,用于确定行动应在何时发生。当发生某一个事件时,它可以匹配到一个动作触发器,并且该动作会被添加到要执行队列的尾部(除非它已经在队列中了)。


    队列中的每个动作是按顺序出列的,具体如下所示:


    on early-init

    write /proc/1/oom-adj -16

    setcon u:r:init:s0

    start ueventd


    动作表现为以下的形式:


    on <trigger>

    <command>

    <command>

    <command>

    .........


    触发器是一些字符串,这些字符串可用于匹配一定类型的事件,并且用于触发动作。下表罗列了一些触发器的定义。




    触发器 说明
    boot 当初始化流程触发的时候,boot是首先被触发的动作(在完成/init.conf文件加载之后)
    <name>=<value> 当以<name>命名的属性被设为特定的值<value>时,该触发器发生
    device-added-<path> 当添加设备节点时,device-added-<path>定义的触发器运行
    device-removed-<path> 当移除设备节点时,device-removed-<path>定义的触发器运行
    service-exited-<name> 当指定的服务退出时,service-exited-<name>类型的触发器运行
    <string> 自定义的触发器,可由init代码负责管理

    Ⅱ命令


    命令是组成动作的成员,也就是说,动作由一个个命令组成。下表罗列了动作支持的命令。




    命令 说明
    exec  <path> [<argument>]* fork并执行程序(<path>)。这在程序完成执行之前将阻塞一切进程,因此最好避免使用exec命令。该命令中两个参数的含义如下所示。
    ❶<path>:可执行文件的路径
    ❷[<argument>]*:可执行文件所需的参数,参数个数可以是0或者多个
    export <name> <value> 设置名字为<name>的环境变量为<value>
    ifup <interface> 打开网络接口<interface>
    import <filename> 解析一个初始化配置文件,导入系统中
    hostname <name> 设置主机名
    chdir <directory> 修改工作目录,它的功能和cd命令一样
    chmod <octal-mode> <path> 修改文件的访问权限
    chown <owner> <group> <path> 修改<path>指定的问题的所有者和组
    chroot <directory> 修改进程根目录为<directory>
    class_start <serviceclass> 启动<serviceclass>类别的服务,如果它们没有运行的话
    class_stio <serviceclass> 停止<serviceclass>类别的服务,如果它们已经处于运行状态的话
    domainname <name> 设置域名
    insmod <path> 在<path>上安装模块
    mkdir <path> [mode] [owner] [group] 创建一个目录,其中目录路径以及名称由<path>指明。这里可以通过参数给定目录的模式,所有者和组。如果没有提供[mode] [owner] [group],则用权限755来创建目录,并且它属于root用户root组
    mount <type> <device> <dir> [<mountoption>]* 尝试在目录<dir>上挂载被命名的设备,<device>可能是mtd@name的形式,以便指定名为mtd块的设备。<mountoption>包括ro,rw,remount和noatime等
    setkey TBD
    setprop <name> <value>  设置系统属性<name> 为<value>
    setrlimit <resource> <cur> <max> 设置指定资源的使用限制
    start <service> 启动指定的服务,如果服务还没有运行的话
    stop <service> 停止指定的服务,如果服务目前正在运行的话
    symlink <target> <path> 用值<target>来在<path>上创建一个符号链接
    sysclktz <mins_west_of_gmt> 设置系统闹钟基准(如果系统闹钟为GMT,则为0)
    trigger <event> 触发一个事件。用于执行该触发器中的操作
    write <path> <string> [<string>]* 在<path>上打开文件并且用write(2)来将一个或多个字符串写到文件上。


    在init.rc中,Android 定义了若干动作,并且这些动作用于完成Android的初始化工作。下面以其中一个动作的配置来说明一下:


    on fs

    mount yaffs2 mtd@system /system

    mount yaffs2 mtd@system /system ro remount

    mount yaffs2 mtd@userdata /data nosuid nodev

    mount yaffs2 mtd@cache /cache nosuid nodev


    这个例子配置了一个触发器为fs的动作,它由4条命令组成,这4条命令都使用mount命令挂载设备。


    Ⅲ服务


    服务是一些程序,当它们退出的时候,init启动并且(选择性地)重新启动。服务表现为以下形式:


    service <name> <pathname> [<argument>]*

    <option>

    <option>

    ...........


    其中各个参数的含义如下所示:


    ❶<name>:为服务指定一个名字。


    ❷<pathname>:指定服务需要执行的文件路径。


    ❸[<argument>]*:启动服务所需要的参数,参数个数可以是0个或者多个。


    Ⅳ选项


    选项是服务的修改器,可以影响如何以及何时初始化运行服务。下表罗列了选项列表。




    选项 说明
    critical 这是一个对于设备来说比较关键的服务,如果它在4分钟内退出超过4次,那么设备将重新启动并进入recovery模式。
    disabled 这个服务不能通过类别自动启动,它必须通过服务名字来显示启动
    setenv <name> <value> 设置启动进程中环境变量(由<name>指定)的值为<value>
    socket <name> <type> <perm> [<user> [<group>]] 创建名为/dev/socket/<name>的一个Unix域端口并且将它的fd传递到被启动的进程上
    <type>必须是dgram,stream,seqpacket.设置用户和组的默认值为0
    user <username> 在执行该服务之前变换用户名,如果进程需要Linux的能力,就不能使用该命令
    group <groupname> [<groupname>]* 在执行该服务之前变换组名
    oneshot 在服务退出时不要重新启动它
    class <name> 为服务指定一个类名。一个被命名的类中的所有服务都可以一起被启动或停止。如果服务没有通过类选项来指定的话,它是在类default中的
    onrestart 当服务重新启动时,执行一条命令


    下面以init.rc文件中的配置为例简要说明一个服务的配置:


    service zygote /system/bin/app_process -Xzygote /system/bin -zygote

    --start-system-server

    class main

    socket zygote stream 666

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart media 

    onrestart restart netd


    在上面代码中,第一行配置了一个名为zygote的服务,这个服务将会运行/system/bin/app_process,剩余部分为参数(以空格分割)。


    剩下的几行代码声明了此服务的选项。这说明zygote是一个类型为main的服务(classmain)并且它会创建一个socket,这个socket的类型为stream,权限为666(socket zygote stream 666)。当重启此服务的时候,需要完成以下事情。


    ❶写/sys.android_power/request_state为wake


    ❷写/sys/power/state为on


    ❸重新启动media服务


    ❹重新启动netd服务


    init.rc文件需要在init启动期被解析成系统可以识别的数据结构。前面我们读懂了init.rc的含义,下面我们就来看看init是如何保存和组织这些信息的,首先,我们来看看在init中如何表示动作,服务和命令,如下表所示:




    组件 数据结构 说明
    列表节点(listnode)
    <<struct>>
    listnode
    +next:listnode
    +prev:listnode
     

    listnode是一个表示位置的数据结构,可以用来定义不同类型节点(比如动作或者服务)的执行顺序
    从左侧的数据结构中可以看出,这里包含了两个listnode的指针,它们用于指向前一个和后一个将要执行的节点
    这些信息将帮助各种节点(动作,服务,以及命令等)组成一个双向循环列表
    动作(action)
    <<struct>>
    action
    +alist::listnode
    +qlist:listnode
    +tlist:listnode
    +hash:signed int
    +*name:char
    +commands:listnode
    +*current:command
     

    action中包含4个表示节点位置信息的节点,它们分别表示它本身在所有动作中的位置(alist),在添加动作的队列中的位置(qlist),以及在某个触发器中的所有动作列表的位置(tlist)
    action 数据结构中包含了其他的重要信息,比如动作的名字(name),包含的所有命令列表(commands)以及当前命令
    服务(service)
    <<struct>>
    service
    +slist:listnode
    +*name:char
    +*classname:char
    +flags:unsigned
    +pid:pid_t
    +time_started:time_t
    +time_crashed:time_t
    +nr_crashed:int
    +uid:uid_t
    +gid:gid_t
    +supp_gids[NR_SVC_SUPP_GIDS]:gid_t
    +*sockets:socketinfo
    +*envvars:svcenvinfo
    +onrestart:action
    +*keycodes:int
    +nkeycodes:int
    +keychord_id:int
    +ioprio_class:int
    +ioprio_pri:int
    +nargs:int
    +*arg[1]:char
     

    这个数据结构中包含了服务的信息,主要包括如下内容:

    ❶该服务在所有服务列表中逻辑位置的数据结构“listnode”(slist)

    ❷服务的基本信息,比如服务的名称,进程的相关信息,所需要参数信息等
    命令(command)
    <<struct>>
    command
    +clist:listnode
    +(*func)(int nargs,char **args):iint
    +nargs:int
    +*args[1]:char
     

    这个数据结构中包括以下内容:

    ❶节点的位置信息(clist)

    ❷命令需要执行的函数的函数指针(func)

    ❸参数信息:nargs和args[1]


    最后,我们通过解析init.rc中的一个片段来说明解析过程。


    开始解析之前,需要了解整个解析过程至关重要的一个数据结构,那就是parse_state,它保存了整个解析过程中所处的状态,下图显示了它的“成分”



    <<struct>>
    parse_state
    +*ptr:char
    +*text:char
    +line:int
    +nexttoken:int
    +*context:void
    +(*parse_line)(struct parse_state *state,int nargs,char **args):void
    +*filename:char
     


    ③用init解析整个init.rc文件


    现在我们 回到init启动的初期,这里它调用了init_parse_config_file()方法,而这个方法就是解析init.rc文件的入口。用init解析整个init.rc文件的流程如下图所示。






    下面我们了解一下上图中的注解、


    注解1:state是一个被命名为parser_satte的结构体,用于保存当前文件的解析状态信息,包括解析的文件(filename),当前解析的行号(line),当前解析的文字指针(ptr),指示下一个动作的变量(nexttoken)以及解析这一行需要的函数指针(parse_line)等。


    注解2:next_token()函数位于/system/core/init/parse.c中,用于分析init.rc文件的内容。它只返回3个状态,分别是:T_EOF(文件结束),T_NEWLINE(一行结束)和T_TEXT(表示遇到第一个空格)。


    注解3:init.rc中每一行的信息通过空格被分割为若干段,而这些信息共同组成args[INIT_PARSER_MAXARGS]的内容,并由nargs计数。例如on fs经过解析后,这一行分为两段(分别是on和fs),分别存放在args中,计数器的值为2.。


    注解4:init.rc的每一行经过分割后,需要分析其类型(由lookup_keyword返回)。/system/core/init/keywords.h中定义了所有关键字的类型。在片段KEYWORD(on,SECTION,0,0)中,on关键字是一个SECTION,有0个(也就是不需要)参数,没有对应的触发函数(也就是最后一个0)。


    注解5:state.parse_line是一个函数的指针,可以根据关键字指向两种不同的解析方法——parse_line_service(处理服务的选项)和parse_line_action(处理行为的命令)。按照这个流程,init完成整个init.rc文件的解析,并生成service_list和action_list,后续流程所需要的信息将从这两个列表中获取,将需要执行的命令或启动的服务加入action_queue中,这样就完成了Android系统基础部分的启动。


    在启动的过程中,需要特别注意的是,我们通过action_for_each_trigger()方法声明需要执行的命令队列,该方法的代码如下所示:


    void action_for_each_trigger(const char * trigger,void (*func)(struct action *act)){

    struct listnode * node;

    struct action *act;

    list_for_each(node,&action_list){

    act=node_to_item(node,struct action,alist);

    if(!strcmp(act->name,trigger)){

    func(act);

    }

    }

    }


    在上述代码中,list_for_each()用于遍历action_list中的每一个节点,返回节点在列表中的位置信息,然后通过node_to_item()方法生成一个action的信息,最后执行func()函数。


    action_for_each_trigger()方法在init.rc中是这样调用的:


    action_for_each_trigger(early-init,action_add_queue_tail);


    它的含义是,在action_list中查找名字为early-init的节点,并将其信息通过action_add_queue_tail()方法加入action_queue队列的尾部。


    然后在init的无限循环中遍历action_queue中的每一个节点,执行它们所包含的命令。


    讲到这里,我们了解了init如何对待init.rc文件的内容。下面扩展一下知识,概要介绍一下Android系统中*.rc文件的关键字及其使用需求,如下表。如果你想修改或编写自己的.rc文件,那么请关注下表。




    关键字 类型 参数个数
    capability OPTION 0
    chdir COMMAND 1
    chroot COMMAND 1
    class OPTION 0
    class_start COMMAND 1
    class_stop COMMAND 1
    class_reset COMMAND 1
    console OPTION 0
    critical OPTION 0
    disabled OPTION 0
    domainname COMMAND 1
    exec COMMAND 1
    export COMMAND 2
    group OPTION 0
    hostname COMMAND 1
    ifup COMMAND 1
    insmod COMMAND 1
    import SECTION 1
    keycodes OPTION 0
    mkdir COMMAND 1
    mount COMMAND 3
    on SECTION 0
    oneshot OPTION 0
    onrestart OPTION 0
    restart COMMAND 1
    rm COMMAND 1
    rmdir COMMAND 1
    service SECTION 0
    setenv OPTION 2
    setkey COMMAND 0
    setprop COMMAND 2
    setrlimit COMMAND 3
    socket OPTION 0
    start COMMAND 1
    stop COMMAND 1
    trigger COMMAND 1
    Symlink COMMAND 1
    sysclktz COMMAND 1
    user OPTION 0
    wait COMMAND 1
    write COMMAND 2
    copy COMMAND 2
    chown COMMAND 2
    chmod COMMAND 2
    loglevel COMMAND 1
    load_persist_props COMMAND 0
    ioprio OPTION 0


    2.创建system_service进程


    在init进程的启动过程中,比较重要的部分由孵化进程启动system_service进程,下面详细介绍一下这个部分。system_service进程将会为我们创建一些重要的Android核心服务,包括ActivityManagerService,PackageManagerService和PowerManagerService等,这些将成为应用程序的基础,并为应用程序提供必要的接口。


    ①创建流程


    完成应用程序的初始化之后,init进程将创建一个名叫system_service的重要进程,而我们将在此进程中创建Android核心服务。下图显示了system_process进程以及核心服务的创建过程。




    注解1:init进程会按顺序启动各种类型的服务(包括core和main)。首先启动core类型的服务。然后启动main类型的服务。由于孵化服务为main类型,所以它会在core类型的服务之后启动。因此,这里启动用于管理服务的服务——servicemanager。启动和入口如下所示。


    ❶启动:service zygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server


    ❷入口:/frameworks/base/cmds/app_process/app_main.cpp的main()函数。


    注解2:此时转向/frameworks/base/core/jni/AndroidRuntime.cpp的start()函数。


    注解3:启动代码如下:


    jmethodId startMeth=env->GetStaticMethodID(startClass,"main",....);

    env->CallStaticVoidMethod(startClass,startMeth,strArray);


    此时转向com.android.internal.os.ZygoteInit的main()方法执行。


    注解4


    ❶加载frameworks下的preloaded-classes类。


    ❷加载framework-res.apk下的资源。


    注解5:孵化进程的主要目的就是孵化出system_process进程,这个时候流程将转向/frameworks/base/services/java/com/android/server/SystemServer.java的main()方法执行,而自身进入死循环成为守护进程。


    注解6:init1()调用本地android_server_SystemServer_init1(/frameworks/base/services/jni/com_android_server_SystemServer.cpp)后,通过libAndroid_servers.So的system_init()函数启动两个服务并启动init2()、


    注解7:这里启动并注册剩余的必需服务(比如包服务和Activity服务等)。最终会启动Launcher来到桌面,至此整个启动过程完成。


    ②system_service简介


    system_service进程非常重要,它创建了许多重要的服务,那么如何加入system_service中并接受管理呢?具体如下面的代码所示:


    try{

    Slog.i(TAG,"Backup Service");

    ServiceManager.addService(Context.BACKUP_SERVICE,new BackupManagerService(context));

    }catch(Throwable e){

    Slog.e(TAG,"Failure starting Backup Service",e);

    }


    以上代码展示了system_process如何将备份服务加入服务管理器中的,其中粗体部分的代码完成了两件事情:第一,创建备份服务;第二,使用ServiceManager的addService()方法将创建出来的备份服务实例加入服务管理器中加以管理。


    下表列出了system_service的服务关键字等知识。


    服务关键字 备注
    entropy EntropyService 熵服务
    power PowerManagerService 电源管理服务(Context.POWER_SERVICE)
    activity ActivityManagerService Activity管理服务
    telephony.registry TelephonyRegistry 电话服务
    package PackageManagerService 包管理服务
    account AccountManagerService 账户管理服务(Context.ACCOUT_SERVICE)
    battery BatteryService 电池服务
    vibrator VibratorService 振动服务
    alarm AlarmManagerService 报警服务(Context.ALARM_SERVICE)
    window WindowManagerService 窗口服务(Context.WINDOW_SERVICE)
    bluetooth BluetoothService 蓝牙服务(BluetoothAdapter.BLUETOOTH_SERVICE)
    statusbar StatusBarManagerService 状态栏服务(Context.STATUS_BAR_SERVICE)
    input_method InputMethodManagerService 输入法管理服务(Context.INPUT_METHOD_SERVICE)
    location LocationManagerService 位置管理服务(Context.LOCATION_SERVICE)
    wallpaper WallpaperManagerService 壁纸管理服务(Context.WALLPAPER_SERVICE)
    audio AudioService 声音服务(Context.AUDIO_SERVICE)
    user UserManagerService 用户管理服务(Context.USER_SERVICE)


    下面以获取声音服务为例介绍获取服务的方法:


    AudioService as=(AudioService)context.getSystemService(Context.AUDIO_SERVICE);


    此时整个系统也就完成了启动工作,这也意味着我们可以开始使用Android设备了。

    展开全文
  • 安卓复习之旅—android系统层次结构

    千次阅读 2016-12-08 14:56:15
    系统结构图:android系统层次结构主要包含4个层次 从上往下依次是:应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries和Android Runtime)和Linux内核层(Linux ...

    系统结构图:

    这里写图片描述

    android系统层次结构主要包含4个层次
    从上往下依次是:应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries和Android Runtime)和Linux内核层(Linux Kernel)。

    一、应用程序层
    Android的应用程序主要是用户界面(User Interface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。
    二、应用程序框架层
    本层次提供的首先包含了UI程序中所需要的各种控件,该层是Android应用开发的基础,该层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。
    三、系统运行库层
    本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容大多是使用C++实现的。系统库包括九个子系统,分别是界面管理工具(Surface Management 管理显示子系统)、媒体库、SQLite、OpenGLEState(对3D的支持)、FreeType(位图和矢量字体的功能)、WebKit(网络浏览器的核心)、SGL(2D图像引擎)、SSL(Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持)和C库。Android 运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般Java虚拟机(Java VM)不同,它执行的不是JAVA标准的字节码(bytecode )而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。 二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。

    四、Linux内核层
    Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

    展开全文
  • Android四大核心组件 Activity、BroadcastReceiver、Service、ContentProvider
  • Android核心

    千次阅读 2018-11-06 13:33:47
    Android系统API如何实现? -ApiCheck机制的原理 -如何使用Android系统自带资源包? Android运行库分为两个部分,分别是Dalvik虚拟机和核心库(Corelibraries)。核心库主要用于提供基本的Java类库的功能,另外...
  • 1.安卓操作系统架构与应用程序组件 ...而Android系统构架是安卓系统的体系结构,其系统架构和其操作系统一样,采用了分层的架构,共分为四层五部分,四层指的是从高到低分别是Android应用层,Android应...
  • 1.1安卓系统架构

    千次阅读 2018-05-21 21:40:14
    通过安卓系统架构我们可以更好的理解Android系统是如何工作的,Android大致可以分为四层架构: 1、Linux内核层 Linux Kernel 2、系统运行库层 Libraries 包含 Android运行时库 3、应用框架层 Application ...
  • Android系统架构详解

    千次阅读 2019-01-19 13:47:55
    Android建国纲领:...Display Driver、Camera Driver、Flash Memory Driver、Wifi Driver它是整个Android系统最基础,最核心的部分 程序库和android运行环境: 程序库主要包括SQLite(一个小型的关系型数据库)...
  • 最近开始接触安卓设备,了解到安卓系统开机界面以及定制桌面需要修改系统源码,这种情况下就需要重新编译系统源码得到.img镜像文件,本篇文章记录从零开始编译安卓系统源码以及安卓系统内核的一种方式。 1.配置系统...
  • Android核心分析

    千次阅读 2011-07-20 19:33:43
    文章皆来自CSDN网友maxleng的专栏,maxleng是名Android爱好者,长期从事嵌入式系统及手机软件系统研究,自2010年4月起,在CSDN上先后发表28篇《Android核心分析》系列博文,收到网友们的极高评价。《Android核心分析...
  • android系统

    千次阅读 2012-11-27 23:19:01
    早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续进行对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,...
  • /system/framework 这里是android系统的框架,里面保存着系统核心程序或java类库,十分重要里面的任何文件几乎都不要做删除操作。  6. /media/audio 这里面保存着安卓系统默认的铃声,alarms是闹铃提醒的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,163
精华内容 67,265
关键字:

安卓系统核心