當前位置:首頁 » 安卓系統 » makefileandroid

makefileandroid

發布時間: 2023-08-20 00:20:35

A. 請教linux makefile轉換為android.mk的 步驟

項目中需要將linux的應用程序放在android下面編譯
以前的編譯用makefile,而android用android.mk
需要 linux makefile轉換為android.mk ,
將生成 可執行文件、靜態庫、動態庫 的規則對應到android.mk
還有對應makefile引入的文件順序。

B. 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系統:

C. android mk文件怎麼打開

.mk後綴名文件類型:Makefile擴展名為.mk的文件是一個開發文件。Makefile規則如下所示目標:依賴文件列表命令列表1、目標通常是要產生的文件名稱,目標可以是可執行文件或obj文件,也可是一個動作的名稱.2、依賴文件是用來輸入從而產生目標的文件

D. Android Makefile中是 如何識別 TARGET_PRODUCT 的

TARGET_PRODUCT 來決定編譯定製proct.

首先, 編譯Android 代碼 通常情況下使用:

# make showcommands

這實際上等價於下面的完整命令 (具體參見 build/core/envsetup.mk )

# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands

可見,默認情況下編譯系統認為TARGET_PRODUCT 是generic 的

那如何編譯特定產品的Android呢?

這就需要查看Android Makefile是如何解析環境變數TARGET_PRODUCT的。

Android Makefile 的引用關系是這樣的

Makefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/proct_config.mk

在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 /
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
))

include $(board_config_mk)

而這個配置文件BoardConfig.mk 決定了目標系統編譯屬性,比如使用ALSA還是不是 GENERIC_AUDIO 等等

另外在這里TARGET_DEVICE 宏也決定了TARGET_DEVICE_DIR, 因為TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路徑。

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

當然Android 的Ob目標輸出也是由TARGET_DEVICE決定,見build/core/envsetup.mk

TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))

TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/proct

PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)

再回到 build/core/main.mk, 編譯系統接著做的一個件事情是,遍歷所有字目錄,找到所有Android.mk文件,並將這些Android.mk文件include 進來

#
# Typical build; include any Android.mk files we can find.
#

subdir_makefiles := /
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)

include $(subdir_makefiles)

我們再來看其中的

./build/target/board/Android.mk

,對了它引用了

include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由上面TARGET_DEVICE_DIR的定義,這下又進入了

vendor 下TARGET_DEVICE指向的目錄了,這個mk文件中定義了特定Proct需要編譯和安裝app 和 script.

E. android makefile 將有空格的字元串賦給變數編譯報錯

想要了解一個系統,我常從makefile或是building system下手,以了解系統組成元素為何?目錄結構為何?對於Android,我也不例外。透過了解building system,我們能知道如何新增、修改、刪除程序,並保持其完整性,順利編譯出結果。
設置文件
Android building system 包括幾種重要的設置文件,
·
Android.mk
·
AndroidProcts.mk
·
target_-.mk, host_-.mk and -.mk
o
BoardConfig.mk
o
buildspec.mk
Android.mk 是 mole 和 package 的設置文件,每個 mole/package 的目錄下都會有一個 Android.mk。所謂的 mole 是指系統的 native code ,相對於用 Java 寫成的 Android application 稱為 package。
AndroidProcts.mk 則設定 proct 配置。 proct 即特定系統版本,透過編譯不同 proct ,產生不同軟體配置內容,安裝不同的 application。 Proct 可視為特定項目,產生特定規格系統。
BoardConfig.mk 是為 proct 主板做設定,像是 driver 選擇、設定。*-.mk 則是針對選擇的操作系統和 CPU 架構,進行相關設定。
buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的 proct 、平台、額外的mole/package 等。
參數
build/envsetup.sh 實作一個 mm 指令,以編譯單一 mole,不需編譯整個 source tree。ONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用方法是在執行 make 時,將該變數指定為 mole 的 Android.mk。
o
make ONE_SHOT_MAKEFILE=
透過定義 CREATE_MODULE_INFO_FILE , building system 會將所有 mole 信息列在 $(PRODUCT_OUT)/mole-info.txt 檔案里。
o
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 。
o
debug
o
release
這些參數,也可設於 buildspec.mk 里,以避免開發過程不斷的重新指定。
Goals
一般編輯整個 Android 系統,就是使用 droid 這個 goal。 droid 會產生一個完整的系統,包括 bootloader、kernel、系統程序、模塊和應用程序。
showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。透過 showcommands 這個 goal, building system顯示過程中每一個步驟的詳細指令。
Makefile 的流程
o
初始化相關變數
o
偵測編譯環境和目標環境
o
決定目標 proct
o
讀取 proct 的設定
o
讀取 proct 所指定之目標平台架構設定
§
選擇 toolchain
§
指定編譯參數 (*-.mk)
o
清除輸出目錄
o
設定/檢查版本編號
o
讀取所有 BoardConfig.mk 檔案
o
讀取所有 mole 的設定
o
根據設定,產生必需的 rule
o
產生 image
以上的主要流程都是由 build/core/main.mk 所安排。
初始化和偵測
由 build/core/config.mk 所進行。 build/core/envsetup.mk 檢查 developer 的設定 (buildspec.mk) ,並檢查執行環境,以決定輸出目錄、項目。
build/core/config.mk 本身還依據參數,決定解譯時的相關參數。像是 compiler 的路徑、flags, lex 、yacc 的路徑參數等。
關於 proct 的相關設定,則是由 build/core/proct_config.mk 所處理,使用 build/core/proct.mk 提供之 macro 載入。根據AndroidProct.mk 的內容, proct_config.mk 決定了
o
PRODUCT_TAGS
o
OTA_PUBLIC_KEYS
o
PRODUCT_POLICY
o
......
Proct 設定的讀取
Android proct 的設定來自於 build/target/proct/AndroidProct.mk 和 vendor 子目錄下的 AndroidProct.mk 。 building system透過 find 指令,找出所有可能的 AndroidProct.mk。 AndroidProct.mk 里定義 PRODUCT_MAKEFILES 變數,列舉所有實際定義 proct 的 makefile。這些 makefile 各自定義獨立的 proct 。proct 相關參數,存成 PRODUCTS. .形式的變數。並將makefile 路徑存在 PRODUCTS 變數。因此,透過 PRODUCTS 能取得所有的 proct 路徑/名稱,並透過 PRODUCTS. .形式的變數取得內容。
Mole 設定的讀取
Mole 是指 native code 的軟體組件,而 Java application 則被稱為 package。 build/core/definitions.mk 定義 mole/package 相關macro ,讀取、檢查 mole/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. .mk>.形式。例如, Android.mk 定義了 LOCAL_MODULE_SUFFIX,變會存成 ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路徑,當樣會存於 ALL_MODULES 變數里

F. 如何使用自己的makefile編譯android ndk項目

android ndk提供了一套自己的makefile管理方式,要將源碼項目移植到android平台,需要按照android的makefile規則編寫makefile,還要按android的規則部署源碼目錄,對一個有自己的makefile管理方法的大型項目來說,只是做一下makefile遷移工作就是一件很麻煩的事。
其實android ndk上的編譯說到底也就是交叉編譯,只要配置好交叉編譯工具鏈,使用原有的makefile也是可以編譯出在android運行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本為例:
編譯器路徑 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名稱前綴 arm-eabi-
頭文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
庫文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以試一下上面的配置,如果編譯鏈接都沒有問題,可以adb push到android設備上運行看看,什麼結果?
有點崩潰,根本運行不起來,你也許想試試看android自帶的ndk例子,確實是能夠運行的,問題在哪兒呢?
只是正確配置了編譯器、頭文件、庫文件還不夠,還需要配置編譯、鏈接的參數,android例子中編譯鏈接的參數是什麼呢?你也許想深究一下android的makefile,可是不久你會發現那是更崩潰的事情,裡面用了很多的make腳本函數。其實android的makefile是可以把執行的詳細命令輸出來的,只要make的時候加上V=1即可。可以看到確實帶了很多參數
編譯參數:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
鏈接參數:

-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
這其中鏈接參數中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最關鍵的,android使用了自己的進程載入器,並且自定義了c運行時的啟動結束。難怪先前編譯的進程啟動不了。

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:235
java駝峰 發布:2025-02-02 09:13:26 瀏覽:651
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726