- 浏览: 926182 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
想要了解一個系統,我常會從 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 較難了解。但,花點心思就能克服。
发表评论
-
Android systrace
2018-09-12 11:13 1044Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1964Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 4119基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5213只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6465Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6380系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2133[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1388public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10028一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2155Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6176如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58482#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4884android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2427SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2420第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5830为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19841、Configuration类专门用于描述手机设备上的配置信 ... -
Android CRT Screen 电视效果
2012-05-17 11:12 2326Android 2.3 对关屏进行了优化,增加了一种类似于 ... -
android编译dex-preopt
2012-05-11 18:48 5453对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1902目前市面上的所有移动终端几乎都有camera应用,但andro ...
相关推荐
根据提供的文件内容,这本书名为《Gradle Recipes for Android Master the New Build System for Android》,由Ken Kousen所著。这本书专注于教授Android开发人员如何掌握Gradle这一新的构建系统。该书是O'Reilly ...
Android is the fastest growing operating system (OS) with one of the largest installed bases of any mobile OS. Android uses one of the most popular programming languages, Java, as the primary language...
This book received valuable community input through O’Reilly’s Open Feedback Publishing System (OFPS). Learn more at http://labs.oreilly.com/ofps.html. CSDN上见到过这个资源但无法下载,自己上传一个
Discover why device-agnostic mobile apps are the wave of the future, and start building apps that offer greater flexibility and a broader reach. Learn the basics for making a web page look great on...
Easy Build System 是一个简单且模块化的构建解决方案,它使开发者能够轻松地进行项目开发。这个系统允许快速且容易地为项目添加高级构建特性。 用于 Unity 的高级模块化构建系统。轻松、快速、可缩放、强大、...
Android Build System 4 In this document 4 Building the Android Platform 6 Building the Android Kernel 8 Build Variants 9 Configuring a New Product 10 In this document 10 Detailed Instructions 11 New ...
App Inventor 2 Building Android Apps takes you step-by-step through the whole process of designing and creating your first two android apps using the free MIT App Inventor 2 software. The book is ...
Learn the internals of a game engine by building one A succinct, hands-on guide to enhance your game development skills with Android SDK Who This Book Is For If you are an intermediate-level Android ...
You will begin with the basic concepts of Android game development, a brief history of Android games, the building blocks of Android games in Unity 5, and the basic flow of games. You will configure ...
Alarms and System Services Broadcasting Intents Summary Chapter 14 App Widgets Using Content Providers Through Widgets Summary Chapter 15 Networking and Web Overview Quick Example Networking Basics ...
In Pro OpenGL ES for Android, you'll find out how to harness the full power of OpenGL ES, and design your own 3D applications by building a fully-functional 3D solar system model using Open GL ES!...
总之,本报告不仅提供了关于Android平台的技术细节,还对其市场潜力和发展趋势进行了深入分析。对于希望进入移动应用开发领域的开发者而言,了解这些信息将非常有价值。随着移动互联网的发展,Android平台有望继续...