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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值