Android Building System 分析

Android Building System 分析
by thinker
關鍵字:
想要了解一個系統,我常會從 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,不需編譯整個 source tree。

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.

<PATH ofAndroid.mk>. 形式。例如,Android.mk 定義了 LOCAL_MODULE_SUFFIX ,變會存成

 ALL_MODULES.<PATH ofAndroid.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)

《C++编程实例100篇》是一本深入实践、极具价值的编程教程,它针对C++编程语言提供了丰富的实例,旨在帮助读者更好地理解和掌握C++的各项特性与编程技巧。这本书的经典之处在于它将理论与实践相结合,通过100个精心设计的编程实例,覆盖了C++的各个核心领域,包括基础语法、面向对象编程、模板、异常处理、STL(标准模板库)等。 我们来探讨C++的基础语法。C++是C语言的增强版,它保留了C语言的高效性和灵活性,并引入了类、对象和继承等面向对象编程概念。基础语法包括变量声明、数据类型、运算符、控制结构(如if语句、for循环、while循环)、函数的定义和调用等。在实例中,你可能会遇到如何编写简单的程序,如计算两个数的和,或者实现一个简单的猜数字游戏。 C++的面向对象编程是其一大特色。通过类和对象,你可以构建复杂的软件系统。类是对象的蓝图,它定义了对象的属性和行为。实例化一个类,就是创建一个具体的对象。继承允许你创建新的类,这些类从现有的类派生,共享其属性和方法,同时可以添加新的功能。多态性是面向对象的另一个关键特性,它使得不同类型的对象可以对同一消息作出不同的响应。这些概念在实例中会以各种形式展现,例如设计一个图形界面的类层次,或实现一个简单的模拟游戏。 接下来是模板,C++的模板功能让代码更加通用,可以处理不同类型的数据。模板分为函数模板和类模板,前者可以创建泛型函数,后者可以创建泛型类。通过模板,你可以编写出高效且灵活的代码,比如实现一个通用的排序算法。 异常处理是C++中用于处理程序运行时错误的机制。当程序出现异常情况时,可以抛出一个异常,然后在适当的点捕获并处理这个异常。这使得代码能够优雅地处理错误,而不是让程序崩溃。实例中可能会有涉及文件操作或网络通信时可能出现的异常处理示例。
一、毕业设计的技术背景和设计依据 计算机硬盘驱动器作为一种存储数据信息的设备,在目前的计算机系统中起着不可替代的作用,读写的快慢对整个计算机系统的性能无疑占有重要地位。硬盘式电子计算机磁记录机构中最为精密的一类微机电系统设备,它对振动的敏感性是由其结构决定的,而其控制尚未很好的解决,针对硬盘展开建模及控制有着重要的实际应用价值。 二、毕业设计的任务 现代硬盘一般有 1 - 5 个盘片,以常见的 3.5 英寸硬盘为例,盘片直径约为 95mm,厚度约为 0.635mm。磁头数量通常与盘片数量相关,每面盘片有一个磁头,比如一个 3 盘片的硬盘就有 6 个磁头。缓存大小可能为 32MB、64MB 或 128MB 等,如某普通硬盘缓存为 64MB,电机功率一般在 2 - 5W,像转速为 7200RPM(转每分钟)的电机功率约 3W。数据写入时,磁头在电机带动下,以平均寻道速度约 10 - 15m/s 定位磁道。以一块顺序写入数据的硬盘为例,当写入连续大文件,如 1GB 的视频文件时,在 SATA3.0 接口下,理论传输带宽为 6Gb/s(约 750MB/s),实际可达 500 - 600MB/s。读取时,磁头感应盘片磁场变化,如读取小文件(1MB 大小),若磁头寻道距离平均为 1000 个磁道,每次寻道时间约 8 - 12ms,读取速度会因寻道而下降到 10 - 20MB/s。 本设计选取硬盘驱动器作为研究对象,假设电机扭矩为 0.3N・m,盘片转动惯量为 0.003kg・m²,轴承摩擦力矩为 0.03N・m。在稳定旋转阶段,转速波动范围设为额定转速的 ±0.5%,即 ±36RPM。首先通过对该系统分析建立了其物理模型,然后针对以音圈电机作为伺服机构的硬盘磁头定位伺服系统的性能要求,对音圈电机的控制设计采用三种控制器方案,即极点配置法、PID控制方法、线性二次型调节器方法,分别比较分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值