本帖最后由 daxia789 于 2014-9-12 15:32 编辑
先是安卓科普,有些长,不愿意看的可以跳过。(声明:此科普转自bxa学堂吧)
一、Android是什么
法国作家利尔亚当 在1886年发表的科幻小说《未来夏娃》中,将其中的机器人主角称为Android(安德罗丁)。2003年被Andy Rubin等人用作其创建的公司名称,2005年该公司及其研发团队被Google收购,2007年11月5日,Google正式向外界展示了其最新研发的移动设备操作系统,名字就叫Android 。2008年9月,Google正式发布了Android 1.0系统,2009年4月,Google正式推出了其搭载Android 1.5操作系统的手机HTC G1,成为当时仅次于IPhone的热门机型,从该版本的操作系统开始,Google开始将Android版本以甜品命名。二、发展历程
早在2003年,刚刚迈进不惑之年的Andy Rubin创立了一家名为Android的公司,着手打造一款手机系统,他的理念是为所有的软件开发者创立一个开放性的移动平台。2005年在Andy Rubin完成了Android的开发之后,寻找投资的他想起了之前有一面之缘的谷歌创始人Larry Page,于是Android之父用了一封邮件说服了Page,几周之后谷歌低调收购了这家公司,一段历史就这样开启。
2007年11月5日,积淀了两年之久的谷歌终于在智能手机市场青黄不接的时候,向外界展示了Android操作系统,当人们已经对Symbian、Windows Mobile、iOS这样的封闭系统习以为常的时候,Android带来的全开放理念让很多使用者和厂商兴奋。同时谷歌也联合全球知名的软硬件企业、运营商、设备制造商组建了“开放手持设备联盟(Open Handset Alliance)”,共同发展Android平台。
严格意义上说,在2007年Android还只是处在纸面上的一款操作系统。虽然不知道它的前景如何,但是全开放的理念还是吸引了众多的合作伙伴加入到Android的开发中来,而今天受益于Android系统的三星、HTC、LG等终端厂商,都是2007年“吃葡萄的人”。
2008年是Android真正意义上的出生年,9月的发布会上,谷歌终于发布了Android系统的完成版,这算是Android系统最早的版本,界面简单,和现在的Android原生版本相比,1.0时代的Android系统尚显稚嫩。
同样在9月, T-Mobile在美国召开发布会,宣布全球第一款搭载Android智能系统的手机T-Mobile G1问世,而这款手机被人记住的不单单是Android系统,还有奇怪的滑盖设计以及G1这个名字。估计T-Mobile怎么也没想到,在短短几年之后,中国的手机市场上,开始流行G21、G22……
而在Android推出的时候,还有一个小插曲,Android的中文意思是“人形机器人”,而谷歌当年也确实是用机器人的名字作为系统代号的,不过由于像“阿童木”这样的专有名词构成侵权,因此谷歌放弃了机器人代号,转而使用现在我们熟知的甜点代号。
2009年4月,谷歌正式推出了搭载Android 1.5的HTC Magic(T-Mobile G2),HTC Dream以及HTC Magic成为当时仅次于iPhone的热门机型。
从Android 1.5版本开始,谷歌开始将Android的版本以甜品的名字命名。与此同时,Android Market也开始大放异彩,丰富的应用程序选择,让用户大为满意,而Android系统更是剑指APP Store。由此可见,Android系统不光在用户体验以及终端产品方面极具优势,同时在运营模式上也效仿苹果,并做的同样出色。
2009年9月份,谷歌发布了Android 1.6的正式版,并且推出了搭载Android 1.6正式版的手机HTC Hero(G3),凭借着出色的外观设计以及全新的Android 1.6操作系统,HTC Hero(G3)成为当时全球最受欢迎的手机。Android 1.6则把谷歌推至风口浪尖,这时候Android火了,谷歌挣钱了,而众多手机制造商也看到了希望。
2009年10月份,谷歌发布了Android 2.0操作系统。该版本的代表机型为NEXUS One(G5),该机是由HTC代工生产。Android 2.0的出现,真正将谷歌带至了巅峰,自此Android拥有了强大的终端产品支持,有着丰富的Android Market,以及越来越多的用户群体。虽然版本更新速度十分之快,但是谷歌也并没有停下脚步,全新的2.1、2.2版本也悄然而至。从2.1版本开始,Google采用最新的Android Market,支持通过移动运营商网络支付购买应用程序和软件。
Android2.2在当时受到了广泛的关注,根据美国NDP集团调查显示,在当时Android系统已占据了美国移动系统市场28%的份额,在全球占据了17%的市场份额。到2010年9月份,Android系统的应用数量已经超过了9万个,谷歌公布每日销售的Android系统设备的新用户数量达到20万,Android系统取得了巨大的成功。
2010年应该是迄今为止最应该被浓墨重彩写在Android发展史上的一年,在这一年谷歌推出了两个Android的版本,分别是Android 2.2 Froyo(冻酸奶)以及Android 2.3 Gingerbread (姜饼),尤其是后者依旧是目前Android系统版本占有率的第一名。而Android 2.3也是迄今为止Android系统版本中推出修正版本最多的版本,一共出了8个修正版本,也足以见到谷歌对于Android 2.3的重视。
而第二个里程碑是Android的应用程序数量在这一年超越了10万个,在一年之间Android系统终端的广泛推出促进了应用程序数量的快速增长。而到了2010年,Android和iOS已经成为新时代智能手机系统中的翘楚,就好像东邪西毒一样的存在,而曾经威风八面的Symbian、Blackberry市场表现连连败退,而微软新一代的操作系统Windows Phone刚刚出生,前途未卜。也是这一年,Android迈出了击败Symbian登顶智能手机系统市场份额的坚实一步。
2010年5月,搭载Android 2.3系统的三星Galaxy SⅡ横空出世,它的出现奠定了三星在智能手机行业领衔的地位,之前一直被诺基亚压住头的三星凭借Android终端上的出色表现彻底翻身。
2012年,Android迎来发展史上的重要里程:三星Galaxy S III销量超越苹果iPhone 4S和iPhone 5。这是近代智能手机史上,首次出现单款Android智能手机销量超越iPhone。
2011年,随着iPad的惊艳亮相,谷歌为了发展Android做出了一个惊人的决定,发布专属于平板产品的系统——Android 3.0 Honeycomb(蜂巢),针对平板产品的显示和操作形式做了系统上的改变。从Android 3.0开始,Android出现了平板、手机系统分化的情况。
谷歌的如意算盘被市场冷淡的反应所击破了,尽管谷歌随后推出了Android 3.1/3.2系统,让Android平板开始支持鼠标、键盘,并支持7英寸的平板设备,但是和iOS差距甚远的用户体验以及软件的数量少得可怜让Android 3.0系统至今为止看起来都像一个笑话。
不过谷歌自然不会被蜂巢的失败所击倒,同年的10月,谷歌发布了Android 4.0 Ice Cream Sandwich(冰淇凌三明治)。和Android 2.3相比Android 4.0的改变可谓天翻地覆,不但重新设计了UI,还加入Chrome内核的浏览器,面部解锁、零延时拍照等功能,让Android的易用性更出色。
2011年代表性的机型当属Galaxys Nexus(i9250),这是谷歌推出的第三款自主品牌的手机产品,三星为其量身定制,之所以说这款手机特别,是因为在Android的手机中,Galaxys Nexus首次尝试了无按键的设计,而这款手机也曾经准备在中国内地上市,但是由于谷歌的原因,三星要让Galaxys Nexus成为首款国内上市的Nexus手机的愿望化为泡影。
截止到2011年9月份,Android系统的应用数目已经达到了48万,而在智能手机市场,Android系统的占有率已经达到了43%。继续排在移动操作系统首位。
诺基亚苦苦思索对抗苹果iPhone的机型,但是丝毫没有成效,反而投入了大批资金。现在诺基亚市值严重缩水,股东甚至对其失去了信心。然后Android仅用不到三年的功夫,现在就可以和iPhone势均力敌的叫板,这点上确实令诺基亚蒙羞了。
iPhone赖以成 名的APPSTORE也在面临着威胁。在其刚刚产生之时,导致了大量应用程序的井喷,那时所有人都意识到,用户对于手机应用的需求已经被压抑到饥渴难耐的程度。大量名不见经传的小公司和个人开发者在苹果的软件商店淘到了第一桶金。但是苹果封闭的系统和软件的审核模式让许多人不爽,大部分完全被苹果控制着。然而 Android的出现让这些人看到了希望,系统开源以及流程的明了吸引了大批软件开发人员的加入,如今Android market正在茁壮成长着,而老乔的iPhone此时也感到了阵阵压力。
二、Android启动过程
“千里之行 , 始于足下 ” 当我们拿到一款手机 , 第一件事应该就是按下电源键开机 , 那么从开机到进入到桌面程序这中间发生了些什么呢 , 我们从下面这张简化了的手机结构图开始
首先从bootloader分区中一个固定的地址开始执行指令,如图所示,bootloader分区分成两个部分,分别叫做primary bootloader和secondary stage bootloader。Primary bootloader主要执行硬件检测,确保硬件能正常工作后将secondary stage bootloader拷贝到内存(RAM)开始执行。Secondary stage bootloader会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot或者选择启动模式的启动界面等。我们在论坛上看到的bootloader通常指的就是secondary stage bootloader。不过我们不需要关心太多的细节,可以简单的理解为bootloader就是一段启动代码,根据用户按键有选择的进入某种启动模式。
1.fastboot模式
fastboot是android定义的一种简单的刷机协议,用户可以通过fastboot命令行工具来进行刷机。比如说fastboot flash boot boot.img这个命令就是把boot.img的内容刷写到boot分区中。一般的手机厂商不直接提供fastboot模式刷机,而是为了显示他们的牛B之处,总是会提供自己专有的刷机工具和刷机方法。比如说三星的Odin,摩托的RSD,华为的粉屏等等。但是其本质实际上是相同的,都是将软件直接flash到各个分区中。
recovery模式:recovery是android定义的一个标准刷机协议。当进入recovery模式时,secondary stage bootloader从recovery分区开始启动,recovery分区实际上是一个简单的Linux系统,当内核启动完毕后,开始执行第一个程序init(init程序是Linux系统所有程序的老祖宗)。init会启动一个叫做recovery的程序(recovery模式的名称也由此而来)。通过recovery程序,用户可以执行清除数据,安装刷机包等操作。一般的手机厂商都提供一个简单的recovery刷机,而大名鼎鼎的CWM Recovery就是一个加入了很多增强功能的recovery,要想用上CWM Recovery前提是recovery分区可以被刷写。大家在论坛上看到的解锁bootloader,通常指的就是解锁recovery或fastboot,允许刷写recovery分区,这样大家就可以用上喜爱的CWM Recovery了。
手机除了普通的CPU芯片以外,还有MODEM处理器芯片。该芯片的功能就是实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区。
2. 正常启动
当我们只是按下电源键开机时,会进入正常启动模式。Secondary stage bootloader会从boot分区开始启动。Boot分区的格式是固定的,首先是一个头部,然后是Linux内核,最后是用作根文件系统的ramdisk。
一般针对每个机型的完整刷机包中会有一个boot.img文件,这就是boot分区镜像文件。
当Linux内核启动完毕后,就开始执行根文件系统中的init程序,init程序会读取启动脚本文件(init.rc和init.xxxx.rc)。启动脚本文件的格式大家可以在网上找到很多参考资料,这里就不写了,而且我们在原厂ROM上移植的原则是不修改boot分区,因为有一些机型无法修改boot分区。
根文件系统中有一个重要的配置文件,叫default.prop,该文件的内容一般为:
#
# ADDITIONAL_DEFAULT_PROPERTIES
#
ro.secure=1
ro.allow.mock.location=1
ro.debuggable=0
persist.service.adb.enable=1。
文件中的每一行对某个属性赋值, 这里面大家需要注意的两个属性:ro.secure和ro.debuggable。如果ro.secure=0允许我们运行adb root命令。在下一篇我们会详细介绍adb,这是我们做ROM移植的利器。通常大家说得内核ROOT指的就是ro.secure=0。ROOT权限只是的手机上有一个名为授权管理的程序(Superuser.apk)可以授予程序root用户的权限。ro.deguggable=1允许调试系统APP。
init程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行system分区的程序,下一节我们就来看看system分区的结构。
3. system分区
在讲system分区之前,我们先来看下面这张Android的软件系统架构图。
从上到下依次为:
核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。
框架层:这一层是Android系统的核心,它提供了整个Android系统运作的机制,像窗口管理,程序安装包管理,开发人员所接触的Activity, Service, broadcast等等。
JNI层:JNI层是Java程序和底层操作系统通信的一个机制,它使得Java代码可以调用C/C++代码来访问底层操作系统的API。
Dalvik虚拟机:Android开发使用Java语言,应用程序的Java代码会被编译成dalvik虚拟机字节码,这些字节码由dalvik虚拟机解释执行。
本地库:本地库一般是由C/C++语言所开发,直接编译成相应CPU的机器码,这其中包含标准C库,用以绘制图形的skia库,浏览器核心引擎webkit等。
HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android定义了一套硬件接口,比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以独立于不同的硬件运行。
厂家适配层:本来Android定义的HAL层是直接和厂家提供的设备驱动打交道的,但是目前厂家不想开源HAL部分的代码,因此很多厂家都提供了一个我称之为厂家适配层的代码,这样在HAL层接口的实现只是一个简单的对厂家适配层接口函数的调用。
内核:这一层就是大家熟悉的Linux内核,内核中包含有各种硬件驱动,这些驱动不同的手机厂商不同的手机是不一样的。Linux内核是支持驱动模块化机制的,简单的说就是允许用户动态的加载或者卸载某个硬件驱动,但是目前来看,手机厂商除了提供WIFI驱动单独加载外,其它驱动都是和内核绑定在一起的。
从这张软件结构图来看,除了内核是放在boot分区外,其它层的代码都是在system分区中。
下面结合这张图来介绍system分区的主要目录内容:
system/app: app目录下存放的是核心应用,也就是大家熟知的系统APP,这些系统自带的程序是不能简单的卸载的,要通过一些特殊的方式才能删除(大家熟悉的一种方法是用RE文件管理器)。
system/lib: lib目录下存放的是组成JNI层,Dalvik虚拟机,本地库,HAL层和厂家适配层的所有动态链接库(.so文件)。
system/framework: 该目录下存放的是框架层的JAR包,其中对ROM移植来说有3个最重要的JAR包(framework.jar, android.policy.jar, services.jar)。后续的文章会重点介绍这3个包。
system/fonts: 该目录下存放的是系统缺省的字体文件。
system/media:该目录下存放的是系统所使用的各种媒体文件,比如说开机音乐,动画,壁纸文件等。不同的手机该目录的组织方式可能不一样。如何修改这些文件请参考网上对应机型形形色色的教程,这里不再赘叙。
system/bin: 该目录下存放的是一些可执行文件,基本上是由C/C++编写的。其中有一个重要的命令叫app_process下一节单独介绍。
system/xbin: 该目录下存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的busybox就放在该目录下。Busybox所建立的各种符号链接命令都是放在该目录。
system/build.prop: build.prop和上节说得根文件系统中的default.prop文件格式一样,都称为属性配置文件。它们都定义了一些属性值,代码可以读取或者修改这些属性值。属性值有一些命名规范:
ro开头的表示只读属性,即这些属性的值代码是无法修改的。
persist开头的表示这些属性值会保存在文件中,这样重新启动之后这些值还保留。
其它的属性一般以所属的类别开头,这些属性是可读可写的,但是对它们的修改重启之后不会保留。
很多ROM制作者都会修改一下build.prop信息,里面的一些以ro.build开头的属性就是你在手机设置中的关于手机里看到的。可以通过修改build.prop文件来将这个ROM打上自己的印记(XXX所修改)。 system/etc: 该目录存放一些配置文件,和属性配置文件不一样,这下面的配置文件可能稍微没那么的有规律
一般来说,一些脚本程序,还有大家所熟悉GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在这个目录。像HTC将相机特效所使用的一些文件也放在这个目录下。
4. Zygote(app_process)
上一节提到init会执行一个重要的命令程序叫app_process,一般大家称之为Zygote。(Zygote是卵的意思,所有的Android进程都是由它生出来的)。Zygote首先会加载dalvik虚拟机,然后产生一个叫做system_server的进程。system_server顾名思义被称作Android的系统服务程序,它主要管理整个android系统。system_server启动完成后开始寻找一个叫做启动器的程序,找到之后由zygote开始启动执行启动器,这就是我们常见到的桌面程序。
上面描述的是一个相当简化的启动过程。
5. data和cache分区
这一节简单的介绍一下data和cache分区。当我们开机进入桌面程序后,一般来说我们都会下载安装一些APP,这些APP都安装在data/app目录下。所有的Android程序生成的数据基本上都保存在data/data目录下。wipe data实质上就是格式化data分区,这样我们安装的所有APP和程序数据就都丢失了。
cache分区从名字上来看是用来缓存一些文件的,比如说一些音乐下载的临时文件,或者下载管理下载的内容基本上放在这个分区。
说了哪么多相信大家都初步了解安卓了,接下来自己去刷机玩玩,多刷一些,有利于后期的rom制作。
刷机教程自己去百度吧!看完上面的介绍相信你也知道每台手机的刷机方法都不一样了。
三、APK文件结构
1.META-INF\(注:apk的签名文件);
2.res\(注:存放资源文件的目录,后面介绍里面的文件);
3.Android Manifest.xml(注:程序全局配置文件);
4.classes.dex(注:Dalvik字节码,由java代码编译而成);
5.resources.arsc(注:编译后的二进制资源文件,很多的字们符串都在里面)。
android res文件夹介绍
2.1 anim文件夹
后缀名为.xml。动画文件都放在这里。
2.2 drawable文件夹
用于存放图片资源,图片或者xml。图片格式,有png,9.png,jpg,gif都行。xml文件通常为自定义的形状shape或图片选择器类selector似的东西,就是不同状态下不同的图片,用于设置background什么的。
这个drawable文件夹,为了对屏幕的适配,在名字上做修改。常见的有drawable-ldpi,drawable-mdpi,drawable-hdpi(屏幕密度DPI(120 / 160 / 240))。对于不常用的,在这里特意补充,也许就会用到了。
①对分辨率笼统的分:名字可以为:drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi(API Level 8),drawable-nodpi,drawable-tvdpi.
②具体到某一分辨率:drawable-分辨率,比如:drawable-1280x720
③如果有横竖屏的区别,则命名为:drawable-land|port-mdpi,
2.3 color文件夹
用于存放color列表,和drawable的xml一样,表示不同状态下的不同颜色。
2.4 menu文件夹
菜单资源文件夹。
2.5 layout文件夹
布局文件夹。此文件夹的名字也是可以起到屏幕适配的功能的。
①横竖屏:layout-land|port
②分辨率:layout-1280x720
2.6 values文件夹
存放常量值的文件夹。里面常见的xml文件为:
arrays.xml : 资源数组.
colors.xml : 颜色值
dimens.xml : 像素值.
strings.xml :字符串值.
styles.xml : 样式值.
此文件夹,也有屏幕适配作用。比如:dimens在不同分辨率下的值。同样的是加-1280x720这样的后缀。
对于strings,有各种语言的版本对应。默认为英文。中文的文件夹名字应该是:values-zh-rCN,values-zh-rTW。
2.7 raw文件夹
存放不需要系统编译成二进制的文件,例如字体文件等,同assets文件夹类似。
2.8 xml文件夹(存放xml文件。)
替换图片有两种方法
第一种是解压替换。
第二种是不用解压直接替换。
解压替换比不用解压替换的方法要复杂一些。
解压替换的方法:
1.把apk放到指定的目录(你的工作目录,最好是英文)下
2.把你准备好的图片替换进去
3.把修改好的文件进行压缩成zip
4.把后缀名zip改成apk
不用解压的方法用mt管理器直接打开apk替换图片就行了。
所须的软件全部压缩在"必备软件"里,下载下来用就行:
|