玩转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
相关推荐
青皮桔几秒前
CSS实现百分比水柱图
前端·css
影子信息6 分钟前
vue 前端动态导入文件 import.meta.glob
前端·javascript·vue.js
青阳流月7 分钟前
1.vue权衡的艺术
前端·vue.js·开源
样子201811 分钟前
Vue3 之dialog弹框简单制作
前端·javascript·vue.js·前端框架·ecmascript
kevin_水滴石穿12 分钟前
Vue 中报错 TypeError: crypto$2.getRandomValues is not a function
前端·javascript·vue.js
孤水寒月1 小时前
给自己网站增加一个免费的AI助手,纯HTML
前端·人工智能·html
CoderLiu1 小时前
用这个MCP,只给大模型一个figma链接就能直接导出图片,还能自动压缩上传?
前端·llm·mcp
伍哥的传说1 小时前
鸿蒙系统(HarmonyOS)应用开发之实现电子签名效果
开发语言·前端·华为·harmonyos·鸿蒙·鸿蒙系统
海的诗篇_2 小时前
前端开发面试题总结-原生小程序部分
前端·javascript·面试·小程序·vue·html
uncleTom6662 小时前
前端地图可视化的新宠儿:Cesium 地图封装实践
前端