Android Building System 分析(转)

2024-04-22 17:48
文章标签 分析 android system building

本文主要是介绍Android Building System 分析(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标签:

android

core

package

变数

makefile

it

 
想要了解一個系統,我常會從 makefile或是 building system 下手,以了解系統組成元素為何? 目錄結構為何? 對於 Android ,我也不例外。透過了解 building system,我們能知道如何新增、修改、刪除程式,並保有完整性,順利編譯出結果。

設定檔

Android building system 包括幾種重要的設定檔,

  • Android.mk
  • AndroidProducts.mk
  • target_<os>-.mk, host_-.mk and-.mk
  • BoardConfig.mk
  • buildspec.mk

Android.mk 是 module 和 package 的設定檔,每個 module/package 的目錄下都會有一個Android.mk。所謂的 module 是指系統的 native code ,相對於用 Java 寫成的 Android application 稱為 package。

AndroidProducts.mk 則設定 product 配置。 product 即特定系統版本,透過編譯不同product ,產生不同軟體配置內容,安裝不同的 application。 Product可視為特定專案,產生特定規格系統。

BoardConfig.mk 是為 product 主板做設定,像是 driver 選擇、設定。*-.mk則是針對選擇的作業系統和 CPU 架構,進行相關設定。

buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的 product、平台、額外的 module/package 等。

 

參數

build/envsetup.sh 實作一個 mm 指令,以編譯單一 module,不需編譯整個 sourcetree。ONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用方法是在執行 make時,將該變數指定為 module 的 Android.mk。

  • make ONE_SHOT_MAKEFILE=

 

透過定義 CREATE_MODULE_INFO_FILE , building system 會將所有 module 資訊列在$(PRODUCT_OUT)/module-info.txt 檔案裡。

  • make CREATE_MODULE_INFO_FILE=true

設定 BUILD_TINY_ANDROID=true , building system 產生一個簡單的 image,以測試硬體的可用度。此功能用於移植的早期階段,以快速 bring up 。

HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 產生 binary的目的為 debug 或 release 。透過設定此二變數,能產生包含 debug information 的 binry。

  • debug
  • release

這些參數,也可設於 buildspec.mk 裡,以避免開發過程不斷的重新指定。

 

Goals

一般編輯整個 Android 系統,就是使用 droid 這個 goal。 droid 會產生一個完整的系統,包括bootloader、kernel、系統程式、模組和應用程式。

showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。透過 showcommands這個 goal, building system 顯示過程中每一個步驟的詳細指令。

 

 

Makefile 的流程

 

  • 初始化相關變數
  • 偵測編譯環境和目標環境
  • 決定目標 product
  • 讀取 product 的設定
  • 讀取 product 所指定之目標平台架構設定
    • 選擇 toolchain
    • 指定編譯參數 (*-.mk)
  • 清除輸出目錄
  • 設定/檢查版本編號
  • 讀取所有 BoardConfig.mk 檔案
  • 讀取所有 module 的設定
  • 根據設定,產生必需的 rule
  • 產生 image

以上的主要流程都是由 build/core/main.mk 所安排。

 

初始化和偵測

由 build/core/config.mk 所進行。 build/core/envsetup.mk 檢查 developer的設定 (buildspec.mk) ,並檢查執行環境,以決定輸出目錄、項目。

build/core/config.mk 本身還依據參數,決定解譯時的相關參數。像是 compiler 的路徑、flags,lex 、yacc 的路徑參數等。

關於 product 的相關設定,則是由 build/core/product_config.mk 所處理,使用build/core/product.mk 提供之 macro 載入。根據 AndroidProduct.mk 的內容,product_config.mk 決定了

  • PRODUCT_TAGS
  • OTA_PUBLIC_KEYS
  • PRODUCT_POLICY
  • ......

 

Product 設定的讀取

Android product 的設定來自於 build/target/product/AndroidProduct.mk 和vendor 子目錄下的 AndroidProduct.mk 。 building system 透過 find 指令,找出所有可能的AndroidProduct.mk。 AndroidProduct.mk 裡定義 PRODUCT_MAKEFILES變數,列舉所有實際定義 product 的 makefile。這些 makefile 各自定義獨立的 product 。product相關參數,存成 PRODUCTS. . 形式的變數。並將 makefile 路徑存在 PRODUCTS 變數。因此,透過PRODUCTS 能取得所有的 product 路徑/名稱,並透過 PRODUCTS. . 形式的變數取得內容。

 

Module 設定的讀取

Module 是指 native code 的軟體元件,而 Java application 則被稱為 package。build/core/definitions.mk 定義 module/package 相關 macro ,讀取、檢查module/package 定義檔;分散 source tree 各處的 Android.mk 檔案。 build/core/main.mk 使用 find 指令,在這些子目錄下找出所有Android.mk ,並將路徑存在 subdir_makefiles 變數裡。最後,include 這些檔案。

這些 Android.mk 會 include 定義成變數 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE等,和其目的相配的 makefile。這些 makefile 會變 Android.mk 定義之內容,存成 ALL_MODULES. Android.mk>. 形式。例如, Android.mk 定義了 LOCAL_MODULE_SUFFIX ,變會存成 ALL_MODULES. Android.mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路徑,當樣會存於 ALL_MODULES 變數裡。

Search Android.mk 的路徑,基本上會是整個 source tree 。但會依特定的 goal ,選擇性只找尋特定目錄。例如SDK 只需特定目錄下的 Android.mk 。

 

Board Level 設定

和目標平台主板相關之設定,例如使用了什麼裝置、driver 等,或是是否需要編譯 bootloader 、 kernel等,都是在 BoardConfig.mk 裡設定。同樣,每張主板可以有不同設定,存在不同目錄下的 BoardConfig.mk ,以find 尋找如下檔案:

  • build/target/board/$(TARGET_DEVICE)/BoardConfig.mk
  • vendor/*/$(TARGET_DEVICE)/BoardConfig.mk
TARGET_DEVICE 是 product 所定義,因此同一個 BoardConfig.mk 可被多個 product所使用。一個 TARGET_DEVICE ,通常只有一個 BoardConfig.mk 。 BoardConfig.mk 會被直接include 到 building system 的 name space 裡。因此,一些 module 的enable/disable ,可以在 BoardConfig.mk 以對映不同的主板。

 

Rules

在 module 的定義檔 Android.mk 裡,可定義 module 的 tag, LOCAL_MODULE_TAGS,以分類這些module。每一個 product 可以指定需要的 tag (PRODUCT_TAGS),使 building system只編譯標示這些 tag 的 module。在 build/core/main.mk 裡,所有標示特定 tag 的 module 收集為ALL_DEFAULT_INSTALLED_MODULES ,並 include build/core/Makefile處理。

build/core/Makefile 為這些 module 產生 rule ,並使產生 image 的 goal dependon 這些 rule ,使這些 module 被編譯。

 

結論

Android 的 building system 其實不是那麼複雜。在了解之後,也不是那麼難修改。但, GNU make的一些語法,所 building system 使用一些不是那麼直覺的用法,使的 building system較難了解。但,花點心思就能克服。


这篇关于Android Building System 分析(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926452

相关文章

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专