热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于编译、关于Make、Soong、Bazel

关于编译相关的总结1.Make、Soongsource的时候会配置本地的环境变量,构建文件的软链接,以及生成lunch命令、get_var等等&#x


关于编译相关的总结


1. Make、Soong

source的时候会配置本地的环境变量,构建文件的软链接,以及生成lunch命令、get_var等等,具体的查看build/envsetup.sh。
然后lunch的时候根据选择的product来决定执行哪些编译选项,编译哪些mk,也就是在mk中的PRODUCT相关的变量都通过lunch来决定。
然后具体的编译代码最底层使用的还是gcc等编译成二进制可执行文件,当然因为整个源码庞大,需要先生成中间产物,也就是下面说的。
以前的mk文件由linux自带的makefile编译控制,mk文件就是make的配置;现在 mk文件由kati读取,并转为ninjia。
关于make和soong多讲来句,make并不是linux本身的一个功能,make也是一个工具,
Sudo apt-get install make
只不过现在ubuntu等linux内核的系统,发行时自带了这一安装包,所以不需要安装。
而现在的bp文件依赖的soong,其实就是编译时生成的soong_ui,在out目录下。
而生成soong_ui这个二进制程序依赖的就是soong_ui.bash这个bash脚本,其中又依赖go工具编译,最终生成二进制文件。

具体的Soong_ui.bash编译的逻辑,参考这篇文章,分析的不错:
https://gitee.com/aosp-riscv/working-group/blob/master/articles/20210111-soong-process.md
就不要重复造轮子了。以后有新的理解再补充。

然后现在mk正在转为bp文件,Android.bp,bp文件由soong读取,转为ninjia,bp文件和mk文件本质上是一样的,都是配置文件,mk文件配置Make,bp文件配置soong。最终编译系统执行编译时读取的是ninjia文件,ninjia文件就是整个编译过程所有的规则(rule),非常简单,但是多!因为每个文件就是一个规则,这是最简单的方式,当然还有一些pool的方式,一组文件执行一个规则,减少时间。

这样的好处是对于单个模块来讲,编译一次,不属于自己模块的可以直接拿上次的编译结果来编译,不用重新编译,加快开发。
但是对于底层适配来说,每次的改动都得重新编译,都得重新生成一次ninjia,完整的编译需要三四个小时,什么都干不了,即使只改动一点点代码,也还是要耗费几个小时重新编译。
简单来说,对于应用层来说,是好事。但是对底层来说,还是阵痛期。除非整个源码都使用一种编译方式,也就是全部转为bp文件,应该编译会快很多。
但是bp文件不支持条件语句,也不包含控制流语句;为了解决这些问题,又只能引入go语言来进行解决,又搞得复杂了。bp可以生成哪些module,由soong_build.html控制。

大神的仓库:
https://gitee.com/aosp-riscv/working-group
最后总结一句题外话,如上面文章作者说的,既然谷歌都已经宣布bazel了,说明Soong已经没必要纠结了,在上面浪费大量时间,是不可取的。不如直接了解bazel,至于为什么这么说下面简单介绍。


2. Bazel

bazel的配置文件叫做BUILD.bazel。
为什么说应该主要了解bazel,因为bazel官网都有了,soong只有个readme。。
bazel官网:https://bazel.build/

另一个原因是谷歌自家的应用都使用这个bazel编译系统了,自家所有的应用,可想谷歌的推行力度之大。安卓官网也写了:
Google 计划使用几年的时间将 Android 构建系统迁移到 Bazel。此迁移处于早期阶段,但您可以对当前的 build 文件做出一些更改,以便开始针对 Bazel 做好准备。迁移完成后,Bazel 将取代 AOSP 中的所有现有构建系统和 build 配置系统(Make、Kati、Soong、基于 Make 的产品配置)。
看最后一句,谷歌想把编译相关的任务都交给bazel来做。大工程,安卓代码太庞大了,不知道什么时候能够完成。。
bazel官网关于编译系统的介绍 https://bazel.build/basics


3. bazel何时完全支持Android还未知

所以还是继续了解soong,下一步有时间把soong的readme翻译一下。







推荐阅读
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 深入解析JWT的实现与应用
    本文深入探讨了JSON Web Token (JWT) 的实现机制及其应用场景。JWT 是一种基于 RFC 7519 标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了 JWT 的结构、生成和验证过程,并讨论了其在现代 Web 应用中的实际应用案例,为开发者提供了全面的理解和实践指导。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 在 Android 开发中,通过合理利用系统通知服务,可以显著提升应用的用户交互体验。针对 Android 8.0 及以上版本,开发者需首先创建并注册通知渠道。本文将详细介绍如何在应用中实现这一功能,包括初始化通知管理器、创建通知渠道以及发送通知的具体步骤,帮助开发者更好地理解和应用这些技术细节。 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
author-avatar
jajajaja幸福_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有