玩转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
相关推荐
无双_Joney5 小时前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(功能篇)
前端·后端·nestjs
在云端易逍遥5 小时前
前端必学的 CSS Grid 布局体系
前端·css
ccnocare5 小时前
选择文件夹路径
前端
艾小码5 小时前
还在被超长列表卡到崩溃?3招搞定虚拟滚动,性能直接起飞!
前端·javascript·react.js
闰五月5 小时前
JavaScript作用域与作用域链详解
前端·面试
泉城老铁5 小时前
idea 优化卡顿
前端·后端·敏捷开发
前端康师傅5 小时前
JavaScript 作用域常见问题及解决方案
前端·javascript
司宸5 小时前
Prompt结构化输出:从入门到精通的系统指南
前端
我是日安5 小时前
从零到一打造 Vue3 响应式系统 Day 9 - Effect:调度器实现与应用
前端·vue.js