androidmake
第一次下載好Android源代碼工程後,我們通常是在Android源代碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統鏡像system.img了。以後如果我們修改了Android源代碼中的某個模塊或者在Android源代碼工程新增一個自己的模塊,是不是還是執行make命令呢?答案是否定的,Google為我們准備了另外的命令來支持編譯單獨的模塊,以及重新打包system.img的命令。在繼續學習Android源代碼之前,就讓我們先來看看這個命令吧。
一. 首先在Android源代碼目錄下的build目錄下,有個腳本文件envsetup.sh,執行這個腳本文件後,就可以獲得一些有用的工具: USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh 注意,這是一個source命令,執行之後,就會有一些額外的命令可以使用: - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the moles in the current directory. - mmm: Builds all of the moles in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file. 這些命令的具體用法,可以在命令的後面加-help來查看,這里我們只關注mmm命令,也就是可以用它來編譯指定目錄的所有模塊,通常這個目錄只包含一個模塊。
二. 使用mmm命令來編譯指定的模塊,例如Email應用程序: USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/ 編譯完成之後,就可以在out/target/proct/generic/system/app目錄下看到Email.apk文件了。Android系統自帶的App都放在這具目錄下。另外,Android系統的一些可執行文件,例如C編譯的可執行文件,放在out/target/proct/generic/system/bin目錄下,動態鏈接庫文件放在out/target/proct/generic/system/lib目錄下,out/target/proct/generic/system/lib/hw目錄存放的是硬體抽象層(HAL)介面文件。
三. 編譯好模塊後,還要重新打包一下system.img文件,這樣我們把system.img運行在模擬器上時,就可以看到我們的程序了。 USER-NAME@MACHINE-NAME:~/Android$ make snod
四. 參照Ubuntu上下載、編譯和安裝Android最新源代碼一文介紹的方法運行模擬器: USER-NAME@MACHINE-NAME:~/Android$ emulator 這樣一切就搞定了。
㈡ Android系統編譯命令make
在編譯Android系統時,需要先執行2條命令,來設置必要的環境變數。
接下來就可以執行make系列命令,來完成不同的需要。
make clean 用來清除編譯歷史,開始一個全新的編譯。
make -j 或 make -j8 啟動編譯過程。 -j 後面的數字代表要使用的cpu thread的數目。
在完成了全編譯後,才能執行生成OTA升級包的操作。
注意事項:
㈢ Android make 基礎
Android編譯演進過程:
build/ 目錄下
source build/envsetup.sh
輸入指令hmm 就可以查看信息
lunch 2
通過soong執行編譯構建,這里執行make命令時,main.mk文件把一些環境變數和目標都配置好後,會執行envsetup.sh中的make()進行編譯。
build/soong/soong_ui.bash --make-mode
------->
soong的編譯過程:
soong_ui.bash 調用流程:
可以看到include 了main.mk文件,從main.mk開始,將通過include命令將其所有需要的.mk文件包含進來,最終在內存中形成一個包括所有編譯腳本的集合,這個相當於一個巨大Makefile文件。Makefile文件看上去很龐大,其實主要由三種內容構成: 變數定義、函數定義和目標依賴規則,此外mk文件之間的包含也很重要。
5.工具鏈的關系
REF
https://blog.csdn.net/yiranfeng/article/details/109082489
㈣ Android Makefile中是 如何識別 TARGET_PRODUCT 的
, f Q2 W8 i$ Y# i# make showcommands嵌入式開發聯盟; h; Q4 ?. m, q _5 q# f4 N這實際上等價於下面的完整命令 (具體參見 build/core/envsetup.mk ) # TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands 可見,默認情況下編譯系統認為TARGET_PRODUCT 是generic 的arm,linux,winbond,nuvoton,w90p710,w90n745,開源,嵌入式,操作系統,嵌入式開發,嵌入式聯盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,6 p) P/ }+ a9 x" e' _/ ]8 l( H8 [, e那如何編譯特定產品的Android呢?arm,linux,winbond,nuvoton,w90p710,w90n745,開源,嵌入式,操作系統,嵌入式開發,嵌入式聯盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 n N* t# q" c9 c C% W這就需要查看Android Makefile是如何解析環境變數TARGET_PRODUCT的。 Android Makefile 的引用關系是這樣的mcuos.com1 b" z& i3 S. J5 J9 TMakefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/proct_config.mk嵌入式開發聯盟2 t1 D) I' n) x4 /+ Q# X! D在build/core/proct_config.mk 中編譯系統首先調用 build/core/proct.mk中定義的函數get-all-proct-makefiles ,來 遍歷整個vendor 的子目錄, 找到vendor下所有的 AndroidProcts.mk, 不同子目錄下的AndroidProcts.mk 中定義了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我們也可以通過 打開build/core/proct_config.mk 中的#$(mp-procts) 語句使控制台編譯的時候輸出所有proct 的信息) , 接著build/core/proct_config.mk 會調用resolve-short-proct-name 將TARGET_PRODUCT匹配的AndroidProcts.mk 中定義的 PRODUCT_DEVICE 賦值給TARGET_DEVICE。 有了這個TARGET_DEVICE, 再回到 build/core/config.mk, 會include $(TARGET_DEVCIE)/BoardConfig.mk board_config_mk := / $(strip $(wildcard /arm,linux,winbond,nuvoton,w90p710,w90n745,開源,嵌入式,操作系統,嵌入式開發,嵌入式聯盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 s6 h* H) @& B, X. [5 [' t" J& U $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk / vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /- 我們只做簡潔、實用、專業的嵌入式開發技術論壇。2 L& f% E. T& M4 S) u))我們只做簡潔、專業的嵌入式開發技術論壇。5 }- ~6 j# s8 s/ a* v- iinclude $(board_config_mk)嵌入式開發聯盟, [. Z( H) L2 B; s, c而這個配置文件BoardConfig.mk 決定了目標系統編譯屬性,比如使用ALSA還是不是 GENERIC_AUDIO 等等 另外在這里TARGET_DEVICE 宏也決定了TARGET_DEVICE_DIR, 因為TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路徑。arm,linux,winbond,nuvoton,w90p710,w90n745,開源,嵌入式,操作系統,嵌入式開發,嵌入式聯盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,' ~( W" a( p& y9 g- n) A: cTARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) 當然Android 的Ob目標輸出也是由TARGET_DEVICE決定,見build/core/envsetup.mk TARGET_OUT_ROOT_release := $(OUT_DIR)/target我們只做簡潔、專業的嵌入式開發技術論壇。 v( |. V7 ^+ T+ G& mTARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))( ?. c1 J& d) o9 M. [TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/proctmcuos.com7 N! X' G9 T7 o& j+ }# |2 S. p# xPRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)嵌入式開發聯盟 P& ]2 q" C/ x: ?再回到 build/core/main.mk, 編譯系統接著做的一個件事情是,遍歷所有字目錄,找到所有Android.mk文件,並將這些Android.mk文件include 進來## Typical build; include any Android.mk files we can find.#subdir_makefiles := /我們只做簡潔、專業的嵌入式開發技術論壇。% T9 p" L4 e. O6 ?, h" @' @$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)- 我們只做簡潔、實用、專業的嵌入式開發技術論壇。7 N. z& r* z; @! p5 n; {include $(subdir_makefiles)- 我們只做簡潔、實用、專業的嵌入式開發技術論壇。0 b% j5 a+ L2 E" r9 R3 v7 m我們再來看其中的 ./build/target/board/Android.mk ,對了它引用了
㈤ 安卓系統(android)怎樣才能成功編譯安裝『make』命令
tar.gz(bz或bz2等) 一、安裝1、打開一個SHELL,即終端2、用cd 命令進入源代碼壓縮包所在的目錄3、根據壓縮包類型解壓縮文件(*代表壓縮包名稱) tar -zxvf ****.tar.gztar -jxvf ****.tar.bz(或bz2)4、用CD命令進入解壓縮後的目錄5、輸入編譯文件命令:./configure(有的壓縮包已經 編譯過,這一步可以省去) 6、然後是命令:make 7、再是安裝文件命令:make install8、安裝完畢如果安裝了busybox命令就要這樣用: busybox+空格+命令
㈥ 如何在Android系統源碼的環境下用make來編譯
第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯:
1. 在應用程序的AndroidManifest.xml中的manifest節點中加入
android:sharedUserId="android.uid.system"這個屬性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。
㈦ Android Studio手動配置Makefile、CMake
在Ubutu上編譯出來的.so文件,怎麼添加到Android項目中去使用呢?目前:可以通過
Makefile方式和CMake方式引入預編譯靜動態庫(靜態庫.a 動態庫.so)到項目中去使用。就目前而言CMake是Goole推薦使用方式,但是加入接手一個老的NDK項目是MakeFile方式,看不懂就GePi了,所以這里我們還是介紹一下MakeFile方式將靜動態庫加入到AS中,完成NDK項目的開發。廢話不多說,直接擼步驟了:
1、在src/main目錄下創建一個ndkBuild文件夾
2、在此文件中創建一個Android.mk文件
3、在此文件中創建一個test.c的源文件
4、將編譯好的的.so庫復制到src/main目錄下
如圖所示目錄結構:
1、編輯Android.mk文件
2、編輯grade(app)文件
3、編輯test.c文件
4、使用編譯好的.so庫裡面的函數
本結果運行在Android 5.1 系統上
再次運行在Android 8.0系統上
看以清楚知道,其實我們的APK包裡面就沒有libMainTest.so庫,所以APP在8.0上會出現奔潰的現象。so...
1、在src/main目錄下創建一個cmake文件夾
include:裡麵包含需要一些頭文件
cmakeTest.c:需要編譯的源文件
2、在app目錄下創建一個文件:CmakeLists.txt
3、編輯grade(app)
4、編輯cmakeTest.c文件
4、引用編譯好的libcmakeTest.so
Android 8.0.0系統:
Android 5.1.1系統: