Android编译学习笔记

构建Android官方文档

编译流程

google已经给出了android的原生编译流程:source build/envsetup.sh加载命令初始化环境、lunch选择平台、make执行编译命令。

设置环境

使用 envsetup.sh 脚本初始化环境:

source build/envsetup.sh 

. build/envsetup.sh

souce envsetup.sh就是把envsetup.sh里的命令载到当前的bash中,可以直接调用里面的命令。env就是环境的意思,setup可以理解为设置,这个文件加载可以理解为编译准备。比如说里面有launch指令,有mm指令,有make指令…

在source build/envsetup.sh后,输入hmm可以看到envsetup支持的一些接口:
在这里插入图片描述

选择目标

使用lunch 选择要构建的目标。lunch product_name-build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m 和其他类似命令的调用读取。,

如果在没有参数的情况下运行直接运行lunch,则会提示您从菜单中选择目标。
在这里插入图片描述
比如选择 aosp_arm-eng只需要输入1即可(直接回车也会默认使用aosp_arm-eng这个目标)。

构建代码

使用 m (m=make)构建所有内容。make 可以使用 -jN 参数处理并行任务。如果您没有提供 -j 参数,构建系统会自动选择您认为最适合您系统的并行任务计数。

如:

make -j8,让make最多允许8个编译命令同时执行,这样可以更有效的利用CPU资源。google的推荐是cpu线程数的2倍。不过还要根据实际情况去选择。

除了make以外,还要留意一下mm命令和mmm命令,这个命令也挺好用的。我们可以单独编译某些模块

m和mm以及mmm的区别?
m 在源码树的根目录执行make

mm 编译当前目录下的源码,不包含他们的依赖模块

mmm 编译指定目录下的所有模块,不包含他们的依赖模块

编译的时候,把日志输出到 build.log里面

make -jN 2>&1 | tee build.log

其中2>就是将标准出错重定向到某个特定的地方;&1是指无论标准输出在哪里。所以2>&1的意思就是说无论标准出错在哪里,都将标准出错重定向到标准输出中。tee的作用同时输出到控制台和文件。

Android.bp与Android.mk的区别

早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。

通过Kati将Android.mk转换成ninja格式的文件,通过Blueprint+ Soong将Android.bp转换成ninja格式的文件,通过androidmk将将Android.mk转换成Android.bp,但针对没有分支、循环等流程控制的Android.mk才有效
在这里插入图片描述

1、ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将
/2、 Android.bp文件转换成ninja格文件来编译。Android.bp是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写

3、Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件

/4、Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用

5、kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati

Android.mk-> Android.bp
Android.mk 转换为 Android.bp,Google提供了官方工具androidmk,只针对简单的mk文件转换,涉及分支,循环等控制转换并不准确androidmk使用 :androidmk android.mk > android.bp

编译完成以后,就会多一个out目录

当我们编译完系统以后,所编译的内容,包括结果,中间文件都会放在out目录下

/out/host/ 这个目录包含了针对主机的 Android 开发工具的产物。

/out/target/common/ 该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库,有时候我们称为中间文件。

/out/target/product// 包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。

镜像文件
我们在out/target/product/<产品名称>/目录下可以找到这些产出的镜像,用于刷机。

小结

android系统编译分为:环境搭建,下载源码,编译系统

在编译系统的时候,我们用到了几个命令,source 这个其实就是把控制编译的脚本载入到环境中,可以直接使用里面的命令。其中我们的lunch也是里面的命令。而这个脚本是shell脚本。
在这里插入图片描述

打开脚本可以看到上面的说明。

也就是说,顺序不可以乱,必须先把脚本载入到系统环境中。

第二个是lunch,参数你填写编号可以,写名称也可以。

user,userdebug,eng各是什么意思呢?

以下是官网的说明:
在这里插入图片描述
最后就是make啦,-j表示编译并发量,google的推荐是cpu线程数的2倍。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星谐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值