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

2023-10-29

不同厂商在编译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();
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android源码编译之 lunch命令分析及user和userdebug编译选项区别 的相关文章

  • Unity之Animation窗口

    一 Animation窗口是用来干啥的 Animation窗口 直译就是动画窗口 它主要用于在Unity内部创建和修改动画 所有在场景中的对象都可以通过Animation窗口为其制作动画 二 打开Animation窗口 Window gt
  • Github上的十大机器学习项目

    原文作者 Matthew Mayo 译文地址 Top 10 Machine Learning Projects on Github 文章译者 赵屹华 搜狗计算广告工程师 前生物医学工程师 关注推荐算法 机器学习领域 文章审校 刘帝伟 Git
  • 学1个月爬虫就月赚6000?别被骗了,我来告诉你真实情况

    这是我前几天看到的一个真实事件 也是我写这篇文章的缘由 前几天有粉丝跟我反馈说 某机构的人跟他说学爬虫1个月就能接单 让这小伙子去报名那个机构的爬虫课程 学完之后1个月就能把6000多的学费赚回来 可能是因为我和粉丝的交流比较多 所以小伙子
  • 2.Python简介、特点、安装配置、pip包管理命令

    Python简介 Python 语言 语言 人与人之间交流需要语言 比如说汉语 英语 编程语言就是人与机器交流的语言 面向过程往面向对象的过渡 例 C C C sharp Java是面向对象 面向过程 面向过程可以认为是流程 一步一步操作
  • HMM隐马尔可夫模型进行中文文本分词

    文章目录 一 HMM简述 1 引入 2 隐马尔科夫模型 1 定义 Definition of a hidden Markov model 2 应用 3 前向算法 了解 4 维特比算法 5 前向 后向算法 了解 二 使用HMM进行文本分类 1
  • [Python系列-14]:人工智能 - 数学基础 -4- 数组元素的线性代数运算(向量、矩阵运算)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119301224 目录 第1章
  • Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11

    What is App Transport Security ATS At WWDC 2015 Apple announced App Transport Security for iOS 9 and OSX 10 11 El Capita
  • 聊一聊深度学习--包括计算前馈网络的反向传播和卷积的反向传播

    聊一聊深度学习 三天肝完深度学习基础 球球让我过吧 引言 人工智能领域的流派 机器学习流程 了解 表示学习 语义鸿沟 好的数据表示 语义表示 局部表示 分布式表示 学习过程 监督学习 有反馈 无监督学习 无反馈 强化学习 多步之后反馈 神经
  • h5跳转App以及URL Scheme获取-App协议列表

    从Safari跳到APP 跳转 既然要想跳到你指定的APP 那么就需要在你的APP中定义一个特殊的标示 也就是一个URL协议 定义URL协议的如下图 TARGETS gt info gt URL Types gt 添加一个URL协议 Sni
  • Shell脚本攻略:数组

    目录 一 理论 1 数组概述 2 定义数组 3 数组打印 4 数组的数据类型及处理 5 数组赋值 6 数组遍历 7 数组切片 8 数组替换 9 删除数组 10 追加数组中的元素 11 数组排序算法 二 实验 1 实验一 2 实验二 3 实验
  • PS的颜色选择--从英雄到坏蛋的15个配色方案

    从英雄到坏蛋的15个配色方案 故事IGEEK DESIGN 迪斯尼公司于1923成立 他们的第一部长片电影 白雪公主与七个小矮人于1937年发布 关于白雪公主有一个最有趣的地方 她是迪士尼世界中最能代表 善良 的角色 在故事中 邪恶的王后嫉
  • 消息队列mq总结

    转自 http blog csdn net konglongaa article details 52208273 http blog csdn net oMaverick1 article details 51331004 https y
  • Css实现省略号...及悬浮层显示全部内容的方法:

    1 单行文本省略 overflow hidden 溢出隐藏 white space nowrap 禁止换行 text overflow ellipsis 2 多行文本省略 display webkit box 谷歌 webkit box o
  • 软工UML画图

    学习如何画图 如类图 顺序图 流程图 E R图和类代码等 一个一个来 起始 数据流图 功能模型 基本符号 加工 命名要用动宾词组 外部实体 数据存储 数据流 命名要用名词 题目说明解法 下面用个题来说明 假设一家工厂的采购部每天需要一张定货
  • 微服务架构(Microservice Architecture)

    之前一段时间 有听部门架构说起接下来公司要使用微服务架构来研发系统 当时没怎么在意 因为是第一次听说微服务这个名词 果然无知者无畏啊 正好赶上五一假 我自告奋勇的 接了编写微服务架构培训文档这个任务 也许因为我是文科生 文笔稍微好点 五一假

随机推荐

  • Qt-OpenGL-03 纹理Texture

    写在开头 文章是基于纹理 LearnOpenGL CN 教程的学习记录 强烈建议在网站上先弄清楚原理再看此文章 以Qt GL窗口代替GLFW的写法 Qt库中一些类代替教程中的类 一起入坑 效果图 上图使用了两纹理混合 接下来是一些比较重要的
  • LaTeX 中插入图片使其紧跟插入的文字之后

    LaTeX 中插入图片使其不跑到每页的开头而紧跟插入的文字之后 此次建模过程中 遇到的一个比较棘手的问题是 当插入图片时 图片的位置总是会自动跑到当页 或下一页 的最上方 而不是紧跟在其对应的说明文字之后 这是我们想要的效果 解决方法如下
  • 云服务器被DDOS攻击该如何防御?

    相信很多大型网站遭遇到DDoS攻击 导致网站无法访问而又难以解决 包括小编的个人博客也曾接受过DDOS的 洗礼 对此感同身受 所以 本文我们一起来了解下DDOS攻击并分享一些在一定程度范围内的应对方案 关于DDOS攻击 分布式拒绝服务 DD
  • MOS管的原理及其米勒效应(学习笔记)

    一 MOS管的组成及其原理 在讲解MOS的组成之前我们先来了解一下N型半导体和P型半导体 N型半导体是在纯净的硅晶体中掺入了5价磷 此时磷原子最外层多出来了一个自由电子 因为自由电子带负电 所以我们称为N型半导体 N取自于Negative
  • Go语言中json.Marshal()一直返回[123 125]的解决方法

    Go语言中对结构体进行json Marshal 一直返回 123 125 即 原因是go中是否可导出是根据名字首字母是否大写来确定的 如果结构体某字段的首字母为小写则不可导出 例子如下 注意Student内字段首字母的大小写 不可导出 ty
  • Caffe学习3——Forward and Backward

    Forward和Backward是Net中的计算本质 让我们考虑最简单的逻辑回归分类器 前向传播的部分是根据input来计算output 从而进行inference 在前向中 Caffe通过模型中每个layer的计算组合来计算 functi
  • 如何查看 Linux 系统安装的时间

    我们 SUN 实验室每台服务器上架后都需要填写一个表格 这个表格包括详细的机器硬件配置 操作系统版本和安装时间 网络配置 机器名 MAC 地址和 IP 安装的软件和用途 安全级别和策略 联系人 上架时间 机柜号等 昨天有位管理员忘了填写操作
  • Vue中常见设计模式的应用~

    Vue是基于什么模式 表示既然是Vue中常见的设计模式 首当其冲就先聊聊MVVM模式啦 一 mvvm模式 Vue js 是一个基于 MVVM 设计模式的前端框架 它将前端中的 UI视图 与 底层数据 和 业务逻辑 分离开来 使得UI视图与数
  • 并查集-- 一种路径压缩实现

    并查集用于计算图连通分量 比如回答这样的问题 社交媒体中 用户A和用户B是否属于同一个圈子里的 一个城市到另一个城市是否是可达的 并查集适用于并不需要计算出图上具体的路径 只需要计算是否连通 public interface UnionFi
  • epub.js使用

    div div 1 引入图书路径 需是epub类型 method需为default 要么苹果端加载为空白 var book ePub epub 三国演义 epub openAs epub var rendition book renderT
  • 【Photon Voice】如何获取App ID

    步骤1 注册并登录Photon 已经有账户了 您可以直接进行步骤2 注册一个光子账户 第2步 获取应用程序ID App ID是为Photon Cloud应用程序生成的标识符 当应用程序客户端连接用户或断开其他应用程序的用户时 将使用到它 进
  • GB/T28181-2022协议版本标识X-GB-Ver解读

    GB28181 2022相对2016 其中有个变化是 报文中携带协议版本标识 X GB Ver 3 0 3 0 2022 2 0 2016 为便于联网设备或服务器之间互相识别对方支持的协议版本 在SIP注册及其响应消息 无论是成功或失败 头
  • 客观面试题--36.Mybatis$与#取值的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • shell脚本中 if 、for 命令使用方法

    1 if 语句的使用 if语句的语法 if f file then如果有else 为 if then elif then else fi eg 判断某一个文件是否存在 file test 1 hello txt if f test 1 he
  • gigapixel ai 5.1汉化版 附使用教程

    gigapixel ai是一款运用了AI人工智能技术的图片 无损 放大软件 采用了AI深度学习技术 通过它 你可以放大图像并填补其他调整大小的产品遗漏的细节 让低分辨率图片专为高分辨率 高质量图片 而且该软件在功能上与PhotoZoom软件
  • 小程序实现canvas绘制图片和文字并保存到手机

    HTML
  • 如何在OpenCV Python中从立体图像创建深度图?

    翻译 Shahid Akhtar Khan的 How to create a depth map from stereo images in OpenCV Python 可以使用立体 stereo 图像创建深度图 为了从立体图像构建深度图
  • 在弄清什么是真正的OKR之前,别轻易使用

    转自 https www sohu com a 167148654 114819 KR到底是什么 在使用OKR的时候也有哪些注意点 在没弄清楚这些事情 可不要轻易使用 OKR大概在2013年传入中国 开始主要是一些有硅谷背景的初创企业在推行
  • RuntimeError: DataLoader worker (pid(s) 17016, 18312) exited unexpectedly

    RuntimeError DataLoader worker pid s 17016 18312 exited unexpectedly 这个错误通常是由于DataLoader中的一个或多个worker进程crash引起的 原因可能是许多不
  • Android源码编译之 lunch命令分析及user和userdebug编译选项区别

    不同厂商在编译Android系统时 会选择不同产品和编译版本 在Android编译过程中 通过source lunch来选择 1 souuce build envsetup sh 加载命令 2 lunch 选择平台等编译选项 3 make