首页 > 其他分享 >Android编译系统

Android编译系统

时间:2023-04-25 13:57:03浏览次数:42  
标签:make mk 编译 soong ninja Android 编译系统

一.概述

在 Android 7.0 之前,Android 编译系统使用 GNU Make 描述和shell来构建编译规则,模块定义都使用Android.mk进行定义,Android.mk的本质就是Makefile,但是随着Android的工程越来越大,模块越来越多,Makefile组织的项目编译时间越来越长。因此,在Android7.0开始,Google采用ninja来代取代之前使用的make,由于之前的Android.mk数据实在巨大,因此Google加入了一个kati工具,用于将Android.mk转换成ninja的构建规则文件buildxxx.ninja,再使用ninja来进行构建工作。最终目标要把make都取代,于是从Android8.0开始,Google为了进一步淘汰Makefile,因此引入了Android.bp文件来替换之前的Android.mk。Android.bp只是一个纯粹的配置文件,不包括分支、循环语句等控制流程,本质上就是一个json配置文件。Android.bp 通过Blueprint+soong转换成ninja的构建规则文件build.ninja,再使用ninja来进行构建工作。这些文件之间的关系,如下图所示:

  • kati是把Android.mk转换成ninja file。
  • soong是把Android.bp转换成ninja file。
  • Android.bp是jason形式组织的文件,将来逐步取代Android.mk
  • 后续没有Android.mk,kati将会消失。
  • ninja是同make编译构建系统一样,来替换make的,速度快。
  • blueprint是一个处理Android.bp相关语法的库文件。

如下图为Android编译系统的演进:
Android编译系统的演进

二.编译流程

以Android10为例

2.1 编译构成

Android的编译目录在/build 中,目录结构如下:

这个目录中可以看到core文件夹被link到了make/core,envsetup.sh被link到make/envsetup.sh,这主要是为了对使用者屏蔽切换编译系统的差异。

这里重点看四个文件夹:blueprint、kati、make、soong

  1. blueprint:用于处理Android.bp,编译生成*.ninja文件,用于做ninja的处理
  2. kati:用于处理Android.mk,编译生成*.ninja文件,用于做ninja的处理
  3. make:文件夹还是原始的make那一套流程,比如envsetup.sh
  4. soong:构建系统,核心编译为soong_ui.bash

Soong编译系统家族成员及各自关系如下图所示:

在编译过程中,Android.bp会被收集到out/soong/build.ninja.d,blueprint以此为基础,生成out/soong/build.ninja

Android.mk会由kati/ckati生成为out/build-aosp_arm.ninja

两个ninja文件会被整合进入out/combined-aosp_arm.ninja

2.2 编译步骤

image

三.编译环境初始化

3.1 envsetup说明

编译的第一步需要初始化一下环境变量。这是由envsetup.sh完成的,这里的envsetup.sh被link到了 build/make/envsetup.sh。

envsetup.sh 主要做了下面几个事情:
image

3.2 Lunch说明

环境变量初始化完成后,我们需要选择一个编译目标。lunch 主要作用是根据用户输入或者选择的产品名来设置与具体产品相关的环境变量。

3.3 Make说明

执行完lunch命令后,就可以使用make命令来执行编译Build。

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

如果找到“build/soong/soong_ui.bash”,就使用soong_ui.bash 来进行编译,否则使用原始的make命令进行编译。

四.总结

Android10.0中,mk文件通过kati\ckati编译生成 build-aosp_arm.ninja, bp文件通过blueprint-soong解析编译生成为build.ninja ,这些ninja文件会合并成combined-aosp_arm.ninja,最终通过ninja工具进行最终的编译。

标签:make,mk,编译,soong,ninja,Android,编译系统
From: https://www.cnblogs.com/zuojie/p/17341422.html

相关文章

  • Android 判断输入框是正在输入的拼音或词组。而不是最终的单词或短语
    Android输入框监听正在输入的拼音或词组需要结合输入法的特性,具体实现方式可能因输入法而异。在一些输入法中,可以通过InputConnection的getComposingText()方法获取正在输入的拼音或词组,而不是最终的单词或短语。在监听输入框内容变化时,可以在onTextChanged()回调中调用......
  • Android JAVA连接MQTT,以及常见问题
    本文介绍如何使用Android(JAVA)客户机连接MQTT服务器第一步先引入MQTT在 build.gradle添加以下:dependencies{implementation'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'}接下来演示如何连接创建MQTT客户机类 MqttConnect.classpublicclassMqtt......
  • Android-Service的生命周期
    原文地址blog.csdn.net与Activity类似,Service也有自己的生命周期函数,在不同的时刻,系统会调用对应的Service生命周期函数,不过与Activity声明周期相比,Service的声明周期更加简单,我们通过官方给出的一张图片来体会一下:Service作为Android四大组件之一,应用非常广泛。和Activit......
  • Android补间动画
    帧动画是通过连续播放图片来模拟动画效果,而补间动画开发者只需指定动画开始,以及动画结束"关键帧",而动画变化的"中间帧"则由系统计算并补齐!1.补间动画的分类和InterpolatorAndoird所支持的补间动画效果有如下这五种,或者说四种吧,第五种是前面几种的组合而已。AlphaAnimation:透明度渐......
  • 视频直播源码,android动画小飞机旋转效果
    视频直播源码,android动画小飞机旋转效果 //小飞机旋转动效果publicclassPlaneViewextendsView{  privatePaintpaint;  privateintwidth;  privateintheight;  privatefloatcurLength;  privatefloatallLength;  privatefloatmAnimato......
  • Android Automation
    启动虚拟机 emulator@pixel2-skip-adb-auth-allow-host-audio-port5554-no-snapshot-no-boot-anim-memory3072-partition-size8192启动Appium自动下载ChromeDriverappium--allow-insecurechromedriver_autodownload占位......
  • Android Tencent Shadow 插件接入指南
    原文地址www.jianshu.com撒盐一、clone仓库二、测试编译三、将Shadow库发布到本地仓库四、宿主接入1添加依赖2添加代理Activity主题3清单文件注册代理Activity4在宿主中创建PluginManager管理工具a创建PluginManager文件升级器b创建插件进程服务c......
  • Android多线程通信-handler机制
    AndroidStudio主线程不允许耗时操作,最后通过多线程实现了AndroidStudio远程连接数据库但是主线程可以分线程传值,分线程却不可以直接向主线程传值AndroidStudio通过handler和massage解决了这个问题 话不多说,看代码——privateHandlerhandler=newHandler(){@Overridep......
  • Android Studio的安装及环境配置
    AndroidStudio的安装及环境配置安装jdk下载及安装AndroidStudio下载官网:https://developer.android.google.cn/studio/往下滑:建议下载到除C盘以外的盘:下载好安装程序之后双击安装:一路next,installAndroidVirtualDevice安卓虚拟设备,就是在电脑上虚拟出......
  • android OTA升级(VAB分区)
    androidOTA升级(VAB分区) 升级开始前,升级程序update_engine将要升级的slot标记为unsuccessful,调用boot_ctl的SetSlotAsUnbootable()hardware/interfaces/boot/1.1/default/boot_control/libboot_control.cpp316boolBootControl::SetSlotAsUnbootable(unsignedintslot){......