国产午夜男女在线|欧美日本一道高清国产|亚洲日韩乱码中文字幕|麻豆国产97在线精品一区|日韩一区2区三区另类图片|亚洲精品国产99在线观看|亚洲国产午夜福利精品大秀在线|一级做a爰片性色毛片免费网站

您當(dāng)前的位置 :寧夏資訊網(wǎng) > 消費(fèi) >  內(nèi)容正文
投稿

深度解析Android Build系統(tǒng)

寧夏資訊網(wǎng) 2020-10-02 14:07:17 來源: 閱讀:-

更多深度文章,請關(guān)注云計(jì)算頻道:https://yq.aliyun.com/cloud

概述

Android Build 系統(tǒng)是用來編譯 Android 系統(tǒng)、Android SDK 以及相關(guān)文檔的一套框架。在Android系統(tǒng)中,Android 的源碼中包含了許許多多的模塊。 不同產(chǎn)商的不同設(shè)備對于 Android 系統(tǒng)的定制都是不一樣的。如何將這些模塊統(tǒng)一管理起來,如何能夠在不同的操作系統(tǒng)上進(jìn)行編譯,如何在編譯時能夠支持面向不同的硬件設(shè)備,不同的編譯類型,且還要提供面向各個產(chǎn)商的定制擴(kuò)展,Android系統(tǒng)如何解決這些問題呢?這就是我們不得不談的Android Build 系統(tǒng)。

Android源碼目錄結(jié)構(gòu):

深度解析Android Build系統(tǒng)

Linux系統(tǒng)的make命令

在講解Android編譯系統(tǒng)之前,我們首先需要了解Linux系統(tǒng)的make命令。在Linux系統(tǒng)中,我們可以通過make命令來編譯代碼。Make命令在執(zhí)行的時候,默認(rèn)會在當(dāng)前目錄找到一個Makefile文件,然后根據(jù)Makefile文件中的指令來對代碼進(jìn)行編譯。如gcc,Linux系統(tǒng)中的shell命令cp、rm等等。

看到這里,有的小伙伴可能會說,在Linux系統(tǒng)中,shell和make命令有什么區(qū)別呢?

make命令事實(shí)也是通過shell命令來完成任務(wù)的,但是它的神奇之處是可以幫我們處理好文件之間的依賴關(guān)系。例如有一個文件T,它依賴于另外一個文件D,要求只有當(dāng)文件D的內(nèi)容發(fā)生變化,才重新生成文件T。

Make命令是怎么知道兩個文件之間存在依賴關(guān)系,以及當(dāng)被依賴文件發(fā)生變化時如何處理目標(biāo)文件的呢?答案就在前面提到的Makefile文件。Makefile文件實(shí)際上是一個腳本文件,就像普通的shell腳本文件一樣,只不過它遵循的是Makefile語法。Makefile文件最基礎(chǔ)的功能就是描述文件之間的依賴關(guān)系,以及怎么處理這些依賴關(guān)系。

Android Build簡介

Android Build 系統(tǒng)是 Android 系統(tǒng)的一部分,主要用來編譯 Android 系統(tǒng),Android SDK 以及相關(guān)文檔。該系統(tǒng)主要由 Make 文件,Shell 腳本以及 Python 腳本組成。

Android build分類:

  • build/core 目錄下的文件,這是Android Build的系統(tǒng)框架核心;

  • device目錄下的文件,存放的是具體的產(chǎn)品配置文件;

  • 各個模塊的編譯文件:Android.mk,位于模塊的原文件目錄下。

Android Build系統(tǒng)核心

Android Build系統(tǒng)核心在目錄build/core,這個目錄中有mk文件、shell腳本和per腳本,他們構(gòu)成Android Build系統(tǒng)的基礎(chǔ)和架構(gòu)。

在核心的buil/core里,系統(tǒng)主要干了三件事情:

深度解析Android Build系統(tǒng)

常用命令:

source build/envsetup.shlunchmake

envsetup.sh

而在build/envsetup.sh中主要完成了三件事:

深度解析Android Build系統(tǒng)

執(zhí)行Android系統(tǒng)的編譯,必須先執(zhí)行envsetup.sh腳本,這個腳本會建立Android的編譯環(huán)境。其具體執(zhí)行的是建立shell命令以及調(diào)用add_lunch_combo命令,這個命令的將調(diào)用該命令的所傳遞的參數(shù)存放到一個全局的數(shù)組變量LUNCH_MENU_CHOICES中。

envsetup.sh腳本中定義的常用shell命令:

命令說明
contact-button指定當(dāng)前編譯的產(chǎn)品
croot快速切換到源碼的根目錄,方便開始編譯
m編譯整個源碼,但不用將當(dāng)前的目錄切換到源碼的根目錄
mm編譯當(dāng)前目錄下的所有模塊,但是不編譯他們的依賴項(xiàng)
mm編譯當(dāng)前目錄下的所有模塊,但是不編譯他們的依賴項(xiàng)
cgrep對系統(tǒng)中所有的C/C++文件執(zhí)行g(shù)rep命令
sgrep對系統(tǒng)中所有的源文件執(zhí)行g(shù)rep命令

編譯 Android 系統(tǒng)

Android 系統(tǒng)的編譯環(huán)境目前只支持 Ubuntu 以及 Mac OS 兩種操作系統(tǒng)。在編譯Android系統(tǒng)之前我們需要先獲取完整的 Android 源碼。打開控制臺之后轉(zhuǎn)到 Android 源碼的根目錄,然后執(zhí)行如下命名:

source build/envsetup.sh lunch full-eng

關(guān)于這幾條命令的意思,我們上面提過。

第一步命令“source build/envsetup.sh”引入了 build/envsetup.sh腳本,該腳本的作用是初始化編譯環(huán)境,并引入一些輔助的 Shell 函數(shù);

第二步命令“l(fā)unch full-eng”是調(diào)用 lunch 函數(shù),并指定參數(shù)為“full-eng”。lunch 函數(shù)的參數(shù)用來指定此次編譯的目標(biāo)設(shè)備以及編譯類型。

第三部命令“make -j8”才真正開始執(zhí)行編譯。make 的參數(shù)“-j”指定了同時編譯的 Job 數(shù)量,這是個整數(shù),該值通常是編譯主機(jī) CPU 支持的并發(fā)線程總數(shù)的 1 倍或 2 倍(例如:在一個 4 核,每個核支持兩個線程的 CPU 上,可以使用 make -j8 或 make -j16)。

完整的編譯時間依賴于編譯主機(jī)的配置。

Build 結(jié)果

所有的編譯產(chǎn)物都將位于 /out 目錄下,該目錄下主要包含:

  • /out/host/:該目錄下包含了針對主機(jī)的 Android 開發(fā)工具的產(chǎn)物。即 SDK 中的各種工具,例如:emulator,adb,aapt 等。

  • /out/target/common/:該目錄下包含了針對設(shè)備的共通的編譯產(chǎn)物,主要是 Java 應(yīng)用代碼和 Java 庫。

  • /out/target/product//:包含了針對特定設(shè)備的編譯結(jié)果以及平臺相關(guān)的 C/C++ 庫和二進(jìn)制文件。其中,是具體目標(biāo)設(shè)備的名稱。

  • /out/dist/:包含了為多種分發(fā)而準(zhǔn)備的包,通過“make disttarget”將文件拷貝到該目錄,默認(rèn)的編譯目標(biāo)不會產(chǎn)生該目錄。

Build 生成的鏡像文件

Build 的產(chǎn)物中最重要的是三個鏡像文件,它們都位于 /out/target/product// 目錄下:

  • system.img:包含了 Android OS 的系統(tǒng)文件,庫,可執(zhí)行文件以及預(yù)置的應(yīng)用程序,將被掛載為根分區(qū)。

  • ramdisk.img:在啟動時將被 Linux 內(nèi)核掛載為只讀分區(qū),它包含了 /init文件和一些配置文件。它用來掛載其他系統(tǒng)鏡像并啟動 init 進(jìn)程。

  • userdata.img:將被掛載為 /data,包含了應(yīng)用程序相關(guān)的數(shù)據(jù)以及和用戶相關(guān)的數(shù)據(jù)。

Make 文件

整個 Build 系統(tǒng)的入口文件是源碼樹根目錄下名稱為“Makefile”的文件,當(dāng)在源代碼根目錄上調(diào)用 make 命令時,make 命令首先將讀取該文件。

Makefile 文件的內(nèi)容只有一行:“include build/core/main.mk”。該行代碼的作用很明顯:包含 build/core/main.mk 文件。在 main.mk 文件中又會包含其他的文件,其他文件中又會包含更多的文件,這樣就引入了整個 Build 系統(tǒng)。

在整個Build系統(tǒng)中,Make 文件間的關(guān)系是相當(dāng)復(fù)雜的??匆粡坢ake文件主要的關(guān)系圖:

深度解析Android Build系統(tǒng)

Make 常用文件:

文件名說明
main.mk主要的 Make 文件,該文件中首先將對編譯環(huán)境進(jìn)行檢查,同時引入其他的 Make 文件。另外,該文件中還定義了幾個最主要的 Make 目標(biāo),例如 droid,sdk,等(參見后文“Make 目標(biāo)說明”)。
help.mk含了名稱為 help 的 Make 目標(biāo)的定義,該目標(biāo)將列出主要的 Make 目標(biāo)及其說明。
envsetup.mk配置 Build 系統(tǒng)需要的環(huán)境變量,例如:TARGET_PRODUCT,TARGET_BUILD_VARIANT,HOST_OS,HOST_ARCH 等。 當(dāng)前編譯的主機(jī)平臺信息(例如操作系統(tǒng),CPU 類型等信息)就是在這個文件中確定的。 另外,該文件中還指定了各種編譯結(jié)果的輸出路徑。
pathmap.mk將許多頭文件的路徑通過名值對的方式定義為映射表,并提供 include-path-for 函數(shù)來獲取。例如,通過 $(call include-path-for, frameworks-native)便可以獲取到 framework 本地代碼需要的頭文件路徑。
combo/select.mk根據(jù)當(dāng)前編譯器的平臺選擇平臺相關(guān)的 Make 文件。
dumpvar.mk在 Build 開始之前,顯示此次 Build 的配置信息。
config.mk整個 Build 系統(tǒng)的配置文件,最重要的 Make 文件之一。該文件中主要包含以下內(nèi)容: 定義了許多的常量來負(fù)責(zé)不同類型模塊的編譯。 定義編譯器參數(shù)以及常見文件后綴,例如 .zip,.jar.apk。 根據(jù) BoardConfig.mk 文件,配置產(chǎn)品相關(guān)的參數(shù)。 設(shè)置一些常用工具的路徑,例如 flex,e2fsck,dx。
definitions.mk最重要的 Make 文件之一,在其中定義了大量的函數(shù)。這些函數(shù)都是 Build 系統(tǒng)的其他文件將用到的。例如:my-dir,all-subdir-makefiles,find-subdir-files,sign-package 等,關(guān)于這些函數(shù)的說明請參見每個函數(shù)的代碼注釋。
distdir.mk針對 dist 目標(biāo)的定義。dist 目標(biāo)用來拷貝文件到指定路徑
dex_preopt.mk針對啟動 jar 包的預(yù)先優(yōu)化。
pdk_config.mk顧名思義,針對 pdk(Platform Developement Kit)的配置文件。
post_clean.mk在前一次 Build 的基礎(chǔ)上檢查當(dāng)前 Build 的配置,并執(zhí)行必要清理工作。
legacy_prebuilts.mk該文件中只定義了 GRANDFATHERED_ALL_PREBUILT 變量。
Makefile被 main.mk 包含,該文件中的內(nèi)容是輔助 main.mk 的一些額外內(nèi)容。

Android 源碼中包含了許多的模塊,模塊的類型有很多種,例如:Java 庫,C/C++ 庫,APK 應(yīng)用,以及可執(zhí)行文件等 。并且,Java 或者 C/C++ 庫還可以分為靜態(tài)的或者動態(tài)的,庫或可執(zhí)行文件既可能是針對設(shè)備(本文的“設(shè)備”指的是 Android 系統(tǒng)將被安裝的設(shè)備,例如某個型號的手機(jī)或平板)的也可能是針對主機(jī)(本文的“主機(jī)”指的是開發(fā) Android 系統(tǒng)的機(jī)器,例如裝有 Ubuntu 操作系統(tǒng)的 PC 機(jī)或裝有 MacOS 的 iMac 或 Macbook)的。不同類型的模塊的編譯步驟和方法是不一樣,為了能夠一致且方便的執(zhí)行各種類型模塊的編譯,在 config.mk 中定義了許多的常量,這其中的每個常量描述了一種類型模塊的編譯方式。常見的有: BUILD_HOST_STATIC_LIBRARY BUILD_HOST_SHARED_LIBRARY BUILD_STATIC_LIBRARY BUILD_SHARED_LIBRARY BUILD_EXECUTABLE BUILD_HOST_EXECUTABLE BUILD_PACKAGE BUILD_PREBUILT BUILD_MULTI_PREBUILT BUILD_HOST_PREBUILT BUILD_JAVA_LIBRARY BUILD_STATIC_JAVA_LIBRARY BUILD_HOST_JAVA_LIBRARY 不同類型的模塊的編譯過程會有一些相同的步驟,例如:編譯一個 Java 庫和編譯一個 APK 文件都需要定義如何編譯 Java 文件。為了減少代碼冗余,需要將共同的代碼復(fù)用起來,復(fù)用的方式是將共同代碼放到專門的文件中,然后在其他文件中包含這些文件的方式來實(shí)現(xiàn)的。 模塊的編譯方式定義文件的包含關(guān)系: ![這里寫圖片描述](http://img.blog.csdn.net/20170402232734662?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhbmd6aGlob25nOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ## Make 編譯鏡像 ### make /make droid 如果在源碼樹的根目錄直接調(diào)用“make”命令而不指定任何目標(biāo),則會選擇默認(rèn)目標(biāo):“droid”(在 main.mk 中定義)。因此,這和執(zhí)行“make droid”效果是一樣的。 droid 目標(biāo)將編譯出整個系統(tǒng)的鏡像。從源代碼到編譯出系統(tǒng)鏡像,整個編譯過程非常復(fù)雜。這個過程并不是在 droid 一個目標(biāo)中定義的,而是 droid 目標(biāo)會依賴許多其他的目標(biāo),這些目標(biāo)的互相配合導(dǎo)致了整個系統(tǒng)的編譯。 那么需要編譯出系統(tǒng)鏡像,需要哪些依賴呢? ![這里寫圖片描述](http://img.blog.csdn.net/20170402233525703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhbmd6aGlob25nOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) droid 所依賴的其他 Make目標(biāo)說明:

名稱說明
apps_only該目標(biāo)將編譯出當(dāng)前配置下不包含 user,userdebug,eng 標(biāo)簽(關(guān)于標(biāo)簽,請參見后文“添加新的模塊”)的應(yīng)用程序。
droidcore該目標(biāo)僅僅是所依賴的幾個目標(biāo)的組合,其本身不做更多的處理。
dist_files該目標(biāo)用來拷貝文件到 /out/dist 目錄。
files該目標(biāo)僅僅是所依賴的幾個目標(biāo)的組合,其本身不做更多的處理
prebuilt該目標(biāo)依賴于 $(ALL_PREBUILT),$(ALL_PREBUILT)的作用就是處理所有已編譯好的文件。
$(modules_to_install)modules_to_install 變量包含了當(dāng)前配置下所有會被安裝的模塊(一個模塊是否會被安裝依賴于該產(chǎn)品的配置文件,模塊的標(biāo)簽等信息),因此該目標(biāo)將導(dǎo)致所有會被安裝的模塊的編譯。
$(modules_to_check)該目標(biāo)用來確保我們定義的構(gòu)建模塊是沒有冗余的。
$(INSTALLED_ANDROID_INFO_TXT_TARGET)該目標(biāo)會生成一個關(guān)于當(dāng)前 Build 配置的設(shè)備信息的文件,該文件的生成路徑是:out/target/product//android-info.txt
systemimage生成 system.img。

Build 系統(tǒng)中包含的其他一些 Make 目標(biāo):

Make目標(biāo)說明說明
make clean執(zhí)行清理,等同于:rm -rf out/
make sdk編譯出 Android 的 SDK
Make目標(biāo)說明說明
make clean-sdk清理 SDK 的編譯產(chǎn)物
make update-api更新 API。在 framework API 改動之后,需要首先執(zhí)行該命令來更新 API,公開的 API 記錄在 frameworks/base/api 目錄下。
make dist執(zhí)行 Build,并將 MAKECMDGOALS 變量定義的輸出文件拷貝到 /out/dist 目錄
make all編譯所有內(nèi)容,不管當(dāng)前產(chǎn)品的定義中是否會包含
make help幫助信息
make snod從已經(jīng)編譯出的包快速重建系統(tǒng)鏡像
make libandroid_runtime編譯所有 JNI framework 內(nèi)容
makeframework編譯所有 Java framework 內(nèi)容
makeservices編譯系統(tǒng)服務(wù)和相關(guān)內(nèi)容
make編譯一個指定的模塊,local_target 為模塊的名稱
make clean-清理一個指定模塊的編譯結(jié)果
makedump-products顯示所有產(chǎn)品的編譯配置信息,例如:產(chǎn)品名,產(chǎn)品支持的地區(qū)語言,產(chǎn)品中會包含的模塊等信息
makePRODUCT-xxx-yyy編譯某個指定的產(chǎn)品
makebootimage生成 boot.img

# 定制 Build 系統(tǒng)中內(nèi)容 當(dāng)我們要開發(fā)一款新的 Android 產(chǎn)品的時候,我們首先就需要在 Build 系統(tǒng)中添加對于該產(chǎn)品的定義。在 Android Build 系統(tǒng)中對產(chǎn)品定義的文件通常位于 device 目錄下,device 目錄下可以公司名以及產(chǎn)品名分為二級目錄,然后加入到系統(tǒng)中,如以前小米等基于Android深度定制的系統(tǒng)。 通常,對于一個產(chǎn)品的定義通常至少會包括四個文件:AndroidProducts.mk,產(chǎn)品版本定義文件,BoardConfig.mk 以及 verndorsetup.sh。 ## AndroidProducts.mk 該文件只需要定義一個變量,名稱為“PRODUCT_MAKEFILES”。 ``` PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/full_stingray.mk \ $(LOCAL_DIR)/stingray_emu.mk \ $(LOCAL_DIR)/generic_stingray.mk ``` ## 產(chǎn)品版本定義文件 該文件中包含了對于特定產(chǎn)品版本的定義。該文件可能不只一個,因?yàn)橥粋€產(chǎn)品可能會有多種版本。 通常情況下,我們并不需要定義所有這些變量。Build 系統(tǒng)的已經(jīng)預(yù)先定義好了一些組合,它們都位于 /build/target/product 下,每個文件定義了一個組合,我們只要繼承這些預(yù)置的定義,然后再覆蓋自己想要的變量定義即可。 ``` # 繼承 full_base.mk 文件中的定義 $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk) # 覆蓋其中已經(jīng)定義的一些變量 PRODUCT_NAME := full_lt26 PRODUCT_DEVICE := lt26 PRODUCT_BRAND := Android PRODUCT_MODEL := Full Android on LT26 ``` ## BoardConfig.mk 該文件用來配置硬件主板,它其中定義的都是設(shè)備底層的硬件特性。例如:該設(shè)備的主板相關(guān)信息,Wifi 相關(guān)信息,還有 bootloader,內(nèi)核,radioimage 等信息。 ## vendorsetup.sh 該文件中作用是通過 add_lunch_combo 函數(shù)在 lunch 函數(shù)中添加一個菜單選項(xiàng)。該函數(shù)的參數(shù)是產(chǎn)品名稱加上編譯類型,中間以“-”連接,例如:add_lunch_combo full_lt26-userdebug。/build/envsetup.sh 會掃描所有 device 和 vender 二 級目 錄下的名稱 為"vendorsetup.sh"文件,并根據(jù)其中的內(nèi)容來確定 lunch 函數(shù)的 菜單選項(xiàng)。 在配置了以上的文件之后,便可以編譯出我們新添加的設(shè)備的系統(tǒng)鏡像了。 我們可以使用命令: ``` source build/envsetup.sh ``` 來查看Build 系統(tǒng)已經(jīng)引入了剛剛添加的 vendorsetup.sh 文件。 ## 添加新模塊 在源碼樹中,一個模塊的所有文件通常都位于同一個文件夾中。為了將當(dāng)前模塊添加到整個 Build 系統(tǒng)中,每個模塊都需要一個專門的 Make 文件,該文件的名稱為“Android.mk”。Build 系統(tǒng)會掃描名稱為“Android.mk”的文件,并根據(jù)該文件中內(nèi)容編譯出相應(yīng)的產(chǎn)物。 注: 在 Android Build 系統(tǒng)中,編譯是以模塊(而不是文件)作為單位的,每個模塊都有一個唯一的名稱,一個模塊的依賴對象只能是另外一個模塊,而不能是其他類型的對象。對于已經(jīng)編譯好的二進(jìn)制庫,如果要用來被當(dāng)作是依賴對象,那么應(yīng)當(dāng)將這些已經(jīng)編譯好的庫作為單獨(dú)的模塊。對于這些已經(jīng)編譯好的庫使用 BUILD_PREBUILT 或 BUILD_MULTI_PREBUILT。例如:當(dāng)編譯某個 Java 庫需要依賴一些 Jar 包時,并不能直接指定 Jar 包的路徑作為依賴,而必須首先將這些 Jar 包定義為一個模塊,然后在編譯 Java 庫的時候通過模塊的名稱來依賴這些 Jar 包。 那么怎么編寫Android.mk 文件呢? Android.mk 文件通常以以下兩行代碼作為開頭: ``` LOCAL_PATH := $(call my-dir) //設(shè)置當(dāng)前模塊的編譯路徑為當(dāng)前文件夾路徑 include $(CLEAR_VARS)//清理編譯環(huán)境中用到的變量 ``` 為了方便模塊的編譯,Build 系統(tǒng)設(shè)置了很多的編譯環(huán)境變量。要編譯一個模塊,只要在編譯之前根據(jù)需要設(shè)置這些變量然后執(zhí)行編譯即可。常見的如: - LOCAL_SRC_FILES:當(dāng)前模塊包含的所有源代碼文件。 - LOCAL_MODULE:當(dāng)前模塊的名稱,這個名稱應(yīng)當(dāng)是唯一的,模塊間的依賴關(guān)系就是通過這個名稱來引用的。 - LOCAL_C_INCLUDES:C 或 C++ 語言需要的頭文件的路徑。 - LOCAL_STATIC_LIBRARIES:當(dāng)前模塊在靜態(tài)鏈接時需要的庫的名稱。 - LOCAL_SHARED_LIBRARIES:當(dāng)前模塊在運(yùn)行時依賴的動態(tài)庫的名稱。 - LOCAL_CFLAGS:提供給 C/C++ 編譯器的額外編譯參數(shù)。 - LOCAL_JAVA_LIBRARIES:當(dāng)前模塊依賴的 Java 共享庫。 - LOCAL_STATIC_JAVA_LIBRARIES:當(dāng)前模塊依賴的 Java 靜態(tài)庫。 - LOCAL_PACKAGE_NAME:當(dāng)前 APK 應(yīng)用的名稱。 - LOCAL_CERTIFICATE:簽署當(dāng)前應(yīng)用的證書名稱。 - LOCAL_MODULE_TAGS:當(dāng)前模塊所包含的標(biāo)簽,一個模塊可以包含多個標(biāo)簽。標(biāo)簽的值可能是 debug, eng,user,development 或者 optional。其中,optional是默認(rèn)標(biāo)簽。標(biāo)簽是提供給編譯類型使用的,不同的編譯類型會安裝包含不同標(biāo)簽的模塊。 編譯類型說明:

名稱說明
eng默認(rèn)類型,該編譯類型適用于開發(fā)階段。 當(dāng)選擇這種類型時,編譯結(jié)果將: 安裝包含 eng, debug, user,development 標(biāo)簽的模塊 安裝所有沒有標(biāo)簽的非 APK 模塊 安裝所有產(chǎn)品定義文件中指定的 APK 模塊
user該編譯類型適合用于最終發(fā)布階段。 當(dāng)選擇這種類型時,編譯結(jié)果將: 安裝所有帶有 user 標(biāo)簽的模塊 安裝所有沒有標(biāo)簽的非 APK 模塊 安裝所有產(chǎn)品定義文件中指定的 APK 模塊,APK 模塊的標(biāo)簽將被忽略
userdebug該編譯類型適合用于 debug 階段。 該類型和 user 一樣,除了: 會安裝包含 debug 標(biāo)簽的模塊 編譯出的系統(tǒng)具有 root 訪問權(quán)限

根據(jù)上表各種類型模塊的編譯方式,要執(zhí)行編譯,只需要引入表 3 中對應(yīng)的 Make 文件即可。例如,要編譯一個 APK 文件,只需要在 Android.mk 文件中,加入“include $(BUILD_PACKAGE)。

除此以外,Build 系統(tǒng)中還定義了一些便捷的函數(shù)以便在 Android.mk 中使用,包括:

  • $(call my-dir):獲取當(dāng)前文件夾路徑。

  • $(call all-java-files-under, ):獲取指定目錄下的所有 Java 文件。

  • $(call all-c-files-under, ):獲取指定目錄下的所有 C 語言文件。

  • $(call all-Iaidl-files-under, ) :獲取指定目錄下的所有 AIDL 文件。

  • $(call all-makefiles-under, ):獲取指定目錄下的所有 Make 文件。

  • $(call intermediates-dir-for, , , , ):獲取 Build 輸出的目標(biāo)文件夾路徑。

如:編譯一個 APK 文件

 LOCAL_PATH := $(call my-dir)

編譯一個 Java 的靜態(tài)庫:

LOCAL_PATH := $(call my-dir)

附:Android編譯系統(tǒng)詳解

(正文已結(jié)束)

推薦閱讀:遼源都市網(wǎng)

免責(zé)聲明及提醒:此文內(nèi)容為本網(wǎng)所轉(zhuǎn)載企業(yè)宣傳資訊,該相關(guān)信息僅為宣傳及傳遞更多信息之目的,不代表本網(wǎng)站觀點(diǎn),文章真實(shí)性請瀏覽者慎重核實(shí)!任何投資加盟均有風(fēng)險(xiǎn),提醒廣大民眾投資需謹(jǐn)慎!

網(wǎng)站簡介 - 聯(lián)系我們 - 營銷服務(wù) - XML地圖 - 版權(quán)聲明 - 網(wǎng)站地圖TXT
Copyright.2002-2019 寧夏資訊網(wǎng) 版權(quán)所有 本網(wǎng)拒絕一切非法行為 歡迎監(jiān)督舉報(bào) 如有錯誤信息 歡迎糾正