Android编译系统分析之envsetup.sh

本文深入分析Android编译系统中的envsetup.sh脚本,探讨了为何使用cd而非cd,如何定位TOP目录,shell脚本中长命令的多行写法,以及envsetup.sh的主要功能,包括设置croot、lunch、mm等函数,并介绍了lunch的执行过程和正则表达式的应用。

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

已开通新的博客,后续文字都会发到新博客

https://www.0xforee.top


Android 编译系统解析系列文档

编译系统入口envsetup.sh解析

解析lunch的执行过程以及make执行过程中include文件的顺序

关注一些make执行过程中的几个关键点

对一些独特的语法结构进行解析


我们用几个问题来解释这篇文章要讨论的内容

为什么用\cd 而不用cd

在android原代码的提交中,我们发现了这个解释:

Use “\cd” to disable alias temporarily.

使用\cd 来临时屏蔽alias别名

具体作用如下示例:

function mycd()
{
   
   
    echo "in mycd"
    cd $@
}
alias cd='mycd'

function cproj()
{
   
   
    pwd
    \cd .. 或者 cd ..
    pwd
}

cproj()

我们执行这个脚本,前者将会打印:

/home/foree/bin
/home/foree

后者将会打印:

/home/foree/bin
in mycd
/home/foree

android 如何定位TOP目录

循环递归,查找build/core/envsetup.mk这个路径下文件是否存在

function gettop
{
   
   
local TOPFILE=build/core/envsetup.mk
if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
	# The following circumlocution ensures we remove symlinks from TOP.
	(cd $TOP; PWD= /bin/pwd)
else
	if [ -f $TOPFILE ] ; then
        # The following circumlocution (repeated below as well) ensures
        # that we record the true directory name and not one that is
        # faked up with symlink names.
        PWD= /bin/pwd
	else
        local HERE=$PWD
        T=
        while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
        \cd ..
        T=`PWD= /bin/pwd -P`
 
<think>我们正在讨论envsetup.sh文件的作用。根据引用内容,特别是引用[1]和引用[3],envsetup.shAndroid开发环境和Rockchip的SDK中都有出现。它的主要作用是为当前终端会话设置环境变量和添加一些有用的命令(通常称为“lunch”命令等),以便于编译和开发工作。 具体来说,在Android开发中,envsetup.sh脚本会设置一些环境变量,如OUT_DIR(输出目录)等,并定义一些函数,如lunch(用于选择要构建的目标设备)、m(用于构建整个系统)、mm(用于构建当前目录下的模块)等。在Rockchip的SDK中,envsetup.sh同样用于设置编译环境,例如选择目标芯片型号(如rk3399、rk3308等)和配置编译选项。引用[3]中提到了envsetup.sh位于buildroot/build/目录下,并且通过执行`source envsetup.sh`来激活环境,然后可以选择配置(如示例中的选择65)。因此,envsetup.sh的作用可以总结为: 1.设置编译所需的环境变量。2.提供一些辅助函数或命令,方便开发者在终端中执行编译相关的操作。下面我们将详细说明envsetup.sh的功能,并给出一些使用示例。</think>envsetup.sh 脚本在软件开发(尤其是嵌入式系统开发)中扮演着**环境初始化核心角色**,主要功能是为当前终端会话配置编译环境。根据引用内容,其核心作用如下: ### 核心功能 1. **环境变量配置** - 设置工具链路径(如交叉编译器 `aarch64-linux-gnu-gcc`[^4]) - 定义编译输出目录(如 `OUT_DIR`) - 添加 SDK 关键路径到 `PATH` 变量[^3] 2. **构建目标选择** 通过交互式菜单(如 `lunch` 命令)选择目标设备型号: ```bash source envsetup.sh # 激活脚本 lunch # 弹出设备选择菜单 # 示例输出: # 1. rk3399-ubuntu # 2. rk3308-buildroot # 3. ... (输入数字选择配置)[^2][^3] ``` 3. **注册编译命令** 注入快捷命令到当前 Shell: - `make` → 触发完整构建流程 - `mkfirmware.sh` → 生成固件镜像[^3] - `rkflash.sh` → 烧写设备[^3] 4. **依赖关系校验** 检查编译工具链完整性(如 `gcc-linaro-6.3.1`[^4]),缺失时提示安装 ### 典型使用场景 ```mermaid graph LR A[打开终端] --> B[source envsetup.sh] B --> C{选择目标设备} C -->|输入编号| D[自动配置环境变量] D --> E[执行编译命令 make] ``` ### 技术实现特点 1. **作用域隔离** 通过 `source` 执行(非独立运行),使配置仅在**当前终端会话**生效,避免污染全局环境[^1][^2] 2. **跨平台支持** 兼容不同芯片架构(如 Rockchip RK3399/RK3308[^3][^4]),通过菜单动态加载配置 3. **模块化扩展** 支持添加自定义函数(如烧写命令 `rkflash.sh`)到 Shell 环境[^3] > **关键提示**:在 Rockchip SDK 中,该脚本是**编译流程的强制前置步骤**,直接执行 `make` 会触发错误: > `Makefile:3: *** “Please use 'source buildroot/build/envsetup.sh'...”[^2]`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值