导航:首页 > 操作系统 > android编译lunch

android编译lunch

发布时间:2023-04-14 10:53:51

① 自己可以编译安卓源码

用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”

其中[email protected]为你自己的邮箱.

简要说明

android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.

源码下载

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

repo工具下载及安装

通过执行以下命令实现repo工具的下载和安装

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


这里写图片描述

执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.

    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    ② 编译a20 lunch后面应该选择哪个

    Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,
    如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程。
    如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站:
    http://source.android.com/source/building.html
    但是,这儿只是告诉你了如何去编译一个通用的系统,并没有详细告诉你细节,我们跟着编译过程来了解下

    +-------------------------------------------------------------------------------------------------------------+
    本文使用Android版本为2.1,采用开发板为华清远见研发的FS_S5PC100 A8开发板。
    +-------------------------------------------------------------------------------------------------------------+

    按照google给出的编译步骤如下:

    1> source build/envsetup.sh:加载命令
    2> lunch:选择平台编译选项
    3> make:执行编译

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

    1. source build/envsetup.sh
    这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去,我们来分析下它。

    envsetup.sh里的主要命令如下:

    function help() # 显示帮助信息
    function get_abs_build_var()# 获取绝对变量
    function get_build_var()# 获取绝对变量
    function check_proct()# 检查proct
    function check_variant()# 检查变量
    function setpaths() # 设置文件路径
    function printconfig()# 打印配置
    function set_stuff_for_environment() # 设置环境变量
    function set_sequence_number() # 设置序号
    function settitle() # 设置标题
    function choosetype() # 设置type
    function chooseproct() # 设置proct
    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 tracedmmp()
    function runhat()
    function getbugreports()
    function startviewserver()
    function stopviewserver()
    function isviewserverstarted()
    function smoketest()
    function runtest()
    function godir () # 跳到指定目录 405

    # add_lunch_combo函数被多次调用,就是它来添加Android编译选项
    # Clear this variable. It will be built up again when the vendorsetup.sh
    406 # files are included at the end of this file.
    # 清空LUNCH_MENU_CHOICES变量,用来存在编译选项
    407 unset LUNCH_MENU_CHOICES
    408 function add_lunch_combo()
    409 {
    410 local new_combo=$1 # 获得add_lunch_combo被调用时的参数
    411 local c # 依次遍历LUNCH_MENU_CHOICES里的值,其实该函数第一次调用时,该值为空
    412 for c in ${LUNCH_MENU_CHOICES[@]} ; do
    413 if [ "$new_combo" = "$c" ] ; then # 如果参数里的值已经存在于LUNCH_MENU_CHOICES变量里,则返回
    414 return
    415 fi
    416 done # 如果参数的值不存在,则添加到LUNCH_MENU_CHOICES变量里
    417 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
    418 }

    # 这是系统自动增加了一个默认的编译项 generic-eng
    420 # add the default one here
    421 add_lunch_combo generic-eng # 调用上面的add_lunch_combo函数,将generic-eng作为参数传递过去
    422
    423 # if we're on linux, add the simulator. There is a special case
    424 # in lunch to deal with the simulator
    425 if [ "$(uname)" = "Linux" ] ; then
    426 add_lunch_combo simulator
    427 fi

    # 下面的代码很重要,它要从vendor目录下查找vendorsetup.sh文件,如果查到了,就加载它
    1037 # Execute the contents of any vendorsetup.sh files we can find.
    1038 for f in `/bin/ls vendorbuild/vendorsetup.sh 2> /dev/null`
    1039 do
    1040 echo "including $f"
    1041 . $f # 执行找到的脚本,其实里面就是厂商自己定义的编译选项
    1042 done
    1043 unset f

    envsetup.sh其主要作用如下:

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


    其实,上述第3条是向编译系统添加了厂商自己定义产品的编译选项,里面的代码就是:add_lunch_combo xxx-xxx。

    根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envsetup.sh最后,

    添加上add_lunch_combo myProct-eng,当然这么做,不太符合上面代码最后的本意,
    我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项

    #mkdir vendor/farsight/
    #touch vendor/farsight/vendorsetup.sh
    #echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh

    这样,当我们在执行source build/envsetup.sh命令的时候,可以在shell上看到下面的信息:
    including vendor/farsight/vendorsetup.sh

    2. 按照android官网的步骤,开始执行lunch full-eng

    当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项
    如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现:

    You're building on Linux

    generic-eng simulator fs100-eng
    Lunch menu... pick a combo:
    1. generic-eng
    2. simulator
    3. fs100-eng

    其中第3项是我们自己添加的编译项。

    lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Proct和编译过程中用到的全局变量。

    我们一直没有说明前面的fs100-eng是什么意思,现在来说明下,fs100是我定义的产品的名字,eng是产品的编译类型,除了eng外,还有user, userdebug,分别表示:

    eng: 工程机,
    user:最终用户机
    userdebug:调试测试机
    tests:测试机

    由此可见,除了eng和user外,另外两个一般不能交给最终用户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。

    那么这四个类型是干什么用的呢?其实,在main.mk里有说明,在Android的源码里,每一个目标(也可以看成工程)目录都有一个Android.mk的makefile,每个目标的Android.mk中有一个类型声明:

    LOCAL_MODULE_TAGS,这个TAGS就是用来指定,当前的目标编译完了属于哪个分类里。

    PS:Android.mk和Linux里的makefile不太一样,它是Android编译系统自己定义的一个makefile来方便编译成:c,c++的动态、静态库或可执行程序,或java库或android的程序,好了,我们来分析下lunch命令干了什么?

    function lunch()
    {
    local answer

    if [ "$1" ] ; then
    # lunch后面直接带参数
    answer=$1
    else
    # lunch后面不带参数,则打印处所有的target proct和variant菜单提供用户选择
    print_lunch_menu
    echo -n "Which would you like? [generic-eng] "
    read answer
    fi

    local selection=

    if [ -z "$answer" ]
    then
    # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng
    selection=generic-eng
    elif [ "$answer" = "simulator" ]
    then
    # 如果是模拟器
    selection=simulator
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
    # 如果answer是选择菜单的数字,则获取该数字对应的字符串
    if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
    then
    selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
    fi
    # 如果 answer字符串匹配 *-*模式(*的开头不能为-)
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    then
    selection=$answer
    fi

    if [ -z "$selection" ]
    then
    echo
    echo "Invalid lunch combo: $answer"
    return 1
    fi

    # special case the simulator
    if [ "$selection" = "simulator" ]
    then
    # 模拟器模式
    export TARGET_PRODUCT=sim
    export TARGET_BUILD_VARIANT=eng
    export TARGET_SIMULATOR=true
    export TARGET_BUILD_TYPE=debug
    else

    # 将 proct-variant模式中的proct分离出来
    local proct=$(echo -n $selection | sed -e "s/-.*$//")

    # 检查之,调用关系 check_proct()->get_build_var()->build/core/config.mk比较罗嗦,不展开了
    check_proct $proct
    if [ $? -ne 0 ]
    then
    echo
    echo "** Don't have a proct spec for: '$proct'"
    echo "** Do you have the right repo manifest?"
    proct=
    fi

    # 将 proct-variant模式中的variant分离出来
    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")

    # 检查之,看看是否在 (user userdebug eng) 范围内
    check_variant $variant
    if [ $? -ne 0 ]
    then
    echo
    echo "** Invalid variant: '$variant'"
    echo "** Must be one of ${VARIANT_CHOICES[@]}"
    variant=
    fi

    if [ -z "$proct" -o -z "$variant" ]
    then
    echo
    return 1
    fi
    # 导出环境变量,这里很重要,因为后面的编译系统都是依赖于这里定义的几个变量的
    export TARGET_PRODUCT=$proct
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_SIMULATOR=false
    export TARGET_BUILD_TYPE=release
    fi # !simulator

    echo

    # 设置到环境变量,比较多,不再一一列出,最简单的方法 set >env.txt 可获得
    set_stuff_for_environment
    # 打印一些主要的变量, 调用关系 printconfig()->get_build_var()->build/core/config.mk-

    >build/core/envsetup.mk 比较罗嗦,不展开了
    printconfig
    }

    由上面分析可知,lunch命令可以带参数和不带参数,最终导出一些重要的环境变量,从而影响编译系统的编译结果。导出的变量如下(以实际运行情况为例)

    TARGET_PRODUCT=fs100
    TARGET_BUILD_VARIANT=eng
    TARGET_SIMULATOR=false

    TARGET_BUILD_TYPE=release
    执行完上述两个步骤,就该执行:make命令了

    ③ android源码编译,lunch时出错

    重新 repo sync

    ④ 如何定制android源码的编译选项 amp;后期安装

    文件build/core/version_defaults.mk用来检查一些跟版本相关的变量是否定义;如果未定义,则使用默认值。
    这些变量包括
    PLATFORM_VERSION # 如 2.2.5
    PLATFORM_SDK_VERSION # 8, 对应2.2.5
    PLATFORM_VERSION_CODENAME # REL,即发行版
    DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME
    BUILD_ID # 默认为UNKNOWN
    BUILD_NUMBER # 默认eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。

    version_defaults.mk首先包含进build_id.mk。用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。

    ---------------------------------------------------------------------------
    关于调试功能(adb)的开启
    编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。
    其中也从以下文件中引入了一些编译设置:
    device/${CHIPSET_VENDOR}/vendorsetup.sh
    我们这里使用的CHIPSET_VENDOR为amlogic。
    比如我们有文件device/amlogic/vendorsetup.sh,内容为"产品名-编译类型(flavor)"列表(称为combo),如下:
    add_lunch_combo m1ref-eng
    add_lunch_combo m1ref-user
    add_lunch_combo m2ref-eng
    add_lunch_combo m2ref-user
    add_lunch_combo stvm3-eng
    add_lunch_combo stvm3-user
    其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。
    除此前缀外可选的combo值有: eng, user, userdebug, tests。
    (参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)
    我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。
    以下是各个编译类型的特点:
    eng: 工程模式,用于平台级的调试,是默认的编译类型。
    待安装的模块tag有: eng, debug, user, development.
    安装不带tag的非APK模块;
    所安装应用由产品定义文件给出;
    默认属性: ro.secure=0, ro.deuggable=1, ro.kernel.android.checkjni=1
    adbd默认开启,adb以root身份运行。
    user: 即最终用户版;
    待安装的应用tag有: user
    安装不带tag的非APK模块;
    所安装应用由产品定义文件给出;
    默认属性有ro.secure=1, ro.debuggable=0;
    默认关闭adbd服务(但可通过应用settings来打开,且adb以shell身份运行);
    userdebug: 与user类似,除了:
    支持有限的调试功能;
    待安装的应用tag有:debug;
    默认属性有ro.secure=1, ro.debuggable=1;
    默认打开adbd服务,adb以shell身份运行;

    例如,由文件build/core/main.mk可以看出,当使用含有userdebug的combo值时,此文件中的临时变量enable_target_debugging会保持为true,相应地,编译过程会执行:
    ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 persist.service.adb.enable=1
    这意味着目标系统中根目录下的文件/default.prop文件(对应变量 INSTALLED_DEFAULT_PROP_TARGET )会含有以下行(参考文件build/core/Makefile):
    persist.service.adb.enable=1
    由此,目标系统会默认开启adbd服务,你就可以通过其它PC来连接目标系统了。

    所以,如要默认开启adbd服务,可在设备(如stvm3)定制文件device/amlogic/vendorsetup.sh中增加以下行:
    add_lunch_combo stvm3-userdebug
    这样在执行bash的lunch函数时,选择此combo就可以默认打开adbd服务(adb以shell身份运行)。

    但是,即使adbd已经开启,你仍可能无法通过网络连接到Android进行调试,这涉及到Android的二个属性:
    service.adb.tcp.port (优先级高)
    persist.adb.tcp.port (优先级低)
    注:可查看源码文件system/core/adb/adb.c。
    默认地,这两个属性值是5555。有两种方法来设置此变量:
    1)(永久性改变)在Android配置文件/init.rc或/init.$MANUFACTUROR.rc中添加一行:
    setprop service.adb.tcp.port 5555
    2)(临时性改变)在命令行上(你可能需要先通过串口开一个终端)执行如下命令:
    setprop service.adb.tcp.port 5555

    检查adbd是否支持通过网络链接Android:执行命令
    netstat -l -n | grep ":5555"
    如果有LISTEN状态的输出,则表示adbd支持网络模式 :) 。

    ⑤ Android杂谈:编译环境参数是从哪里来的

    我们通过走一下编译步骤,看一下,这些参数的来源吧!

    上面这句命令,是编译前准备环境的。
    / build / envsetup.sh
    可以看到到引进了一堆的函数,有mm,mmm等常用指令

    看看跑了啥逻辑,
    1.首先判断了下shell的环境,最好使用/bin/bash。
    参考: https://www.douban.com/note/404726254/
    2.包含厂商vendor目录的vendorsetup.sh

    包含后,echo打印出来,岩喊像下面这样子~

    lunch就是选择一些编译参数,估计就是在这里准备好这些全局的参数的。
    lunch函数在envsetup.sh里面定义

    set_stuff_for_environment
    会进入set_stuff_for_environment,主要是设置title,java环境,paths还有序列号。貌似没多大用处~

    printconfig
    最后会进入printconfig,就是打印配置信息给我们看啦!

    打印一些配置,可以看到TARGET_PRODUCT,TARGET_BUILD_VARIANT和TARGET_BUILD_TYPE。

    printconfig包含get_build_var函数,函数执行了一句make指令,make --no-print-directory -C "$T" -f build/core/config.mk mpvar-$1
    (1)make -C "$T" 就是跳转到top目大枣蚂录。
    (2)make -f 来指定makefile文件build/core/config.mk,我去config.mk还是个makefile文件。
    (3)mpvary用来打印用的,就是打印第一个参数$1啦,呵呵呵
    所以,主要get_build_var主要是执行makefile config.mk。

    看看/ build / core / config.mk ,可以看到他进一步包含了envsetup.mk

    envsetup.mk就是最后设置一些常用编译环境参数的文件了!!
    / build / core / envsetup.mk
    看下面的图,可以看到他定义了很多编译常量了!!

    1.通过source envsetup.sh可以引进很多函数,包含vendorsetup.sh
    2.通过lunch,选择类型后,会编译build/core/config.mk文件,进而再编译envsetup.mk文件,而这个文滚埋件就是定义编译常量的地方!

    ⑥ android中如何编译出64位so文件

    如果是在Linux下编译Android源码,有可能是两个原因:
    1. lunch命令有32位和64位的区别,注意选能够编译64位so的命令

    2. mk文件中有LOCAL_MODULE_PATH的值比如为$(TARGET_OUT_SHARED_LIBRARIES)/hw的改为LOCAL_MODULE_RELATIVE_PATH := hw,后一种可以分别在lib和lib64下分别生成32位和64位的so文件,这个看看编译后的信息就知道了.

    ⑦ 如何定制android源码的编译选项

    现仅就工作遇到的问题做个总结。所用硬件平台为amlogic stvm3。---------------------------------------------------------------------------关于版本号:文件build/core/version_defaults.mk用来检查一些跟版本相关的变量是否定义;如果未定义,则使用默认值。这些变量包括 PLATFORM_VERSION # 如 2.2.5 PLATFORM_SDK_VERSION # 8, 对应2.2.5 PLATFORM_VERSION_CODENAME # REL,即发行版 DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME BUILD_ID # 默认为UNKNOWN BUILD_NUMBER # 默认eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。 version_defaults.mk首先包含进build_id.mk。用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。---------------------------------------------------------------------------关于调试功能(adb)的开启编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。其中也从以下文件中引入了一些编译设置: device/${CHIPSET_VENDOR}/vendorsetup.sh我们这里使用的CHIPSET_VENDOR为amlogic。比如我们有文件device/amlogic/vendorsetup.sh,内容为"产品名-编译类型(flavor)"列表(称为combo),如下: add_lunch_combo m1ref-eng add_lunch_combo m1ref-user add_lunch_combo m2ref-eng add_lunch_combo m2ref-user add_lunch_combo stvm3-eng add_lunch_combo stvm3-user其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。除此前缀外可选的combo值有: eng, user, userdebug, tests。(参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。以下是各个编译类型的特点: eng: 工程模式,用于平台级的调试,是默认的编译类型。

    ⑧ 怎么在ubuntu上编译android源码

    步骤一:
    安装Ubuntu系统。我们既可以通过虚拟机的方式安装Ubuntu,也可以直接在电脑上安装,为了获得更好的Linux操作体验,我建议直接在电脑上面安装Ubuntu,我在自己电脑上安装了win10和Ubunut Server14.04双系统,使用的时候可以根据自己的需要随时切换系统,非常方便。关于如何搭建双系统,网上有很多教程,我就不在此叙述了,但是我想说明的一点是在安装Ununtu的时候,分配给Ubuntu的磁盘空间一定要尽可能大一点,至少60G,我分配了105G,编译完成之后还剩下50多G,也就是说差不多用了近50G的空间,所以安装Ubuntu的时候一定得分配大一点的磁盘空间,不然编译会因为空间不足而中断。
    步骤二:
    搭建好Ubuntu系统之后,我们需要下载一份Android6.0的源码,网上很多文章都介绍了如何通过repo的方式来下载源码,但是通过这种方式下载速度可能并不是很理想,直接下载网络云的Android6.0源码,
    因为Android6.0的源码所占空间非常大,所以上传者把Android源码分成了很多个文件,待全部下载完毕之后,我们可以通过命令把这些分开的文件合并为一个文件。
    步骤三:
    如果我们是在Windows上下载的源码,那么当我们打开Ubuntu之后,要做的第一件事请就是把Windows中的Android源码拷贝到Ubuntu系统下面,我直接利用复制粘贴的方式将源码拷贝到了Ubuntu的Home目录下面,拷贝之后的目录结构Home/android6_r1/各个分开的源码文件。
    步骤四:
    合并这些被分开的源码文件。我们按下键盘上的ctrl + alt + T打开控制台,通过cd命令进入到Home/android6_r1/目录下面,然后执行命令:cat Android6_r1_* > M.tgz,不用多久,在Home/android6_r1/目录下面就会生成一个新的文件——M.tgz,M.tgz就是合并之后的压缩文件。
    步骤五:
    解压步骤四生成的压缩文件。同样是在Home/android6_r1/目录下面,我们在控制台执行命令:tar zxvf M.tgz,开始解压。解压的过程大概需要20分钟左右的时间,请耐心等待。解压好了之后,在Home/android6_r1/会生成一个mydroid的文件夹,这个文件夹就是Android源码的根文件夹了,里面有abi、devices、hardware、packages、sdk、art等文件夹和文件。
    步骤六:
    安装编译源码所需要的软件。在控制台中我们通过cd..命令退回到Unbuntu用户的根目录下,然后依次执行以下命令:
    sudo apt-get update
    sudo apt-get install openjdk-7-jdk
    sudo update-alternatives --config java
    sudo update-alternatives --config javac
    以上命令每一条都必须分开单独执行,目的是为了获取1.7版本的jdk并设置环境变量。当我们安装完Ubuntu之后可能会自带一个jdk,但是如果用自带的jdk编译Android源码很可能会提示jdk版本不符合要求的错误,因此我们需要重新下载1.7版本的jdk,我用openjdk-7-jdk编译未出现任何问题。
    接下来继续执行以下命令,同样每一行都是分开单独执行的:
    sudo apt-get install git gnupg flex bison gperf build-essential
    sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
    sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos
    sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
    以上命令主要是安装编译源码时需要用到的各种软件,如果没有安装这些软件,编译的过程中会提示缺少必要的软件而无法继续编译,因此,在正式编译源码之前,一定要先安装这些软件。
    步骤七:
    开始编译。在控制台中通过cd命令进入到Home/android6_r1/mydroid/目录下,然后执行命令:source build/envsetup.sh,导入编译Android源码所需的环境变量和其它参数。
    步骤八:
    在控制台中执行命令:lunch,运行命令之后会提示我们选择编译目标。这里我选择的的默认目标,即aosp_arm_eng。
    步骤九:
    在控制台中执行命令:make -j8,开始编译。注意,make -j8命令中的数字8和我们电脑的CPU核心数以及线程数有关系,一般这个数字的数值最大不能超过CPU线程数的2倍,例如我电脑的处理器是i5 6200U,为双核四线程,因此编译Android源码的时候,我可以设置的最大工作线程数量为4 * 2 = 8。在执行make命令的时候我们应该根据自己的CPU参数设置合理的工作线程数值。
    以上步骤执行完之后,就是一段非常漫长的等待了,我从中午十二点多开始编译,一直到晚上九点多编译完成,整个编译过程耗时九个多小时,幸好我的运气还不错,编译过程中没有出现任何错误,只是中途意外中断了一次,但是Android源码是可以接着上次中断的位置继续编译的,已经编译的部分不会重复编译,因此并未对我造成大的影响。同志们,我想说的是,编译的过程中一定要有耐心哟!
    整个源码编译完成之后,如果提示如下信息,那么Congratulations, you are successful!!!

    ⑨ Android make 基础

    Android编译演进过程:

    build/ 目录下

    source build/envsetup.sh
    输入指令hmm 就可以查看信息

    lunch 2

    通过soong执行编译构建,这里执行make命令时,main.mk文件把一些环境变量和目标都配置好后,会执行envsetup.sh中的make()进行编译。

    build/soong/soong_ui.bash --make-mode
    ------->

    soong的编译过程:

    soong_ui.bash 调用流程:

    可以看到include 了main.mk文件,从main.mk开始,将通过include命令将其所有需要的.mk文件包含进来,最终在内存中形成一个包括所有编译脚本的集合,这个相当于一个巨大Makefile文件。Makefile文件看上去很庞大,其实主要由三种内容构成: 变量定义、函数定义和目标依赖规则,此外mk文件之间的包含也很重要。

    5.工具链的关系

    REF
    https://blog.csdn.net/yiranfeng/article/details/109082489

    ⑩ Android源码编译是干什么

    编译Android系统。

    阅读全文

    与android编译lunch相关的资料

    热点内容
    易语言递归算法 浏览:284
    中国有出什么加密币吗 浏览:530
    加密程序不小心删除 浏览:415
    清除空文件夹的代码 浏览:608
    相册视频水印怎么去掉的app 浏览:616
    鸡啄米c编程入门 浏览:826
    iphone手机视频如何加密或隐藏 浏览:289
    车床一个轴的编程 浏览:6
    任何APP都借不了款怎么办 浏览:362
    linux刷新命令 浏览:518
    解压配音的小视频 浏览:652
    phptable页 浏览:813
    人工智能怎么摆脱算法 浏览:72
    思科显示配置命令 浏览:411
    网上为什么对程序员这么多评论 浏览:84
    app续费怎么算 浏览:775
    安卓手机怎么把相册传到苹果 浏览:261
    高中信息技术算法教案 浏览:245
    百战程序员职业 浏览:606
    abb机器人焊接操作编程教学视频 浏览:384