安卓系统编译

目录

Android 编译系统的组成

准备编译

设置环境

选择目标

如何查看源码的版本

Android编译过程

1.编译

a.编译步骤

b.编译结果及目录

c.编译生成的主要镜像文件

2.编译过程详解

a.source 过程

b. lunch过程

c. Make 过程

android-3288


以下参考网上,结合3288进行整理

Android 编译系统的组成

参考网上

Android 和 Linux 的编译系统都是通过 Makefile 工具来组织编译源代码的。

Makefile 工具用来解释和执行 Makefile 文件,在 Makefile 文件里定义好工程源代码的编译规则,通过 make 命令即可以完成对整个工程的自动编译。

 

1、Makefile:编译系统的入口 Makefile 文件,在系统根目录下,只有一行代码,包含 build/core/main.mk。

2、build/core/main.mk:主要 Makefile,定义了 Android 编译系统的主线。

3、build/core/config.mk:根据用户输入的编译选项导出配置变量,影响编译目标。

4、build/core/envsetup.mk:定义大量全局变量,用户编译配置。

5、build/core/product_config.mk:根据用户选择的目标产品,定义编译结果输出目录。

6、device/*/$(TARGET_DEVICE)/BoardConfig.mk:根据用户选择的目标产品找到对应的设备 TARGET_DEVICE,加载设备的板级配置。

7、build/core/definitions.mk:定义编译过程中用到的大多数变量和宏,是编译系统的函数库。

8、MODULES_DIR/Android.mk:每个模块的规则定义文件,它出现在每个要编译的目录下,我们可以向 Android 系统中添加自己的模块,来达到定制系统的目的。

9、build/core/Makefile:Android 编译目标规则定义文件,最终编译结果在该文件中定义,如 system.img、boot.img 等。
 

准备编译

设置环境

使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

source build/envsetup.sh

选择目标

使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。

lunch aosp_arm-eng

直接运行 lunch (没有参数),会列出所有支持的类型,输入对应的序号来进行选择。

所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

编译类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置

如何查看源码的版本

1、 从代码中查看当前版本,找到如下文件

build/core/version_defaults.mk

搜索关键字 PLATFORM_VERSION

 

Android编译过程

当前目录下编译执行,相当于在android目录下执行make 本文介绍Android的编译过程及各种mk文件的导入

1.编译


a.编译步骤

$ source ./build/envetup.sh 
# 这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去 
选择编译目标 
$ lunch aosp_arm-eng 
编译 
$ make -j16 

参数N表示并行编译的任务数,一般N为cpu线程数的1-2倍.例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令

b.编译结果及目录

  • out/ :所有的编译产物都将位于out目录下,该目录下主要有以下几个子目录
  • -out/host/ :该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等
  • out/target/common/ :该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。
  • out/target/product// :包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,是具体目标设备的名称。
     

c.编译生成的主要镜像文件

ramdisk.img

  • 是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件;
  • 在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程

boot.img

  • 由boot header、kernel和ramdisk三部分打包在一起组成
  • 启动时,由bootloader解析后引导kernel启动

system.img

  • 被挂载到/system目录下
  • 包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序

userdata.img

  • 被挂载到/data目录下
  • 包含了应用程序相关的数据以及和用户相关的数据
  • 可以预制一些可删除的应用软件
     

2.编译过程详解

a.source 过程

source命令:在当前bash环境下 读取并执行 FileName中的命令;$ source ./build/envsetup.sh 读取envsetup.sh 中的函数,并执行脚本 。

  • 加载的函数有

- 执行脚本:

1.执行add_lunch_combo xxxxx

2.检查shell是否为bash,

3.查找 vendorsetup.sh,并 include ;

4.输出所有的include文件

5,执行addcompletions() 检查bash版本;

b. lunch过程

lunch <product_name>-<build_variant>,选择平台编译选项

c. Make 过程

makefile的相关语法请参考Makefile语法一文或其他书籍。

入口文件是源码树根目录下名称为Makefile的文件,当在源代码根目录上调用 make 命令时,make 命令首先将读取该文件。Makefile 文件的内容只有一行:include build/core/main.mk。作用仅为包含 build/core/main.mk文件。在 main.mk 文件中又会去包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。

比较重要的make文件介绍:
devices/xxxxx/BoardConfig.mk,AndroidBoard.mk 
BoardConfig.mk设备硬件配置及目标架构配置文件.
AndroidBoard.mk设备属性和键值映射配置文件.
TARGET_KERNEL_CONFIG/KERNEL_DEFCONFIG:定义默认kernelconfig文件;
 

编译得到:resource.img和kernel.img两个文件

 

android-3288

elif [ $2 == "android" -o $2 == "android/" ]
			then
			{
        			echo make clean android
				source  build.sh 
				make clean
				pushd linux_update/rockdev/Image/
				rm misc.img boot.img recovery.img system.img
				popd
			}
elif [ $1 == "android" -o $1 == "android/" ]
	then
	{
		source  build.sh
		make -j $MAKE_THEARD
		if [ $? -eq 0 ]; then
                        echo "Build android ok!"
                else
                        echo "Build android failed!"
                        exit 1
                fi
		./mkimage.sh
	}

结合这两处,编译得到:misc.img boot.img recovery.img system.img

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值