問題描述:我需要在/data/misc/display/下面添加一個test.xml文件,那我們該如何處理呢?
解決步驟:
mkdir -p LINUX/android/vendor/test/
cd test
添加一個Android.mk ,這個Android.mk主要實現了將當前路徑下的test.xml複製到android/out/target/product/msmXXXX/data/misc/display/
PREBUILT_PATH := $(call my-dir)
LOCAL_PATH := $(PREBUILT_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := test.xml //這個文件叫什麼
LOCAL_MODULE_OWNER := ts
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := DATA //如果咱們要在/data目錄下添加文件,那麼這裏就寫DATA
LOCAL_SRC_FILES := ./test.xml//這個文件所在路徑,注意這個路徑一定要對,如果這個Android.mk和test.xml在同一個目錄下,則爲./test.xml。
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/data/misc/display
include $(BUILD_PREBUILT)
然後我們到android目錄,執行
source build/envsetup.sh
lunch msmXXXX-64-debug
make -j4
或者,直接去咱們的Android.mk所在目錄執行mm。
引申知識1:
注:如果這個test目錄是在TEST_ONE目錄下,如:
|--TEST_ONE
|--test
|--test1
那麼,我們需要在TEST_ONE這一級添加對應的Android.mk。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
include $(call all-makefiles-under,$(LOCAL_PATH))
在Android的源代碼中的mk文件中,我們經常會看到上面這句話,從字面意思看是,include目錄下所有的mk文件,下面這個博客說明了兩點的注意需要注意的:
1.只include Android.mk文件,叫其他名字的mk文件,不include.
2.只include這個$(LOCAL_PATH)一級目錄下的Android.mk文件,而不是所有子目錄以及子目錄下的Android.mk文件
http://blog.chinaunix.net/uid-686647-id-4065641.html
引申知識2:
我們可以借鑑如下方式來完成在Android.mk中創建相關目錄。
HAVE_SYSTEM_LIB_DIR := $(shell test -d $(TARGET_OUT)/lib && echo yes)
HAVE_SYSTEM_LIB64_DIR := $(shell test -d $(TARGET_OUT)/lib64 && echo yes)
ifneq ($(HAVE_SYSTEM_LIB_DIR), yes)
$(shell mkdir -p $(TARGET_OUT)/lib)
endif
ifneq ($(HAVE_SYSTEM_LIB64_DIR), yes)
$(shell mkdir -p $(TARGET_OUT)/lib64)
endif
但是引申知識2在應用的時候需要注意SELinux的問題。
如遇到:avd:denied相關的error log則爲此類問題,如:
I auditd: type=1400 audit(0.0:9): avc: denied { read } for comm="mm-pp-daemon" name="lcd-backlight" dev="sysfs" ino=13165 scontext=u:r:mm-pp-daemon:s0 tcontext=u:object_r:sysfs_class_leds:s0 tclass=lnk_filepermissive=0
W mm-pp-daemon: type=1400 audit(0.0:9): avc: denied { read } for name="lcd-backlight" dev="sysfs" ino=13165 scontext=u:r:mm-pp-daemon:s0 tcontext=u:object_r:sysfs_class_leds:s0 tclass=lnk_filepermissive=0
V KERNEL : [ 9.041147 C3 logd.auditd, 514 ] type=1400 audit(1043232.919:9): avc: denied { read } for pid=509 comm="mm-pp-daemon" name="lcd-backlight" dev="sysfs" ino=13165 scontext=u:r:mm-pp-daemon:s0 tcontext=u:object_r:sysfs_class_leds:s0 tclass=lnk_filepermissive=0
則去下面的文件中查看,sysfs_class_leds節點有沒有定義,device/qcom/sepolicy/common/file_contexts
external/sepolicy/file_contexts
解決方案:
在/common/system_server.te中,對sysfs_class_leds節點添加下面的權限:
+ allow mm-pp-daemon sysfs_class_leds:lnk_file(write read);
+ allow mm-pp-daemon sysfs_class_leds:file(write open);
+ allow mm-pp-daemon sysfs_class_leds:dirsearch;
引申知識3(轉載):
Android 編譯過程中預拷貝文件或文件夾
拷貝文件
PRODUCT_COPY_FILES += device/qcom/msm8909/media/media_profiles_8909.xml:system/etc/media_profiles.xml
拷貝文件夾
PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,$(LOCAL_PATH)/xxx,system/vendor/xxx)
或者
$(shell mkdir -p ${OUT}"/system/etc/")源碼編譯的時候,先讀取該mk文件,該目錄還沒創建,所以要建一個,否則拷貝失敗。
$(shell cp -rf $(LOCAL_PATH)/usb_modeswitch.d ${OUT)}"/system/etc/"),然後通過shell拷貝任意文件。
如果出現拷貝的是apk文件,則有可能出現如下錯誤
Prebuilt apk found in PRODUCT_COPY_FILES: device/amlogic/f16ref/hello.apk:/system/app/hello.apk, use BUILD_PREBUILT instead!. Stop.
原因是build/core/Makefile中對copy file作了檢測,如果是apk文件,會出錯
此時註釋掉build/core/Makefile裏面的define check-product-copy-file函數內容即可
引申知識4:直接到device/qcom/MSMXXXX.mk中添加copy動作
PRODUCT_COPY_FILES +=vendor/test/test1/test1.xml:data/misc/display/test1.xml