Android源码编译之 lunch命令分析及user和userdebug编译选项区别

不同厂商在编译Android系统时,会选择不同产品和编译版本。在Android编译过程中,通过source,lunch来选择。

1、souuce build/envsetup.sh:加载命令

2、lunch:选择平台等编译选项

3、make:编译

我们按照编译步骤分析编译过程,最终添加自己的平台编译选项。

1、souuce build/envsetup.sh

envsetup.sh定义了众多命令,在执行该脚本是向编译系统添加编译指令。

function help()                  # 显示帮助信息
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 choosetype()               # 设置type
function chooseproduct()              # 设置product
function choosevariant()              # 设置variant
function tapas()                  # 功能同choosecombo
function choosecombo()               # 设置编译参数
function add_lunch_combo()             # 添加lunch项目
function print_lunch_menu()            # 打印lunch列表
function lunch()                 # 配置lunch
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 jgrep()                 # 查找java文件
function cgrep()                  # 查找c/cpp文件
function resgrep()
function tracedmdump()

首先关注add_lunch_combo函数,用来用lunch列表添加编译选项。


# Clear this variable.  It will be built up again when the vendorsetup.sh
# files are included at the end of this file.
unset LUNCH_MENU_CHOICES
# 保存编译选项
function add_lunch_combo()
{
    local new_combo=$1   # 获得add_lunch_combo被调用时的参数
    # 依次遍历LUNCH_MENU_CHOICES里的值,其实该函数第一次调用时,该值为空
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    # 如果参数的值不存在,则添加到LUNCH_MENU_CHOICES变量里
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
}

在执行source build/envsetup.sh时,会设置默认的一些编译选项:

add_lunch_combo aosp_arm-eng
add_lunch_combo aosp_arm64-eng
add_lunch_combo aosp_mips-eng
add_lunch_combo aosp_mips64-eng
add_lunch_combo aosp_x86-eng
add_lunch_combo aosp_x86_64-eng

同时,各个厂商会在/device目录下定义自己的编译选项,如Android/device/qocm/msm8909w/common/vendorsetup.sh.

add_lunch_combo msm8909w-userdebug
add_lunch_combo msm8909w-user

所以,envsetup.sh作用如下:

  • 加载了编译时使用到的函数命令,如:help,lunch,m,mm,mmm等
  • 添加了默认编译选项:aosp_arm-eng等系统默认选项
  • 查找build/<-厂商目录>/和build/<厂商目录>/build/目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项
2、lunch

当我们source build/envsetup.sh后,将执行lunch,单纯执行lunch将这样输出:

zl@ubuntud:~/Android$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. mini_emulator_arm64-userdebug
     8. m_e_arm-userdebug
     9. mini_emulator_x86_64-userdebug
     10. mini_emulator_x86-userdebug
     11. msm8909_512-userdebug
     12. msm8909_LMT-userdebug
     13. msm8909w-userdebug
     14. msm8909w-user

Which would you like? [aosp_arm-eng]

lunch函数在envsetup.sh中定位为:

function lunch()
{
    local answer

    if [ "$1" ] ; then
    # lunch 后面加了参数,变量answer赋值为参数
        answer=$1
    else
    # lunch没有参数,则打印
    # lunch menu,即从LUNCH_MENU_CHOICES输出不同选项
        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
    # 用户输入0-9或者某个编译选项
    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
    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=
    # 取出variant
    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
    # 取出product
    local product=$(echo -n $selection | sed -e "s/-.*$//")
    TARGET_PRODUCT=$product \
    TARGET_BUILD_VARIANT=$variant \
    build_build_var_cache
    if [ $? -ne 0 ]
    then
        echo
        echo "** Don't have a product spec for: '$product'"
        echo "** Do you have the right repo manifest?"
        product=
    fi

    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi
    # 从编译选项获得PRODUCT和VARIANT
    # PRODUCT为msm8909w,VARIANT为userdebug
    # 到处为全局环境变量
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release

    echo
    #设置其他环境变量
    set_stuff_for_environment
    # 打印配置信息
    printconfig
    destroy_build_var_cache
}

因此,lunch影响到的环境变量有以下四个:

TARGET_PRODUCT=msm8909w
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=

这里我们可以看到,通过TARGET_BUILD_VARIANT这个全局变量,可以区分编译选项时user还是userdebug。

这个工将在/device/qcom/msm8909/base.mk这样的base.mk中设置一个prop,来限制adb这个daemon进程获取root权限:

ifeq ($(TARGET_BUILD_VARIANT),user)
PRODUCT_DEFAULT_PROPERTY_OVERRIDES+= \
    ro.adb.secure=1
endif

adb的deamon进程通过base.mk中设置的prop来确定是否可以给adb root权限。user版adb将无法获取root权限而受到限制。

@/system/core/adb/daemon/main.cpp
int adbd_main(int server_port) {
    umask(0);
    signal(SIGPIPE, SIG_IGN);

    init_transport_registration();

    // We need to call this even if auth isn't enabled because the file
    // descriptor will always be open.
    adbd_cloexec_auth_socket();

    if (ALLOW_ADBD_NO_AUTH && property_get_bool("ro.adb.secure", 0) == 0) {
        auth_required = false;
    }

    if(check_adb_root_enable())
       auth_required = false;

    adbd_auth_init();
    ...
}
lunch msmnile_gvmq-userdebug常见错误可能包括: 1. 缺少设备驱动程序:在加载lunch msmnile_gvmq-userdebug时,可能会遇到设备驱动程序缺失的问题。这可能导致设备无法正常启动或某些功能无法正常工作。解决方法是检查设备的驱动程序是否正确安装,并安装缺失的驱动程序。 2. 依赖项错误:在构建lunch msmnile_gvmq-userdebug时,可能会出现依赖项错误,这通常指控制版本不正确或缺失某些库文件。解决方法是确保正确的依赖项安装配置,并更新相关的库文件。 3. 编译错误:如果lunch msmnile_gvmq-userdebug构建过程中遇到编译错误,那么可能是由于代码中的语法错误、引用错误或其他编码问题。解决方法是仔细检查错误消息并修改相关代码,确保没有语法错误逻辑错误。 4. 内存问题:lunch msmnile_gvmq-userdebug构建时可能会遇到内存问题,例如内存耗尽或内存溢出。解决方法包括增加系统内存、优化代码以减少内存使用量,或使用其他构建选项来处理内存问题。 5. 网络问题:在执行lunch msmnile_gvmq-userdebug命令时,可能会遇到网络连接错误或下载失败的问题。这可能是由于网络不稳定、服务器问题或网络配置错误引起的。解决方法是检查网络连接,并确保网络可靠正确配置。 总的来说,解决lunch msmnile_gvmq-userdebug常见错误需要仔细分析错误消息,并采取相应的解决方法。这可能涉及到安装驱动程序、更新依赖项、修复编译错误、处理内存问题或调整网络设置等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值