android8.1 source build/envsetup.sh分析 增加删除lunch

本文详细解读了Android编译过程中初始化参数设置、环境变量检查、lunch选择等关键步骤,包括source build/envsetup.sh的命令分析和lunch菜单的构建原理。重点介绍了如何通过add_lunch_combo添加不同平台分支以及配置输出目录和环境变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/weixin_39694445/article/details/84753142

Android 编译过程

1.  初始化参数设置  环境变量

2.  检查环境变量  配置目标环境(导入luncher)

3.  选择lunch  读取目标配置平台信息(分支特性、文件)

4.  清空输出目录

5.  执行编译

6.  打包


source build/envsetup.sh  分析

1.  加载编译命令

- lunch:     lunch <product_name>-<build_variant>
- tapas:     tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
- croot:     Changes directory to the top of the tree.
- m:         Makes from the top of the tree.
- mm:        Builds all of the modules in the current directory, but not their dependencies.
- mmm:       Builds all of the modules in the supplied directories, but not their dependencies.
             To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma:       Builds all of the modules in the current directory, and their dependencies.
- mmma:      Builds all of the modules in the supplied directories, and their dependencies.
- provision: Flash device with all required partitions. Options will be passed on to fastboot.
- cgrep:     Greps on all local C/C++ files.
- ggrep:     Greps on all local Gradle files.
- jgrep:     Greps on all local Java files.
- resgrep:   Greps on all local res/*.xml files.
- mangrep:   Greps on all local AndroidManifest.xml files.
- mgrep:     Greps on all local Makefiles files.
- sepgrep:   Greps on all local sepolicy files.
- sgrep:     Greps on all local source files.
- godir:     Go to the directory containing a file.

执行后是这样的

godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1$ source build/envsetup.sh 
including device/asus/fugu/vendorsetup.sh
including device/generic/car/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/uml/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/google/muskie/vendorsetup.sh
including device/google/taimen/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including sdk/bash_completion/adb.bash

2.  加载平台信息

godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1$ 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. full_fugu-userdebug
     8. aosp_fugu-userdebug
     9. aosp_car_emu_arm-userdebug
     10. aosp_car_emu_arm64-userdebug
     11. aosp_car_emu_x86-userdebug
     12. aosp_car_emu_x86_64-userdebug
     13. mini_emulator_arm64-userdebug
     14. m_e_arm-userdebug
     15. m_e_mips64-eng
     16. m_e_mips-userdebug
     17. mini_emulator_x86_64-userdebug
     18. mini_emulator_x86-userdebug
     19. uml-userdebug
     20. aosp_dragon-userdebug
     21. aosp_dragon-eng
     22. aosp_marlin-userdebug
     23. aosp_marlin_svelte-userdebug
     24. aosp_sailfish-userdebug
     25. aosp_walleye-userdebug
     26. aosp_walleye_test-userdebug
     27. aosp_taimen-userdebug
     28. aosp_angler-userdebug
     29. aosp_bullhead-userdebug
     30. aosp_bullhead_svelte-userdebug
     31. hikey-userdebug
     32. hikey960-userdebug

Which would you like? [aosp_arm-eng] 

这里打开  build/envsetup.sh  分析 lunch函数  可以发现lunch后面的选择项是由LUNCH_MENU_CHOICES提供的

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))]}
        ...
}

LUNCH_MENU_CHOICES  是在add_lunch_combo()中被添加进去的 也就是说add_lunch_combo()就是添加lunch分支

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)
}

在执行了  source build/envsetup.sh  后会  including device/asus/fugu/vendorsetup.sh  这些脚本  会发现这些脚本本质上就是调用add_lunch_combo来添加lunch分支的

#
# Copyright 2013 The Android Open Source Project
...

add_lunch_combo full_fugu-userdebug
add_lunch_combo aosp_fugu-userdebug

执行lunch 6  OUT_DIR  输出目录

PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=8.1.0
TARGET_PRODUCT=aosp_x86_64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_PLATFORM_VERSION=OPM1
TARGET_BUILD_APPS=
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_CPU_VARIANT=
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=x86_64
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-142-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=OPM1.171019.011
OUT_DIR=out
AUX_OS_VARIANT_LIST=

继续执行  export   查看当前环境变量

...
declare -x ANDROID_BUILD_TOP="/home/godv/godv/AOSP/android-8.1.0_r1"
declare -x ANDROID_DEV_SCRIPTS="/home/godv/godv/AOSP/android-8.1.0_r1/development/scripts:/home/godv/godv/AOSP/android-8.1.0_r1/prebuilts/devtools/tools:/home/godv/godv/AOSP/android-8.1.0_r1/external/selinux/prebuilts/bin:/home/godv/godv/AOSP/android-8.1.0_r1/prebuilts/misc/linux-x86/dtc:/home/godv/godv/AOSP/android-8.1.0_r1/prebuilts/misc/linux-x86/libufdt"
declare -x ANDROID_EMULATOR_PREBUILTS="/home/godv/godv/AOSP/android-8.1.0_r1/prebuilts/android-emulator/linux-x86_64"
declare -x ANDROID_HOST_OUT="/home/godv/godv/AOSP/android-8.1.0_r1/out/host/linux-x86"
declare -x ANDROID_HOST_OUT_TESTCASES="/home/godv/godv/AOSP/android-8.1.0_r1/out/host/linux-x86/testcases"
declare -x ANDROID_JAVA_TOOLCHAIN="/usr/lib/jvm/java-8-openjdk-amd64/bin"
declare -x ANDROID_PRE_BUILD_PATHS="/usr/lib/jvm/java-8-openjdk-amd64/bin:"
declare -x ANDROID_PRODUCT_OUT="/home/godv/godv/AOSP/android-8.1.0_r1/out/target/product/generic_x86_64"
...

不同的分支下面有sh中对应的mk  里面配置了不同的命令

在Ubuntu 20.04上编译Android 8.1源代码需要一些基本的步骤和配置。下面是一个大致的步骤指南: 1. 安装必要的开发工具和依赖项: - 打开终端,运行以下命令安装Java开发工具包(JDK): ``` sudo apt install openjdk-8-jdk ``` - 安装必要的构建工具: ``` sudo apt install bison g++ g++-multilib git make python-networkx zlib1g-dev:i386 ``` 2. 下载Android源代码: - 在你喜欢的位置创建一个目录,用于存放源代码: ``` mkdir android cd android ``` - 初始化Git仓库并同步源代码: ``` repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1 repo sync -j4 ``` 3. 配置环境变量: - 编辑`~/.bashrc`文件: ``` nano ~/.bashrc ``` - 在文件末尾添加以下内容并保存: ``` export PATH="$PATH:/path/to/android/tools" export PATH="$PATH:/path/to/android/platform-tools" ``` 4. 编译源代码: - 返回`android`目录,运行以下命令初始化编译环境: ``` source build/envsetup.sh lunch ``` - 选择你想要编译的模式,例如`aosp_arm-eng`。 - 开始编译: ``` make -j4 ``` - 这个过程可能需要一些时间,具体视你的计算机性能而定。 完成上述步骤后,你将获得编译好的Android 8.1系统。请注意,编译过程中可能会遇到一些问题,例如依赖项缺失或配置错误等。在遇到问题时,你可以通过Google、Stack Overflow等社区获取帮助和解决方案,以便成功编译Android 8.1源代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值