• Android系统编译脚本理解


    android源码编译步骤:

    1. repo sync 代码(下载代码)

    2.start branch(用哪个分支,git相关)

    3. 到根目录(android目录)

      $cd android/

    4. 加载编译选项(函数调用之类,相当于include一些函数)

      $ source build/envsetup.sh

    5.加载lunch

      $lunch [product]-userdebug

    6.开始编译

      $m (or mm or mmm or make)

    7. 会产生一个out目录

    分析编译脚本:

    repo,git我就不讲了,网上一堆资料。

    1、分析 build/envsetup.sh文件

      

      1. $(gettop) 是指退回到android根目录(android/)

      2. 然后加载build/core/main.mk

    2. 那么我们就去看看build/core/main.mk文件

      版本相关(java,make版本),default target(DEFAULT_GOAL := droid)

      比较重要的:

      1. 定义

        BUILD_SYSTEM := $(TOPDIR)build/core

        definations.mk中定义了很多编译系统中用到的宏

        TARGET_BUILD_VARIANT 在buildspec.mk设定,这个参数决定了要安装的模块。(eng,user,userdebug)

      2.include $(BUILD_SYSTEM)/Makefile

        system.img、boot.img和recovery.img等镜像文件的生成规则。

      3.include $(BUILD_SYSTEM)/config.mk

        该文件根据lunch命令所配置的产品信息在build/target/board、vendor或者device目录中找到对应的BoradConfig.mk文件,

        以及通过加载build/core/product_config.mk文件在build/target/product、vendor或者device目录中找到对应的AndroidProducts.mk文件,

        来进一步对编译环境进行配置,以便接下来编译指定模块时可以获得必要的信息。

      4. dont_bother_goals

        

        如果在执行make命令时,指定的不是清理文件相关的目标(clean、clobber、dataclean和installclean等目标),

        dont_bother=true,表示接下来要执行的是编译命令。

      5. ONE_SHOT_MAKEFILE不为空 & dont_bother == true

        ONE_SHOT_MAKEFILE不为空

         

         

          1)执行mm命令时会用到,使用当前目录下的mk文件

          2)ONE_SHOT_MAKEFILE 在build/envsetup.sh定义(mm or mmm函数)

          3)ALL_MODULES 为编译时相关依赖的module都需加进去,不需要的就不会加载编译。

        dont_bother == true

         

          1)相当于执行m命令,加载编译android根目录下的所有Android.mk

          2)不包括.repo,out,.git目录

          3)执行build/tools/findleaves.py找所有的Android.mk

      6. 指定生成目录,开始编译

    参考下图:

    Makefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk

    -> build/core/product.mk中定义的函数get-all-product-makefiles ,来遍历整个device的子目录, 所有的 AndroidProducts.mk, 

    PRODUCT_DEVICE 赋值给TARGET_DEVICE(build/core/config.mk)然后把BoardConfig.mk包含进来(include $(TARGET_DEVCIE)/BoardConfig.mk)

    device下面的vendorsetup.sh中会添加lunch menu

    后面的篮框里是编译规则相关。

    显然build/core/main.mk中会指定生成目录,在build/core/Makefile中打包生成img镜像文件。

    参考:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/

  • 相关阅读:
    [NOI2015]软件包管理器(树链剖分)
    [题解][luogu p1273]有线电视网
    [题解][洛谷P1373 小a和uim之大逃离]
    《LoadRunner 没有告诉你的》之五——无所不在的性能测试 (已完稿)
    《LoadRunner没有告诉你的》之六——获取有效的性能需求
    《LoadRunner 没有告诉你的》之一——描述性统计与性能结果分析
    《LoadRunner 没有告诉你的》之四——理解性能
    《LoadRunner 没有告诉你的》之三——理发店模型
    人活着就是要学会持续的奔跑!【二】
    人活着就是要学会持续的奔跑!【一】
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5183149.html
Copyright © 2020-2023  润新知