玩转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
相关推荐
Java后端的Ai之路6 小时前
06-React-Props
前端·react.js·前端框架
Flynt7 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn7 小时前
渲染管线
前端
程序员大阳7 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝7 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金8 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉8 小时前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化
IMPYLH8 小时前
HTML 的 <wbr> 元素
前端·html
Dovis(誓平步青云)9 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
IT_陈寒10 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端