Android系统编译脚本理解
android源码编译步骤:
1. repo sync 代码(下载代码)
2.start branch(用哪个分支,git相关)
3. 到根目录(android目录)
$cd android/
4. 加载编译选项(函数调用之类,相当于include一些函数)
$ source build/envsetup.sh
5.加载lunch
$lunch [product]-userdebug
6.开始编译
$m (or mm or mmm or make)
7. 会产生一个out目录
分析编译脚本:
repo,git我就不讲了,网上一堆资料。
1、分析 build/envsetup.sh文件
1. $(gettop) 是指退回到android根目录(android/)
2. 然后加载build/core/main.mk
2. 那么我们就去看看build/core/main.mk文件
版本相关(java,make版本),default target(DEFAULT_GOAL := droid)
比较重要的:
1. 定义
BUILD_SYSTEM := $(TOPDIR)build/core
definations.mk中定义了很多编译系统中用到的宏
TARGET_BUILD_VARIANT 在buildspec.mk设定,这个参数决定了要安装的模块。(eng,user,userdebug)
2.include $(BUILD_SYSTEM)/Makefile
system.img、boot.img和recovery.img等镜像文件的生成规则。
3.include $(BUILD_SYSTEM)/config.mk
该文件根据lunch命令所配置的产品信息在build/target/board、vendor或者device目录中找到对应的BoradConfig.mk文件,
以及通过加载build/core/product_config.mk文件在build/target/product、vendor或者device目录中找到对应的AndroidProducts.mk文件,
来进一步对编译环境进行配置,以便接下来编译指定模块时可以获得必要的信息。
4. dont_bother_goals
如果在执行make命令时,指定的不是清理文件相关的目标(clean、clobber、dataclean和installclean等目标),
dont_bother=true,表示接下来要执行的是编译命令。
5. ONE_SHOT_MAKEFILE不为空 & dont_bother == true
ONE_SHOT_MAKEFILE不为空
1)执行mm命令时会用到,使用当前目录下的mk文件
2)ONE_SHOT_MAKEFILE 在build/envsetup.sh定义(mm or mmm函数)
3)ALL_MODULES 为编译时相关依赖的module都需加进去,不需要的就不会加载编译。
dont_bother == true
1)相当于执行m命令,加载编译android根目录下的所有Android.mk
2)不包括.repo,out,.git目录
3)执行build/tools/findleaves.py找所有的Android.mk
6. 指定生成目录,开始编译
参考下图:
Makefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk
-> build/core/product.mk中定义的函数get-all-product-makefiles ,来遍历整个device的子目录, 所有的 AndroidProducts.mk,
PRODUCT_DEVICE 赋值给TARGET_DEVICE(build/core/config.mk)然后把BoardConfig.mk包含进来(include $(TARGET_DEVCIE)/BoardConfig.mk)
device下面的vendorsetup.sh中会添加lunch menu
后面的篮框里是编译规则相关。
显然build/core/main.mk中会指定生成目录,在build/core/Makefile中打包生成img镜像文件。
参考:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
Android系统编译脚本理解的更多相关文章
- Android系统编译时遇到的几个.mk的疑惑。
在Android4.2的源代码Build/prduct_config.mk里面遇到几个疑惑: # Convert a short name like "sooner" into t ...
- Android系统编译【转】
本文转载自;http://blog.csdn.net/zirconsdu/article/details/8005415 Android编译系统分析 概要 由于android编译系统的复杂和使用了不熟 ...
- H3 android 系统编译
http://bbs.ickey.cn/group-topic-id-57981.html [Orange Pi PC试用体验]11编译android源码笔记 编译android和编译linux有点类 ...
- Android系统编译与测试
1.Android系统分析 2.下载Android源代码(不包括Linux内核部分) 下载好了的Android_5.01.tar.gz,通过samba复制到ubuntu里,再解压之. 可以看到Andr ...
- Android系统编译环境初始化时Product产品的import-nodes过程
从运行make -f config,mk文件開始,config,mk作为当前的makefile文件.将会被make解析,一般make解析Makefile文件流程首先是载入当中include的各种其它m ...
- Android 系统编译
最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...
- Android系统编译环境及连接工具配置
首先附上官网上关于环境搭建的地址:https://source.android.com/setup/build/initializing 官网目前建议的还是Ubuntu14.04,下面就是用的Ubun ...
- Android系统编译错误Note: Some input files use or override a deprecated API. 解决办法【转】
本文转载自:http://blog.csdn.net/lilidejing/article/details/46564491 进入系统framework层修改了下MediaPlayer.java的源码 ...
- android系统编译打开系统蓝牙
在项目配置文件ProjectConfig.mk中开启蓝牙以后,但是设置菜单中并没有出现蓝牙选项,最后发现是因为ProjectConfig.mk同级目录下没有蓝牙配置文件android.hardware ...
随机推荐
- GlusterFS特性介绍
下面是GlusterFS的一些特性 规范的接口 GlusterFS服务器与POSIX兼容,使用支持文件扩展属性的磁盘文件系统(如ext4.XFS)来存储磁盘上的数据.同时,可以通过业界标准的访问协议如 ...
- 【PL/SQL练习】控制结构
1.if判断: if-then-end if: SQL> declare v_ename emp.ename%type; v_sal emp.sal%type; begin select ena ...
- 【练习】如何显示本地主机上的MySQL客户机版本
在终端窗口以oracle用户身份登录 [root@enmo ~]# su - oracle [oracle@enmo ~]$ mysql -V mysql Ver , for Linux (x86_6 ...
- Eclipse中Jsp页面警告的解决方法小结
恩,只要是开发人员,这样的小事情总会遇到的,对于这其中的某些警告性的错误是不影响代码的运行的,对应的功能也是能实现的,不过总给人一种不太好看的感觉!如果代码写的比较符合规范,这些问题也就自然而然的消失 ...
- 感受机房管理化繁为简-新款KVM使用心得
感受机房管理化繁为简-新款KVM使用心得 一. 背景 随着网络应用的不断增多,各地机房服务器数量也随之增加,利用多传统主机切换器的方式已经无法满足目前这种区域广.设备多人员紧缺的现状,而且即使是使用了 ...
- 学习STL-介绍一下STL
从大学时就开始学习C++,到现在近5年的时间了却很少用到STL.现在想想真得是对不起这门语言,也对不起宝贵的五年光阴.我钟爱C++,所以一定要完全搞懂它,理解它.爱一个人的前提是要懂他(她),爱一门语 ...
- JS基础学习1——什么是基础js类和原型?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript中的Get和Set访问器
今天要和大家分享的是JavaScript中的Get和Set访问器,和C#中的访问器非常相似. 标准的Get和Set访问器的实现 function Field(val){ this.va ...
- Linux下切换用户
0x01 使用命令[su username] 这种方法能切换普通用户和root用户 0x02 从普通用户切换到root用户,还可以使用命令[sudo su] 0x03 su 是switch user的 ...
- Solaris的vi
进入输入模式i: 在光标之前插入a: 在光标之后插入o: 在下面新建一行输入I: 光标移动到本行首插入A: 光标移动到本行末尾插入O: 在上面新建一行输入 移动光标M:移到屏幕中间一行的行首L:移到屏 ...