您的位置:首页 > 移动开发 > Android开发

Android编译系统详解(一)

2014-04-22 19:51 225 查看
++++++++++++++++++++++++++++++++++++++++++

转载地址: http://blog.csdn.net/mr_raptor/article/details/7539978
++++++++++++++++++++++++++++++++++++++++++

介绍:
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。

Andriod编译系统使用自定义的编译工具生成,程序和文档。此篇文档只是简单的介绍一下:

android编译命令:

android编译系统是基于make的,要求 GNU make 为最新版本(因为android使用GNU make 的高级特性)。在编译之前应该先检查机器的make 版本。

使用命令: make -v[-version]

若显示的里面没有3.8及以上的版本,我们就需要升级make的版本。

Android官方的执行编译步骤如下:

1> source build/envsetup.sh:加载命令

2> lunch:选择平台编译选项

3> make:执行编译

详细解说,各个步骤操作内容:

1. source build/envsetup.sh

目地:用来将 envsetup.sh 里的所有用到的命令加载到环境变量里去。

文件 envsetup.sh 里的主要命令如下:

#
# Vim build/envsetup.sh
#
function get_abs_build_var()     # 获得一个绝对变量
function get_build_var()     # 获得变量
function check_product()     # 检查product
function check_variant()     # 检查变量
function setpaths()     # 设置文件路径
function printconfig()    # 打印配置
function set_stuff_for_environment()    # 设置环境变量
function set_sequence_number()  # 设置序列号
function settitle()     # 设置标题
function addcompletions()    #
function choosetype()     # 设置type
function chooseproduct()    # 设置product
function choosevariant()    # 设置variant
function choosecombo()     设置编译参数
function tapas()    #功能同上choosecombo()
function add_lunch_combo()     # 添加lunch选项
function print_lunch_menu()    # 打印lunch列表
function lunch()      # 配置lunch,选择编译的平台
function _lunch() 	# Tab completion for lunch.
function gettop
function m()     # make from top
function findmakefile()     # 查找makefile
function mm()     # make from current directory
function mmm()     # make the supplied directories
function croot()    # 回到根目录
function cproj()    # 回到项目
function pid()
function systemstack()
function gdbclient()
function gettargetarch
function jgrep()     # 查找java文件
function cgrep()     # 查找c/cpp文件
function resgrep()
function getprebuilt
function tracedmdump()
function runhat() function getbugreports()
function getsdcardpath()
function getscreenshotpath()
function getlastscreenshot()
function startviewserver()
function stopviewserver()
function isviewserverstarted()
function key_home()
function key_back()
function key_menu()
function smoketest()
function runtest()
function godir ()     # 跳到指定目录

# 这是系统自动增加了一个默认的编译项  full-eng, full_x86-eng# add the default one here
add_lunch_combo full-eng
add_lunch_combo full_x86-eng

#查找vendorsetup.sh文件,如果查到了,就加载它
# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find device -maxdepth 6 -name 'vendorsetup.sh' 2> /dev/null`
do
echo "including $f"
. $f
done





































































































































































































根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envsetup.sh最后,添加上add_lunch_combo myProduct-eng;当然这么做,不太符合上面代码最后的本意,我们还是老实的在目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项

2. 按照android官网的步骤,开始执行 lunch

选择编译的平台执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项,选择需要编译的平台即可。

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

eng是产品的编译类型,除了eng外,还有user, userdebug

分别表示: eng ------ 工程机

user ------最终用户机

userdebug ------- 调试测试机

下面是分析lunch()函数
function lunch()
{
local answer
if [ "$1" ] ; then
#lunch后面直接带参数,eg:lunch full-eng
answer=$1
else
#lunch 后面没有带参数
print_lunch_menu
echo -n "Which would you like? [full-eng] "
read answer
fi

local selection=

if [ -z "$answer" ]
then
# 如果用户在菜单中没有选择,直接回车,则为系统缺省的full-eng
selection=full-eng
elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
then
# 如果answer是选择菜单的数字,则获取该数字对应的字符串
if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
then
selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
fi
# 如果 answer字符串匹配 *-*模式(*的开头不能为-)
elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
then
selection=$answer
fi

if [ -z "$selection" ]
then
echo
echo "Invalid lunch combo: $answer"
return 1
fi

export TARGET_BUILD_APPS=

# 将 product-variant模式种的product分离出来
local product=$(echo -n $selection | sed -e "s/-.*$//")
# 检查 product
check_product $product
if [ $? -ne 0 ]
then
echo
echo "** Don't have a product spec for: '$product'"
echo "** Do you have the right repo manifest?"
product=
fi

# 将 product-variant模式种的product分离出来
local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
check_variant $variant
if [ $? -ne 0 ]
then
echo
echo "** Invalid variant: '$variant'"
echo "** Must be one of ${VARIANT_CHOICES[@]}"
variant=
fi

if [ -z "$product" -o -z "$variant" ]
then
echo
return 1
fi

if [ "$variant" = "userdebug_gms" ]
then
variant=userdebug
export USE_GMS_ALL=true
else
export USE_GMS_ALL=false
fi

export TARGET_PRODUCT=$product
export TARGET_BUILD_VARIANT=$variant
export TARGET_BUILD_TYPE=release

echo

# 设置到环境变量
set_stuff_for_environment
printconfig
}
由上面的分析可知,lunch命令可以带参数和不带参数,最终导出一些重要的环境变量。从而影响到编译的结果。

此时已经完成两个步骤,接着就执行 make 命令,下篇分析。。。。

# 更新代码的api接口,

make update-api

#编译代码

make -j4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: