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/d
问题描述:我需要在/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
更多推荐
所有评论(0)