android 系统开发入门(一) 启动及编译过程介绍

1)android启动阶段通常是3个阶段:
第一个阶段未uboot,即上电开机到驱动加载前,通常看到的现象为进入开机logo前的阶段;
第二个界面为kernel阶段,即驱动加载阶段,通常看到的现象开机动画显示的前一阶段;
第三个阶段为android启动阶段,即由孵化器ZygoteInit启动系统各个服务,系统各个服务启动完成后会走systemready回调,之后启动systemui服务,之后会遍历所有home属性的activity,然后选择进入launcher,当所有初始化做完之后会发出开机完成boot_complete广播(详细的开机过程网上一搜一大把)
2)与1对应起来,系统编译的流程也是如此,先编译mboot,然后再编译kernel,然后再编译android,到最后将所有生成的文件打包到固件里面(即bin文件),编译android时原生的步骤是
-- source build/envsetup.sh 读取envsetup.sh 中的函数,并执行脚本,配置环境变量等
-- lunch 选择平台编译选项,一般分为user,userdebug,eng,常规的流程应该是给客户的最终版本是user版本,开发版本是userdebug或者eng,开发版本一般都是可以自动打开adb和机器可以root,remount的,user版本则相反,具体详细区别百度一搜一大把
-- make(全编译)或mm(模块编译)
不同厂家有的会做客制化,修改部分的指令,但是基本原理都是一样的
3)make过程
原生的编译安卓指令是make,入口文件是源码树根目录下名称为Makefile的文件,当在源代码根目录上调用 make 命令时,make 命令首先将读取该文件。Makefile 文件的内容只有一行:include build/core/main.mk。作用仅为包含 build/core/main.mk文件。在 main.mk 文件中又会去包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统
4)当全编译完一次之后,就可以进行各个模块的单元调试,比如framework或者package或者device下面需要编译apk或者jar的地方都能在可以执行mm的地方都会有个mk文件,mm就是通过mk文件去生效的
mm 编译当前目录下的模块,单独编译某个模块,需要cd到相应的含有mk(mk就是makefile的缩写)文件的目录下执行,如packages/apps/Settings$ mm
mmm 在跟目录下,执行某个文件夹下的make文件单独编译某个模块,可以在跟目录直接执行,后面跟需要编译的模块路径,如mmm packages/apps/Settings/
mm -B 强制编译所有的目标文件,mm为增量编译即只编译发生变化的目标文件
mma 将相关联的模块全部关联进来编译,比如有的时候全编译完后,再单独编译完Launcher3或者Settings时会提示缺少某个模块导致编译失败,此时可以用mma编译执行成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章