2019-10-21
關鍵字:編譯時自動拷貝文件
Android 系統開發中,編譯大包是常有的事。
做系統集成開發的同學也經常能遇到需要預置一些文件進系統中,這時就需要在編譯過程中使用不同於編譯的命令來預置了。
不過總得來說,編大包時拷貝的實現也很簡單,至少編譯系統已經幫我們完成絕大部分的工作了,我們僅僅需要將文件在編譯時拷貝至指定目錄下即可。
而這一拷貝操作,僅僅需要幾行 Android.mk 代碼即可實現:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OUT=$(TARGET_OUT)/bin $(shell mkdir -p $(OUT) ) define find_files $(shell find $(1) -name "*.sh" -exec basename {} \; ) endef LIST=$(call find_files, $(LOCAL_PATH) ) define copy_files $(foreach t,$(1), \ $(shell cp $(LOCAL_PATH)/$(t) $(OUT)/$(t) ) \ ) endef $(call copy_files, $(LIST))
以上編譯指令是將該 Android.mk 文件所在目錄下的所有 .sh 文件以及該目錄下一級子目錄中的 .sh 文件拷貝至 Android 系統 /system/bin 目錄下的代碼。可以根據該 mk 內容按需定制自己的需求。
另外,在某些情況下可能會出現某些程序在編譯大包時不會自動打包到系統鏡像中的情況,此時可以在該程序的 Android.mk 中添加以下一行指令:
ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE) #對應於 C 程序。
ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_PACKAGE_NAME) #對應於 APK 程序。