zoukankan      html  css  js  c++  java
  • Android 8.0编译过程

    Android编译系统中的Android.bp、Blueprint与Soong
    http://note.qidong.name/2017/08/android-blueprint/

    工具链关系

    Android.mk、Android.bp、Soong、Blueprint、Ninja,它们之间到底有什么关系? 以下用简单的方式表达这几个概念之间的作用关系。

    Android.bp --> Blueprint --> Soong --> Ninja
    Makefile or Android.mk --> kati --> Ninja
    
    (Android.mk --> Soong --> Blueprint --> Android.bp)
    

    Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义。

    Android.mk可以通过Soong提供的androidmk转换成Android.bp,但仅限简单配置。 目前Oreo的编译流程中,仍然是使用kati来做的转换。

    现存的Android.mk、既有的Android.bp,都会分别被转换成Ninja。 从Android.mk与其它Makefile,会生成out/build-<product_name>.ninja文件。 而从Android.bp,则会生成out/soong/build.ninja。 此外,还会生成一个较小的out/combined-<product_name>.ninja文件,负责把二者组合起来,作为执行入口。

    最终,Ninja文件才是真正直接控制源码编译的工具。


    Android 8.0编译过程初步分析
    https://blog.csdn.net/wear_/article/details/88543353

    概述
    要想知道编译的过程,其实看编译的脚本,以及编译时产生的log是比较快的方法。

    编译相关的核心文件位于build/core下,而生成的文件在out/soong下,里面有编译过程中产生的编译相关文件。

    在编译过程中,首先将所有的android.bp文件收集成out/soong/build.ninja.d,然后以此为基础生成out/soong/build.ninja规则。而Android.mk收集后生成的是build-aosp_arm.jinja文件。

    soong处理后的bp文件生成build.ninja的同时还包含out/soong/Android-aosp_arm.mk,这个文件是编译完成后模块的安装脚本,负责将模块安装到对应位置。

    在out/soong目录下有两个文件.minibootstrap/build.ninja 和.bootstrap/build.ninja两个目录。.minibootstrap/build.ninja 主要是用来编译blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相关工具和out/soong/build.ninja文件。
    ---------------------

    Android8.0.0-r4的编译系统
    https://blog.csdn.net/nwpushuai/article/details/79372837

    一、 概述
    1.1 编译系统变化

    从Android 7.0开始,android的编译系统发生了变化,之前依赖Makefile组织编译系统,从7.0开始逐步引入了kati soong(optional未正式使用,需要USE_SOONG=true开启),将Android.mk文件转化成ninja文件,使用ninja文件对编译系统进行管理。

    从8.0开始,android 引入了Android.bp文件来替代之前的Android.mk文件,不同于Android.mk,Android.bp只是纯粹的配置文件,不包括分支、循环等流程控制。在android项目上如何进行选择编译、解析配置、转换成ninja等,Soong就被创造出来,将Android.bp转换为ninja文件进行管理。

    同时,Soong还会编译长生一个androidmk命令可以手动将Android.mk转换成Android.bp文件。

    1.2 代码位置

    Kati的位置是在build/kati/中,平台也自带编译好的ckati

    Soong的位置在build/soong,它和build/blueprint同时期作用,他们之间的系统关系如下:

    Android.bp --> Blueprint --> Soong --> Ninja

    Makefile or Android.mk --> kati --> Ninja

    Blueprint是生成、解析Android.bp 的工具,是Soong的一部分。Soong是专门为Android的编译而设计的工具,blueprint只是解析文件的形式,而soong则解释内容的含义。

    Blueprint和Soong都是有Go语言写的项目,从7.0开始在prebuilts/go/目录下新增了go语言的运行环境,在编译是使用。

    1.3 Android ninja组织

    在编译过程中,将所有的android.bp文件搜集成outsoonguild.ninja.d , 并以此为基础生成outsoonguild.ninja规则。

    由所有的Android.mk生成build-aosp_arm.ninja文件。通过combined-aosp_arm.ninja将两个文件组织起来。

    builddir = out

    include out/build-aosp_arm.ninja

    include out/soong/build.ninja

    build out/combined-aosp_arm.ninja: phony out/soong/build.ninja

    通过编译的LOG,首先搜集所有的bp文件生成build.ninja,然后搜集所有的mk文件生成build-aosp-arm.ninja文件。

    out/soong/.bootstrap/bin/soong_build out/soong/build.ninja

    out/build-aosp_arm-cleanspec.ninja is missing, regenerating...

    out/build-aosp_arm.ninja is missing, regenerating...

    [1/894] including out/soong/Android-aosp_arm.mk ...

    经过试验表明,soong处理后的bp文件生成build.ninja的同时还包含out/soong/Android-aosp_arm.mk,这个文件是编译完成后模块的安装脚本,负责将模块安装到对应位置。比如我们现在处理的vndk相关vendor处理就是在这个目录下进行的。

    在out/soong目录下有两个文件.minibootstrap/build.ninja 和.bootstrap/build.ninja两个目录。.minibootstrap/build.ninja 主要是用来编译blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相关工具和out/soong/build.ninja文件。

    二 、编译流程
    编译步骤如下:

       1、 source build/envsetup.sh:加载命令

       2、 lunch:选择平台编译选项

       3、 make:执行编译
    ---------------------


    Android编译系统分析
    https://blog.csdn.net/zirconsdu/article/details/8005415

    2.2 LOCAL_XXX的列表
    Include $(CLEAR_VARS)后,可以做为局部宏定义使用.

    说明:
        必须定义, 在app或package的Android.mk中必须给定值。
        可选定义,在app或package的Android.mk中可以也可以不给定值。
        不用定义,在app或package的Android.mk中不要给定值,脚本自动指定值。

    LOCAL_PATH,            当前路径,必须定义。
    LOCAL_PACKAGE_NAME,    必须定义,package的名字,这个名字在脚本中将标识app或package。
    LOCAL_MODULE_SUFFIX,    不用定义,module的后缀,=.apk。
    LOCAL_MODULE,            不用定义,=$(LOCAL_PACKAGE_NAME)。
    LOCAL_JAVA_RESOURCE_DIRS,    不用定义。
    LOCAL_JAVA_RESOURCE_FILES,    不用定义。
    LOCAL_MODULE_CLASS,    APPS/ETC(for firmware)/EXECUTABLES/STATIC_LIBRARYS/SHARED_LIBRARYS/JAVA_LIBRARYS
    LOCAL_MODULE_TAGS,        可选定义。默认optional。取值范围user debug eng tests optional samples shell_ash shell_mksh。
    LOCAL_ASSET_DIR,    可选定义,推荐不定义。默认$(LOCAL_PATH)/assets
    LOCAL_RESOURCE_DIR,    可选定义,推荐不定义。默认product package和device package相应的res路径和$(LOCAL_PATH)/res。

    LOCAL_EXPORT_PACKAGE_RESOURCES,    可选定义,默认null。如果允许app的资源被其它模块使用,则设置true。
    LOCAL_PROGUARD_ENABLED,    可选定义,默认为full,如果是user或userdebug。取值full, disabled, custom。

    LOCAL_MANIFEST_FILE    AndroidManifest.xml
    full_android_manifest,        不用定义,=$(LOCAL_PATH)/AndroidManifest.xml。

    LOCAL_CERTIFICATE,    可选定义,默认为testkey。最终
            private_key := $(LOCAL_CERTIFICATE).pk8
            certificate := $(LOCAL_CERTIFICATE).x509.pem

  • 相关阅读:
    <Android 基础(二十六)> 渐变色圆角Button
    Java 中父类怎么调用子类的方法?
    <Android 基础(二十五)> Frame Animation
    Java基础知识点
    HTTP请求流程(二)----Telnet模拟HTTP请求
    telnet远程登录协议
    HTTP协议详解
    STM32 SPI接口的NSS引脚
    TCP/IP
    以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • 原文地址:https://www.cnblogs.com/bluestorm/p/11027754.html
Copyright © 2011-2022 走看看