【转贴】Android Building System 分析

u-boot顶层makefile、mkconfig、config.mk文件分析 此手册自己总结的,网上找不到第二份,除非拷的我的。u-boot1.1.6版本顶层makefile文件、mkconfig文件、config.mk文件分析,会对执行make ..._config后的过程进行详细分析,看完这个,移植u-boot决定没问题,至少有个好的开始。如果要后面的移植或u-boot2012版本的说明,可以联系我。 立即下载

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

 

設定檔

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

  • Android .mk
  • AndroidProducts.mk
  • target_<os>-<arch>.mk, host_<os>-<arch>.mk and <os>-<arch>.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 選擇、設定。*<os>-<arch>.mk 則是針對選擇的作業系統和 CPU 架構,進行相關設定。

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

 

參數

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

  • make ONE_SHOT_MAKEFILE=<path to Androiod.mk>

 

透過定義 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
    • 指定編譯參數 (*<os>-<arch>.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.<path of makefile>.<variable> 形式的變數。並將 makefile 路徑存在 PRODUCTS 變數。因此,透過 PRODUCTS 能取得所有的 product 路徑/名稱,並透過 PRODUCTS.<path of makefile>.<variable> 形式的變數取得內容。

 

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.<path of Android .mk>.<variable> 形式。例如, Android .mk 定義了 LOCAL_MODULE_SUFFIX ,變會存成 ALL_MODULES.<path of 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 depend on 這些 rule ,使這些 module 被編譯。

 

結論

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

 

本文转自:http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/393

 

 

KITTI数据集下载及解析 KITTI数据集下载及解析 版本 更新时间 更新内容 作者 1 V 1.0 xxx 完成主体内容 W. Xiao 2 文章目录KITTI Dataset1 简介1.1 数据采集平台1.2 坐标系2 数据解析2.1 image文件2.2 velodyne文件2.3 calib文件2.4 label文件3 KITTI可视... 阅读详情

相关推荐

路由 NAT(简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表)

为了有效节约公网IPv4地址,并提供一定的网络安全保障能力,NAT网络地址转换技术孕育而生。NAT(Network Address Translation)网络地址转换,主要将私有地址转换成公网地址。NAT优点能够缓解公网地址紧缺问题。解决IP地址空间冲突或重叠的问题。网络扩展性更高,本地控制也更容易。内网结构变得不可见,从而增加了安全性。NAT缺点因为地址映射的原因,当网络转换过多时会存在转发延迟的问题。端到端寻址变得困难,因为经过了NAT地址转换相当于换了张脸,想找人就难了。

Hades_Ling的优快云博客 8750

Android 编译命令:make -j8 SHOWCOMMAND=TRUE 2>&1 | tee build.log解释

在编译Android的时候,经常用到命令:make -j8 SHOWCOMMAND=TRUE 2>&1 | tee build.log其中 make 是编译命令, -j8 这里的 8 指的是线程数量,就是要用几个线程去编译这个工程,一般会是 CPU核心数的2 倍。 通过参数showcommands 将编译的命令显示出来, 比如原来编译命令是make -j8 但是编译的细节没看到,如果要将编译的命令

King_Guo的博客 3935

XCP_Basic 移植步骤

XCP_Basic 移植步骤

ggzzc的博客 2315

Android Building System 分析

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

小九的专栏 830

华为2288H-V5服务器做raid的详细步骤

操作步骤 服务器启动界面 按del键进入设置输入密码,2288H-v5默认密码是Admin@9000 移动光标选择device manager 驱动管理选择configurationutility 配置管理 选择main menu 主菜单 选择第一个 configuration management 配置管理 选择create virtual driver 创建虚拟驱动选择select RAID level 选择RAID等级选择level-5 选择select drivers 选择驱......

weixin_46041124的博客 1万+

LTO编译器优化介绍以及开启方法

LTO优化的详细介绍

性感的小君君 4922

android编译系统学习

android的编译文件主要依赖于mk文件,其源码编译名字是Android.mk,而不我们常见的Makefile文件。 android目录下的Makefile文件,include了build/core目录下的main.mk文件。 main.mk文件 main.mk要完成功能,主要如下: 包含build/core/config.mk:根据目标板的标准变量和主机信息,设置一些变量。确定输出目录

wzcqr0501的专栏 2056

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 291

安卓 build/core/Makefile 以及main.mk

安卓 build/core/Makefile 以及main.mk android make 系统总共分为四层 arch board device product 在各个字android.mk文件中引用的定义都存放在./build/core/下! 比如android.mk中的 include (CLEARVARS)它对应的是在./build/core/config.mk中的CLEAR...

u010783226的专栏 994

ADS 2023 实战:手把手教你仿真一个中心频率 2.4GHz 的带通滤波器(附工程文件)

本文详细介绍了使用ADS 2023软件设计和仿真中心频率2.4GHz带通滤波器的全流程,包括工程准备、指标定义、原理图设计、仿真优化及实际电路实现。通过切比雪夫滤波器拓扑和参数优化,实现高性能的带通滤波器设计,适用于无线通信系统。附有工程文件和常见问题解决方案,助力工程师快速掌握射频滤波器设计技巧。

weixin_30790841的博客 481

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

android build/core/main.mk 简单的使用方法

android build/core/main.mk 简单使用               在开发时,突然有个需求需要在编译rom时,通过makefile编译脚本,区分是否是新功能和原生功能,我次了,这可怎么办,于是参考各种网上的makefile脚本语法,于是做了简单的实现; 简单理解makefile和main.mk http://blog.youkuaiyun.com/xiao_yuanjl/arti

yuanjl 2201

LangChain与LangGraph核心区别解析

LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

weixin_35774598的博客 1898
上一篇: Android源码编译反思
下一篇: linux Makefile时间戳
sanlinux
博客等级 码龄17年 92粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值