韌館-LearnHouse

[轉]Android.mk常用常數

一樣為了預防好文章之後失連,因此在這備份一下,同時可以參考之前紀錄的-Android.mk的用法和基礎

資料來源:https://blog.csdn.net/syk12138/article/details/120730227

LOCAL_PATH := $(call my-dir) 此變數表示原始碼所在目錄,寫法固定

include $(CLEAR_VARS) 清除 除LOCAL_PATH變數外其它快取變數

LOCAL_MODULE 此變數表示模組名稱

LOCAL_SRC_FILES 此變數包含建構系統生成模組時所用的原始檔列表

LOCAL_MODULE_SUFFIX 此變數表示後綴名

LOCAL_PREBUILT_JNI_LIBS 只適用編譯第三方app,且app依賴了so庫 *

LOCAL_MULTILIB 此變數表示編譯32位還是64位架構

LOCAL_MANIFEST_PACKAGE_NAME 本地清單包名

LOCAL_REQUIRED_MODULES 指定模組運行所依賴的模組

LOCAL_SDK_VERSION 指定編譯sdk版本

include $(BUILD_PREBUILT) 該指令編譯目標apk

include ( c a l l a l l − m a k e f i l e s − u n d e r , (call all-makefiles-under,(callallmakefilesunder,(LOCAL_PATH))搜尋編譯該原始碼目錄下所有mk檔案

LOCAL_PACKAGE_NAME 此常數表示App應用名稱

LOCAL_OVERRIDES_PACKAGES 此常數可以使其它模組不加入編譯

LOCAL_PRIVATE_PLATFORM_APIS 設定後,會使用sdk的hide的api來編譯,不可以跟LOCAL_SDK_VERSION常數一起,會導致不能訪問hide的api而報錯

LOCAL_USE_AAPT2 此常數為是否使用aapt2

LOCAL_RESOURCE_DIR 此常數表示Res的路徑

LOCAL_STATIC_ANDROID_LIBRARIES 指定依賴的android類庫

LOCAL_JAVA_LIBRARIES 指定依賴的共享java類庫,只是在編譯的時候引用

LOCAL_STATIC_JAVA_LIBRARIES 指定依賴的靜態java類庫,最終會打包到Apk裡

LOCAL_PROGUARD_FLAG_FILES 指定混淆組態

LOCAL_JNI_SHARED_LIBRARIES 編譯jni

LOCAL_DEX_PREOPT 此變數設定為false 可以 使整個系統使用提前最佳化的時候,某個app不使用提前最佳化

LOCAL_REPLACE_PREBUILT_APK_INSTALLED apk路徑

LOCAL_CERTIFICATE 此常數為設定簽名
簽名的方式:
testkey 普通apk,默認情況下使用,默認為使用apk自己的簽名
platform 使用平台簽名
shared 使用共享簽名,該apk需要和home/contacts進行共享資料
media 使用媒體簽名,該apk是media/download系統中的一環

LOCAL_MODULE_PATH 指定最後安裝位置,默認等於TARGET_OUT_$(LOCAL_MODULE_CLASS),
可以手動指定,如:
$$(TARGET_OUT)/preload-app 存放位置為 system/preload-app
其中含有幾個固定路徑寫法
TARGET_ROOT_OUT 表示根檔案系統
TARGET_OUT 表示system檔案系統
TARGET_OUT_DATA 表示data檔案系統

LOCAL_MODULE_CLASS 此變數表示 指定模組的類型
一般可以不用定義,如果不定義則 不存放到系統中,會放到obj目錄下對應目錄中
如果 include $()裡的值為BUILD_PREBUILT 則必須定義MODULE_CLASS
其中常用的幾種參數及含義與 默認下的LOCAL_MODULE_PATH 配合後存放的位置
ETC ,存放於system/etc
EXECUTABLES 編譯可執行檔案,存放於system/bin
SHARED_LIBRARIES 定義動態庫檔案,放於system/lib
JAVA_LIBRARIES 編譯jar包,
APPS 編譯apk檔案,存放於system/app

LOCAL_MODULE_TAGS 此變數表示模組編譯模式,一般默認為optional
包含模式有:
optional 該模組所有編譯版本下都編譯
user 該模組只在user編譯版本下才編譯
eng 該模組只在eng編譯版本下才編譯
tests 該模組只在tests編譯版本下才編譯
項目remake時如果監測到非該編譯版本下的編譯模式,會報錯停止

LOCAL_PROPRIETARY_MODULE 控制生成路徑到system/vendor/lib,否則就是system/lib

LOCAL_PRIVILEGED_MODULE 此常數決定了其編譯後在的安裝位置
設定為true,安裝位置為system/priv-app,不設定或設定為false,安裝位置為system/app
跟LOCAL_MODULE_PATH一起使用的時候,如果設定true,則LOCAL_PRIVILEGED_MODULE 優先順序高,如果設定為false 則LOCAL_MODULE_PATH優先順序高

引用第三方java類庫

使用方法:
項目下建立libs目錄,放入需要匯入的jar包
在Android.mk中新增
include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := aaa:libs/xxxx.jar

include $(BUILD_MULTI_PREBUILT)

LOCAL_STATIC_JAVA_LIBRARIES := aaaa

BUILD_MULTI_PREBUILT 指令的作用是將靜態java類庫壓縮到.dex檔案中

問題一
error: X (java:sdk) should not link to Y (java:platform)
解決辦法:
LOCAL_SDK_VERSION 替換成 LOCAL_PRIVATE_PLATFORM_APIS := true

問題二
程式碼裡java檔案找不到jar包裡的類
解決辦法:暫無

android 原始碼中新增第三方APK Android.mk內容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestDemo
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)

android 原始碼中以原始碼形式新增第三方app Android.mk內容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := TestDemo
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_MODULE_TAGS := optional
LOCAL_USE_AAPT2 := true
LOCAL_STATIC_ANDROID_LIBRARIES :=  \
	androidx.appcompat_appcompat \
	com.google.android.material_material \
	androidx-constraintlayout_constraintlayout 
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

編譯條件語句
ifeq 當條件成立後執行
例:
ifeq($(strip $(TEST)),yes)
xxxx
endif
當TEST 為 yes後才執行xxx程式碼

ifneq 當條件不成立後執行
例:
ifeq($(strip $(TEST)),yes)
xxxx
endif
當TEST 為 no後才執行xxx程式碼

2024年6 月 posted by admin in 程式&軟體 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: