首页 > 其他分享 >Android 编译系统分析

Android 编译系统分析

时间:2023-02-15 19:00:26浏览次数:59  
标签:分析 function vendorsetup echo lunch sh build Android 编译系统

在编译android project时,我们需要使用到makefile文件,通过makefile文件的规则来构建整个project

source build/envsetup.sh
lunch project_name
make -jx

envsetup.sh脚本

先看下source build/envsetup.sh做了哪些工作?

定义函数

在build/envsetup.sh里定义了很多函数

function hmm()   //显示帮助信息,列出所有支持的命令,比如lunch、mm、mmm等
function get_abs_build_var() //获取编译时一些变量的绝对路径(比如BUILD_SYSTEM)
function get_build_var()  //获取编译时一些变量的路径
function check_product()  //检查产品是否支持编译
function check_variant() //检查变量variant是否有效,只能是user、userdebug、eng
function printconfig() //打印配置信息

function choosecombo() //选择编译类型,release和debug中的一个
function add_lunch_combo() //增加lunch命令的选择项
function print_lunch_menu() //打印lunch命令可选择的项目列表
function lunch()  //lunch命令的执行逻辑

function gettop //获取Android源码根目录
function m() //m命令的执行逻辑
function findmakefile() //查找当前目录下Android.mk文件路径
function mm() //mm命令的执行逻辑
function mmm() //mmm命令的执行逻辑
function mma()
function mmma()
function croot() //进入Android源码根目录

function ggrep()
function jgrep()
function cgrep()
function resgrep()
function mangrep()
function sepgrep()
function getprebuilt

function smoketest()
function runtest()
function godir()

function make()

envsetup.sh做的第一个工作就是定义了许多函数,方便在编译过程中调用

添加编译参数

旧版本的Android,通过vendorsetup.sh使用add_lunch_comno来创建新项目,现在不使用这种方法了
定义完这些函数之后,在脚本的最后面。source_vendorsetup会遍历源码目录下device和vendor目录,查找
vendorsetup.sh,

fuction source_vendorsetup()
{
  for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
           `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
           `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
  do
      echo "including $f"
      . $f         //执行vendorsetup.sh文件
  done
  unset f
}
source_vendorsetup
addcompletions

addcompletions函数主要是查找sdk/bash_completion目录下所有的.bash文件,找到之后执行这些文件。
先看下vendorsetup.sh

add_lunch_combo aosp_shamu-userdebug # 显然是lunch命令用到的,放到lunch说明
add_lunch_combo aosp_shamu-eng # 这个是我加的

新的Android版本,执行add_lunch_comno会提醒add_lunch_combo is obsolete 废弃
print_lunch_menu函数
打印出全部的lunch-combo
具体是通过调用get_build_var函数来获得

function print_lunch_menu()
{
    local uname=$(uname)
    echo
    echo "You're building on" $uname
    echo
    echo "Lunch menu... pick a combo:"

    local i=1
    local choice
    for choice in $(TARGET_BUILD_APPS= get_build_var COMMON_LUNCH_CHOICES)
    do
        echo "     $i. $choice"
        i=$(($i+1))
    done

    echo
}

get_build_var函数
此函数通过调用build/soong/soong_ui.bash --dumpvar-mode $1来获取build variable编译变量
关于build/soong/soong_ui.bash的分析,见soong_ui.bash脚本

# Get the exact value of a build variable.
function get_build_var()
{
    if [ "$BUILD_VAR_CACHE_READY" = "true" ]
    then
        eval "echo \"\${var_cache_$1}\""
    return
    fi

    local T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    (\cd $T; build/soong/soong_ui.bash --dumpvar-mode $1)
}

新版本使用AndroidProducts.mk代替

标签:分析,function,vendorsetup,echo,lunch,sh,build,Android,编译系统
From: https://www.cnblogs.com/caseyzq/p/17124317.html

相关文章