在Android定制的过程中,有客户要求将一些视频、音频等文件内置在系统中。将过程记录下来,方便以后查询。
内置过程大致分为以下几个过程:
1.将需要内置的我文件,放置指定文件夹。
2.用mk文件将需要内置的文件拷贝至镜像包里面存储,以便下一步l将文件拷贝纸系统内存;将赋值文件的脚本编译到out/system/xbin下。
3.创建开机运行shell脚本文件的服务,也就是将第2步的文件拷贝至系统内存的脚本。
下面逐步来说明:
1.将需要内置的我文件,放置指定文件夹:
这个步非常简单,就是将客户需要内置的文件放置指定的文件夹下。比如路径:vendor/sprd/sprd_media,这里需要注意的是,文件名字不能有空格什么的特殊奇怪的字符,不让在编译的时候会报错的。
2.用mk文件将需要内置的文件拷贝至镜像包里面存储,以便下一步l将文件拷贝纸系统内存。
这一步主要是将我们要内置的文件拷贝至system或者是data下面,见mk文件(这个mk文件需要到我们编译的mk文件中include进去,保证我们这个mk文件在编译的时候被执行)内容:
LOCAL_PATH:= vendor/sprd/sprd_media
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/media/kr_SKARF_Dance.avi:data/preloadmedia/kr_SKARF_Dance.avi
其中有两个变量需要注意,LOCAL_PATCH和PRODUCT_COPY_FILES。LOCAL_PATCH就是当前的路径,PRODUCT_COPY_FILES是系统的一个变量,它的意思就是将目标文件复制的目标的文件夹,上面的意思就是将vender/sprd/sprd_media/media/kr_SKARF_Dance.avi文件拷贝至data/perloadmedia/下。
上面是赋值视屏文件的mk,下面贴上赋值shell脚本的mk(保证这个文件要被系统编译到):
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := preloadmedia.sh
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_SRC_FILES := preloadmedia.sh
include $(BUILD_PREBUILT)
这个mk文件的意思就是将preloadmedia.sh脚本文件编译到out/system/xbin下。基本的mk文件中的变量如果不明白的话建议去适当的百度。3.创建开机运行的shell脚本文件,也就是将第2步的文件拷贝至系统内存的脚本。
在系统的init.sc8830.rc文件下面创建自己第一次启动时运行的服务,init.sc8830.rc文件在自己对应工程的Device目录下面,在init.sc8830.rc文件中添加一个Linux服务:
service preloadmedia /system/xbin/preloadmedia.sh
disabled
user root
group media_rw
on post-fs-data
start preloadmedia
oneshot
这样就创建了一个开机启动的Linux服务,它的用途就是在开机的时候运行system/xbin/文件夹下面的preloadmedia.sh脚本,preloadmedia.sh脚本内容:
#!/system/bin/sh
PRELOAD_DEST=/mnt/shell/emulated/0/preloadmedia
PRELOAD_FLAG=${PRELOAD_DEST}/.preloadmedia
PRELOAD_SOURCE=/data/preloadmedia
if [ ! -d ${PRELOAD_DEST} ]
then
mkdir -p ${PRELOAD_DEST}
fi
if [ ! -f ${PRELOAD_FLAG} ]
then
files=$(ls ${PRELOAD_SOURCE}/)
for i in ${files};do
cat ${PRELOAD_SOURCE}/${i} > ${PRELOAD_DEST}/${i}
done
echo "preloadmedia is done !!" > ${PRELOAD_FLAG}
fi
仔细阅读这个shell脚本文件,其实很简单,就是将/data/preloadmedia下面的文件遍历到内存中的/mnt/shell/emulated/0/preloadmedia下面,其中有一个标记:PRELOAD_FLAG,为了避免重复执行赋值的动作,如果PRELOAD_FLAG不存在就执行赋值动作。上面就是最基本内置文件的过程,有什么地方写的不当或者有什么不是明白的可以留言,大家一起相互学习、进步。