android系统编译流程,Android系统编译流程详解(二)

0338a672a944

目录

编译源码步骤

google给出的编译步骤如下:

source build/envsetup.sh:加载命令

lunch:选择平台编译选项

make:执行编译

那么每一步都做了什么呢?

build/envsetup.sh

打开build/envsetup.sh文件:

(Android P版本下)

0338a672a944

image.png

可以看到有许多的函数.

函数名

含义

hmm()

显示帮助信息

lunch

配置lunch

tapas

tapas

croot

回到根目录

m

make from top

mm

Builds all of the modules in the current directory,

mma

Builds all of the modules in the current directory

mmma

Builds all of the modules in the supplied directories,

cgrep

查找c/c++文件

ggrep

查找所有的文件

jgrep

查找java文件

resgrep

查找xml文件

mangrep

查找Manifest.xml文件

mgrep

查找所有的mk文件

sepgrep

查找sepolicy文件

sgrep

查找源码文件

godir

跳转指定目录

get_abs_build_var

获取绝对变量

get_build_var

获取绝对变量

check_product

检查product

check_variant

检查变量

setpaths

设置文件路径

printconfig

打印配置

set_stuff_for_environment

设置环境变量

set_sequence_number

设置序号

settitle

设置标题

choosetype

设置type

chooseproduct

设置product

choosevariant

设置variant

tapas

功能同choosecombo

choosecombo

设置编译参数

有兴趣的可以看一下源码.O(∩_∩)O

执行:

source build/envsetup.sh

0338a672a944

在脚本最后,执行以下代码,来加载各个区域的vendorsetup.sh文件.

if [ "x$SHELL" != "x/bin/bash" ]; then

case `ps -o command -p $$` in

*bash*)

;;

*)

echo "WARNING: Only bash is supported, use of other shell would lead to err oneous results"

;;

esac

fi

# Execute the contents of any vendorsetup.sh files we can find.

for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/n ull | sort` \

`test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/n ull | sort` \

`test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev /null | sort`

do

echo "including $f"

. $f

done

查看下device/google/marlin/vendorsetup.sh文件,可以看到:

0338a672a944

image.png

文件中调用了add_lunch_combo命令.

add_lunch_combo命令的定义在文件build/envsetup.sh中:

function add_lunch_combo()

{

local new_combo=$1

local c

for c in ${LUNCH_MENU_CHOICES[@]} ; do

if [ "$new_combo" = "$c" ] ; then

return

fi

done

LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)

}

可以看出,编译时,就是通过add_lunch_combo将编译选项传递给lunch的.

lunch

先来看下lunch的实现:

function lunch()

{

local answer

if [ "$1" ] ; then

answer=$1

else

print_lunch_menu

echo -n "Which would you like? [aosp_arm-eng] "

read answer

fi

local selection=

if [ -z "$answer" ]

then

selection=aosp_arm-eng

elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")

then

if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]

then

selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}

fi

else

selection=$answer

fi

export TARGET_BUILD_APPS=

local product variant_and_version variant version

product=${selection%%-*} # Trim everything after first dash

variant_and_version=${selection#*-} # Trim everything up to first dash

if [ "$variant_and_version" != "$selection" ]; then

variant=${variant_and_version%%-*}

if [ "$variant" != "$variant_and_version" ]; then

version=${variant_and_version#*-}

fi

fi

if [ -z "$product" ]

then

echo

echo "Invalid lunch combo: $selection"

return 1

fi

TARGET_PRODUCT=$product \

TARGET_BUILD_VARIANT=$variant \

TARGET_PLATFORM_VERSION=$version \

build_build_var_cache

if [ $? -ne 0 ]

then

return 1

fi

export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)

export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)

export TARGET_PLATFORM_VERSION=$(get_build_var TARGET_PLATFORM_VERSION)

export TARGET_BUILD_TYPE=release

echo

set_stuff_for_environment

printconfig

destroy_build_var_cache

}

lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局量

liunch大致实现了导出一些重要的环境变量,从而影响编译系统的编译结果。

0338a672a944

image.png

接下来就是make了.

make的内容比较多,明天再继续make.O(∩_∩)O

打完收工.

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值