玩转Android Framework:Soong构建系统

本文将介绍什么是Soong构建系统以及如何阅读及编写BP文件

Soong构建系统介绍

对于Android App层开发来说,使用的是Gradle进行项目的构建,AOSP在Android 7.0之前,使用的是Make来进行AOSP的构建。

但是Android 7.0开始,Google开始使用Soong来进行AOSP的构建。 相比make文件,Soong使用的bp文件语法更加简洁,这是官方文档,里面有对Soong的介绍以及与make的对比:

source.android.com/docs/setup/...

Soong并不是终点,Google最终的目的是会将构建系统全面迁移到Bazel,这里是关于迁移到Bazel的计划:

source.android.com/docs/setup/...

Soong源码及构建流程

Soong是使用Go进行编写的,源代码在/build/soong,目录结构大致如下:

可以看到这里有一个README.md,里面详细介绍了关于Soong构建系统的一些知识,如果有兴趣可以看看。

关于Soong的启动分析,可以参考这篇文章:

zhuanlan.zhihu.com/p/342817768

BP文件介绍

首先这是BP文件的大致结构:

css 复制代码
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

BP文件不包含控制流语句和条件语句,只是单纯的配置,复杂逻辑全部由Go完成,但是可以声明并使用变量。

首先以模块类型开头,比如上面的cc_binary,就是一个模块类型,其次必须指定一个name,而且按照官方文档的说法,这个name必须是唯一的,仅有两个例外情况是命名空间和预构建模块中的 Android.bp 属性值,其它的均为对模块类型的属性配置。

所有的模块类型和可配置属性可以参考这里:

ci.android.com/builds/subm...

比如cc_binary这个模块类型,可以在里面找到关于这个模块的详细解释和可配置属性都有哪些,以及对对应属性的解释:

cc_binary doc

Hello world

下面我们就要自己手动编写一个hello world c程序以及对应的bp文件,然后对其进行编译并运行。

第一步 创建工作目录

bash 复制代码
mkdir hello_world_test
cd hello_world_test

第二步 创建C文件

bash 复制代码
touch hello_world.c

下面是具体的代码:

c 复制代码
#include <utils/Log.h> //Android Log 库,用来打印输出到logcat,具体的实现在 /system/logging/liblog下面

int main(void) {
    int i;
    for(i = 0; i < 10; i ++) {
        ALOGD("JYC Hello World");
    }
}

第三步 创建BP文件

bash 复制代码
touch Android.bp

下面是BP文件的内容:

perl 复制代码
cc_binary {
    name: "jyc_hello_world", //定义模块名
    srcs: ["hello_world.c"], //指定源文件
    shared_libs: ["liblog"], //引用android log模块,具体的模块定义在 /system/logging/liblog/Android.bp 里面
}

第四步 编译hello world模块

记得要先进行编译环境的准备:

bash 复制代码
. build/envsetup.sh
lunch sdk_phone_x86_64

然后编译我们的hello world模块

bash 复制代码
make jyc_hello_world

最后可以看到编译成功:

从图片中我们可以看出,最终生成的可执行文件在out/target/product/emulator_x86_64/system/bin/这个目录下,到这个目录我们可以看到我们的hello world已经编译成功了:

第五步 运行程序

首先我们打开模拟器:

bash 复制代码
emulator

然后新开个Terminal,将文件push到模拟器上面:

bash 复制代码
cd /out/target/product/emulator_x86_64/system/bin
adb push jyc_hello_world /data/local

然后进入adb shell,并且到指定目录下执行:

bash 复制代码
adb shell
cd /data/local
logcat -c
./jyc_hello_world
logcat | grep "jyc"

然后我们就可以看到运行结果了:

其它

将Android make 文件转换成 bp文件

Soong提供了相关的工具,可以用来来将make文件转换成bp文件:

bash 复制代码
. build/envsetup.sh
lunch sdk_phone_x86_64
androidmk Android.mk > Android.bp

如果提示androidmk命令没有找到,那么可以先编译一下:

bash 复制代码
. build/envsetup.sh
lunch sdk_phone_x86_64
make androidmk

格式化Android bp文件

Soong还提供了一个工具来格式化bp文件:

bash 复制代码
. build/envsetup.sh
lunch sdk_phone_x86_64
bpfmt -w Android.bp
相关推荐
逐·風2 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫2 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦3 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子3 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山4 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享4 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
清灵xmf6 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨6 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL6 小时前
npm入门教程1:npm简介
前端·npm·node.js
小白白一枚1117 小时前
css实现div被图片撑开
前端·css