【Android構建系統】了解Soong構建系統

背景介紹

在Android7.0之前,Android使用GNU Make描述和執行build規則。Android7.0引入了Soong構建系統,彌補Make構建系統在Android層面變慢、容易出錯、無法擴展且難以測試等缺點。

Soong利用Kati GNU Make克隆工具和Ninja構建系統組件來加速Android的構建。

下面從兩個方面來了解Soong構建系統:

  • 使用Soong構建系統構建自己模塊要熟悉的兩個內容,即.bp和.go。
  • Soong構建系統和Make構建系統的差異。

1.Soong構建系統中.bp和.go的關系

在Android的Soong構建系統中,.bp (Blueprint)文件和.go(Golang)文件共同協作,關系大概如下:

1.?.bp文件,聲明式構建配置

.bp文件用于定義模塊及其屬性,采用類似JSON的聲明式語法,描述模塊的構建規則(如源文件、依賴項、編譯選項等)

.bp文件不支持條件語句或控制流,僅用于靜態配置。

Soong預定義了模塊類型,如cc_library,cc_binary,? java_library等。

?例如,Android15源碼中Camera HAL AIDL Demo中的一段:

//hardware/google/camera/common/hal/aidl_service/Android.bp
cc_binary {name: "android.hardware.camera.provider@2.7-service-google",defaults: ["hardware_camera_service_defaults","camera_service_eager_hal_defaults",],init_rc: ["android.hardware.camera.provider@2.7-service-google.rc],
}

2. .go文件,邏輯處理與擴展

.go文件用于實現復雜的構建邏輯,例如

  • 解析.bp文件并生成Ninja構建規則
  • 處理條件編譯、環境變量、動態依賴等無法在.bp中直接表達的邏輯
  • 擴展模塊類型或自定義構建行為(如通過Go的發射機制)

使用GO語言編寫,靈活性高,可調用Android構建系統的底層API。

例如,通過LoadHook動態修改模塊屬性:

func myHook(ctx android.LoadHookContext) {if ctx.AConfig().IsEnvTrue("USE_FEATURE_X") {ctx.AppendProperties(map[string]interface{}{"cflags": ["-DFEATURE_X"]})}
}

3.協作關系

.bp負責“做什么”(聲明模塊和屬性), .go負責“怎么做”(實現復雜邏輯和生成構建規則)

轉換流程:

  1. Soong解析所有.bp文件,生成模塊依賴圖。
  2. .go代碼處理模塊間的動態邏輯(如根據產品配置選擇源碼)。
  3. 最終轉換為Ninja可執行的構建規則。

4.協作的典型例子1-條件編譯

在.bp中通過arch或target(.go中預定義的變量)分平臺配置,而跨模塊的全局條件(如產品型號)需要在.go中實現。

cc_library {srcs: ["generic.cpp"],arch: { arm: { srcs: ["arm.cpp] } },
}

?如果arch是arm, srcs是arm.cpp。arch是soong中預定義的變量,用于分平臺構建。

5.協作的典型例子2-模塊級別控制

例如, Android15 Camera HAL AIDL Demo構建中的一段:

gch_lazy_hal_cc_defaults {name: "camera_service_eager_hal_defaults",enabled: true,soong_config_variables: {use_lazy_hal: {enabled: false,},},
}gch_lazy_hal_cc_defaults {name: "camera_service_lazy_hal_defaults",enabled: false,soong_config_variables: {use_lazy_hal: {enabled: true,},},
}

6.總結

.bp文件.go文件
語法聲明式,類JSON命令式,Go語言
靈活性有限,無邏輯控制高,可編程
適用場景模塊定義、靜態依賴動態邏輯、構建規則擴展
維護者開發者構建系統工程師/高級開發者

2.Soong構建系統和Make構建系統的差異

這兩種構建系統在設計理念、語法結構和執行效率等方面又著顯著的差異。以下從多個維度對這兩種構建系統進行對比分析。

基本概念與發展背景

Make構建系統

  • Android早期使用的構建系統,基于GNU Make實現
  • 通過Android.mk文件定義構建規則
  • 隨著Android項目復雜度增加,逐漸暴露出性能瓶頸和可維護性問題

Soong構建系統

  • Android 7.0(Nougat)引入的新構建系統,旨在取代Make
  • 使用Android.bp文件(Blueprint格式)定義構建規則
  • 采用Go語言編寫,與Kati和Ninja構建系統組件配合使用
  • 設計目標式解決Make系統在大型項目中的性能瓶頸

語法結構與配置方式

Make語法特點

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libexample
LOCAL_SRC_FILES := example.cpp
include $(BUILD_SHARED_LIBRARY)
  • 命令式語法,包含變量定義和流程控制
  • 需要手動管理依賴關系
  • 基于shell命令執行構建任務

Soong語法特點

cc_library_shared {name: "libexample",srcs: ["example.cpp"],
}
  • 聲明式語法,類似JSON格式
  • 不支持條件語句和控制流,復雜邏輯由Go代碼處理
  • 強類型變量和屬性系統
  • 更簡潔直觀的模塊定義方式

系統架構與工作原理

Make系統架構

  • 串行構建方式,依賴關系手動指定
  • 擴展性差,配置復雜度隨項目規模增長而急劇上升
  • 增量構建能力有限

Soong系統架構

  • ?自動分析模塊依賴關系并生成構建圖
  • 支持并行構建,充分利用多核CPU
  • 高效的增量構建機制,僅重新編譯變更部分
  • 模塊化設計,易于擴展

性能與效率對比

構建速度

  • Make系統在大型項目上構建速度較慢,特別是全量構建時
  • Soong通過并行構建和精確的依賴分析,顯著提升構建速度

資源利用率

  • Make系統資源利用率低,主要受限于串行執行
  • Soong能充分利用現代多核處理器,實現高效資源利用

增量構建

  • Make需要開發者手動維護依賴關系,增量構建不可靠
  • Soong自動跟蹤文件變更,增量構建精確高效

功能特性對比

特性Make構建系統Soong構建系統
語法類型命令式聲明式
依賴管理手動指定自動處理
并行構建有限支持原生支持
增量構建基本支持高效支持
擴展性有限高度可擴展
跨平臺需要適配原生支持
學習曲線相對簡單較陡峭
條件編譯支持通過Go代碼實現
模塊化有限高度模塊化
與Android集成逐漸淘汰深度集成

實際應用場景

適合使用Make的場景

  • 維護舊的Android項目代碼
  • 小型項目或原型開發
  • 需要與現有Make系統集成的場景

適合使用Soong的場景

  • 新的Android平臺開發
  • 大型復雜項目
  • 需要高效并行構建的環境
  • 需要精確增量構建的項目

遷移于兼容性

  • Soong設計時考慮了與Make系統的兼容性
  • 提供androidmk工具可將Android.mk轉換為Android.bp
  • 過渡期間采用混合模式:Make由Kati解析生成ninja文件,再與Soong的ninja文件合并
  • 完全遷移到Soong是Android構建系統的未來方向

Make構建系統作為Android早期的構建解決方案,已經逐漸無法滿足現代大型項目的需求。Soong構建系統通過聲明式配置、自動依賴管理和并行構建等特性,顯著提升了Android項目的構建效率和可維護性。

Make和Soong構建系統的使用建議

  1. 新項目應直接采用Soong構建系統
  2. 舊項目可逐步將Android.mk轉換為Android.bp
  3. 復雜構建邏輯可通過Go擴展實現
  4. 充分利用Soong提供的工具鏈(bpfmt等)提高開發效率

隨著Android生態的發展,Soong構建系統將持續演進,可能最終向Bazel構建系統過渡,但其核心優勢仍將在Android構建領域發揮重要作用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81524.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息學奧賽一本通 1539:簡單題 | 洛谷 P5057 [CQOI2006] 簡單題

【題目鏈接】 ybt 1539:簡單題 洛谷 P5057 [CQOI2006] 簡單題 【題目考點】 1. 樹狀數組 模板題及講解:洛谷 P3374 【模板】樹狀數組 【解題思路】 解法1:樹狀數組 該有01構成數組初值都為0。 某位置的元素被修改奇數次后值為1&#x…

倉頡開發語言入門教程:搭建開發環境

倉頡開發語言作為華為為鴻蒙系統自研的開發語言,雖然才發布不久,但是它承擔著極其重要的歷史使命。作為鴻蒙開發者,掌握倉頡開發語言將成為不可或缺的技能,今天我們從零開始,為大家分享倉頡語言的開發教程,…

玉米籽粒發育

成熟玉米籽粒的結構 玉米籽粒的組成 成熟的玉米籽粒主要由以下三部分組成: 母體組織:包括種皮、胎座和花梗。種皮由珠被發育而來,起到保護種子的作用,并在種子的休眠和萌發中發揮重要作用。胚:包含根分生組織、莖分…

sherpa-ncnn:音頻處理跟不上采集速度 -- 語音轉文本大模型

目錄 1. 問題報錯2. 解決方法 1. 問題報錯 報錯: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…

Postman一直打不開的解決辦法

Postman 是一款非常流行的開源 API 開發工具,主要用于構建、測試、調試和文檔化應用程序接口(API)。但有時它的性能不會特別穩定,功能限制和擴展性不足;應用于開發、測試、運維等環節,尤其在開發 RESTful A…

問題|對只允許輸入的變量是否進行了更改

“對只允許輸入的變量是否進行了更改”這一問題的核心是:在編程中,某些變量被設計為僅用于輸入(只讀),但在代碼中可能被意外修改,導致潛在錯誤。以下是詳細解釋: 1. 什么是“只允許輸入的變量”…

RPC與SOAP的區別

一.RPC(遠程過程調用)和SOAP(簡單對象訪問協議)均用于實現分布式系統中的遠程通信,但兩者在設計理念、協議實現及應用場景上存在顯著差異。 二.對比 1.設計理念 2.協議規范 3.技術特性 4.典型應用場景 5.總結 三.總結…

c#的內存指針操作(僅用于記錄)

c#也可以直接操作內存指針,如下為示例: unsafe {byte[] a {1,2,3};fixed (byte* p1 a, p2 &a[^1]){Debugger.Log(1, "test", $"max index:{p2-p1}");Debugger.Log(1, "test", $"address:{(long)p1:X}")…

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示

Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示 前言一、回顧SQL標簽的內容1. 什么是JSTL SQL標簽?2.為什么要用SQL標簽?3.第一步:引入SQL標簽庫4. SQL標簽的核心功能:連接數據庫標簽常用屬性&…

羽毛球訂場小程序源碼介紹

基于ThinkPHP、FastAdmin以及UniApp開發的羽毛球訂場小程序源碼,這款小程序旨在為羽毛球愛好者提供便捷的場地預訂服務。 該小程序前端采用UniApp框架開發,具有良好的跨平臺兼容性,可以一鍵發布至iOS和Android平臺,極大地提高了開…

Unreal Engine: Windows 下打包 AirSim項目 為 Linux 平臺項目

環境: Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows環境安裝教程: 鏈接遇到的問題(問題:解決方案) 點擊Linux打包按鈕,跳轉至網頁而不是執行打包流程:用VS打開項…

SpringBoot 3.x 集成 MyBatisPlus

文章目錄 集成 MyBatisPlus第 1 步:創建 SpringBoot 項目第 2 步:添加 MyBatisPlus 依賴第 3 步:編寫 CRUD 代碼創建 Entity創建 Mapper創建 Service編寫 Controller第 4 步:執行初始化 SQL第 5 步:配置第 6 步:測試測試 ControllerMapper 層單元測試參考?? 目標 1:基…

java基礎-抽象類和抽象方法

1.abstract 可以修飾:類、方法 (1)修飾類: 類不能被實例化; 抽象類一定有構造器,便于子類實例化時調用; (2)修飾方法:抽象方法 只有方法的聲明&#xff…

解決電腦問題(8)——網絡問題

電腦網絡出現問題的原因較為復雜,以下是從網絡連接、網絡配置以及網絡環境等方面的常見問題及解決方法: 網絡連接問題 檢查物理連接:對于有線網絡,檢查網線是否插好,網線有無破損、斷裂等情況。對于無線網絡&#xff…

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出現問題】解決方案

ping baidu.coom可以通,ping www.baidu.com不通【DNS出現問題】解決方案 檢查IPV6是否有問題 # 1. 檢查 IPv6 地址,記住網絡接口的名稱 ip -6 addr show# 2. 測試本地 IPv6,eth0換成自己的網絡接口名稱 ping6 ff02::1%eth0# 3. 檢查路由 ip…

【AI生成PPT】使用ChatGPT+Overleaf自動生成學術論文PPT演示文稿

【AI生成PPT】使用ChatGPTOverleaf自動生成學術論文PPT演示文稿 文章摘要:使用ChatGPTBeamer自動生成學術論文PPT演示文稿??Beamer??是什么Overleaf編輯工具ChatGPT生成Beamer Latex代碼論文獲取prompt設計 生成結果 文章摘要: 本文介紹了一種高效利…

JVM 垃圾回收器

以下是對主流 JVM 垃圾回收器的詳細解析,涵蓋 一、Serial GC(單線程串行回收器) 二、Parallel GC(吞吐量優先回收器) 三、CMS(Concurrent Mark Sweep,低延遲回收器) 四、G1&…

從零開始學習three.js(21):一文詳解three.js中的矩陣Matrix和向量Vector

一、三維世界的數學基石 在Three.js的三維世界里,所有視覺效果的實現都建立在嚴密的數學基礎之上。其中向量(Vector) 和矩陣(Matrix) 是最核心的數學工具,它們就像構建數字宇宙的原子與分子,支…

ArcGIS Pro 3.4 二次開發 - 內容

環境:ArcGIS Pro SDK 3.4 .NET 8 文章目錄 內容1 工程1.1 創建一個空工程1.2 使用指定名稱創建新工程1.3 使用Pro的默認設置創建新工程1.4 使用自定義模板文件創建新工程1.5 使用 ArcGIS Pro 提供的模板創建工程1.6 打開現有工程1.7 獲取當前工程1.8 獲取當前工程的…

【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍歷、推導式與嵌套實戰

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…