玩转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
相关推荐
梁正雄10 分钟前
Python前端-2-css练习
前端·css·python
清汤饺子12 分钟前
用 Cursor 半年了,效率还是没提升?是因为你没用对这 7 个功能
前端·后端·cursor
蓝莓味的口香糖21 分钟前
【vue3】组件的批量全局注册
前端·javascript·vue.js
wefly201733 分钟前
开发者效率神器!jsontop.cn一站式工具集,覆盖开发全流程高频需求
前端·后端·python·django·flask·前端开发工具·后端开发工具
独泪了无痕1 小时前
自动导入 AutoImport:告别手动引入依赖,优化Vue3开发体验
前端·vue.js·typescript
GDAL1 小时前
MANIFEST.in简介
linux·服务器·前端·python
XPoet2 小时前
AI 编程工程化:Command——给你的 AI 员工编一套操作手册
前端·后端·ai编程
C_心欲无痕2 小时前
前端实现文件下载的完整流程
前端·状态模式
Fighting_p2 小时前
【element UI】el-select 组件下拉数据某一行文字过多时,文字换行展示,避免el-select下拉框被撑宽,导致页面过丑
前端·javascript
王家视频教程图书馆2 小时前
vue3从本地选择一个视频 展示到视频组件中
前端·javascript·音视频