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系统编译脚本理解的更多相关文章

  1. Android系统编译时遇到的几个.mk的疑惑。

    在Android4.2的源代码Build/prduct_config.mk里面遇到几个疑惑: # Convert a short name like "sooner" into t ...

  2. Android系统编译【转】

    本文转载自;http://blog.csdn.net/zirconsdu/article/details/8005415 Android编译系统分析 概要 由于android编译系统的复杂和使用了不熟 ...

  3. H3 android 系统编译

    http://bbs.ickey.cn/group-topic-id-57981.html [Orange Pi PC试用体验]11编译android源码笔记 编译android和编译linux有点类 ...

  4. Android系统编译与测试

    1.Android系统分析 2.下载Android源代码(不包括Linux内核部分) 下载好了的Android_5.01.tar.gz,通过samba复制到ubuntu里,再解压之. 可以看到Andr ...

  5. Android系统编译环境初始化时Product产品的import-nodes过程

    从运行make -f config,mk文件開始,config,mk作为当前的makefile文件.将会被make解析,一般make解析Makefile文件流程首先是载入当中include的各种其它m ...

  6. Android 系统编译

    最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...

  7. Android系统编译环境及连接工具配置

    首先附上官网上关于环境搭建的地址:https://source.android.com/setup/build/initializing 官网目前建议的还是Ubuntu14.04,下面就是用的Ubun ...

  8. Android系统编译错误Note: Some input files use or override a deprecated API. 解决办法【转】

    本文转载自:http://blog.csdn.net/lilidejing/article/details/46564491 进入系统framework层修改了下MediaPlayer.java的源码 ...

  9. android系统编译打开系统蓝牙

    在项目配置文件ProjectConfig.mk中开启蓝牙以后,但是设置菜单中并没有出现蓝牙选项,最后发现是因为ProjectConfig.mk同级目录下没有蓝牙配置文件android.hardware ...

随机推荐

  1. 小巧的http live streaming m3u8播放器

    转载请注明: TheViper http://www.cnblogs.com/TheViper  原来发表过一篇分段播放的flash播放器.这个播放器其实就没有神马原理,就是把一个视频分成好几个视频, ...

  2. linux内核学习(一步一步走)——内核概述

    一.用户空间与内核空间: 用户通过用户空间与操作系统打交道,程序员开发或使用的应用程序位于用户空间.用户空间不能直接访问内核,从而不能访问硬件资源,但是可以通过内核定义的最外层例程——系统调用来访问. ...

  3. oracle 清除当前用户的回收站

    --清除当前用户的回收站:purge recyclebin;  --删除表数据truncate table --查看当前用户回收站select * from user_recyclebin t; 

  4. 学习总结 java 输入输出流

    思维导图 代码实际演示 package com.hanqi.io; import java.io.*; public class Test1 { public static void main(Str ...

  5. shell脚本循环执行mysql语句

    参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...

  6. Material Design参考资料

    传送门: http://www.uisdc.com/comprehensive-material-design-note

  7. 【drp 11】使用Junit简单测试接口方法

    一.Junit简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUn ...

  8. MFC读取XML文件并解析

    现在经常会对XML文件进行操作,怎么在MFC下去读和解析XML文件呢?直接上代码: 首先得等在stdafx.h中加入这句,以引入MSXML命名空间 #import <msxml3.dll> ...

  9. javascript 同步加载与异步加载

    HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面 ...

  10. 【Linux】freetds安装配置连接MSSQL

    我使用的是freetds-0.91,下载地址:http://pan.baidu.com/s/1hq68rZY 安装编译(根据需要unixodbc): [root@zabbixserver / ]# t ...