Android基礎問題總結-1-如何在編譯時向Android任一目錄添加文件

問題描述:我需要在/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.mktest.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函數內容即可

 

http://blog.csdn.net/mike8825/article/details/50549771引申知識4:直接到device/qcom/MSMXXXX.mk中添加copy動作
PRODUCT_COPY_FILES += vendor/test/test1/test1.xml:data/misc/display/test1.xml


引申知識4:直接到device/qcom/MSMXXXX.mk中添加copy動作

PRODUCT_COPY_FILES +=vendor/test/test1/test1.xml:data/misc/display/test1.xml


發佈了29 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章