最近开发来了一个小需求:在发布的软件包里面预装一些多媒体资源文件。想起来,挺容易的,不就是把多媒体文件拷贝到系统里面去吗?是的,确实是这样,可是得在不同开发平台做法不大一样,目前全志软件打包升级工具还没有很完善,只是在卡启动的做卡程序里可以在烧卡的时候预装一些媒体资源文件。
在文件管理器访问的路径是/mnt/sdcard这个挂载点是管理了nand用户数据区域的,可以通过USB连到电脑拷贝、删除文件。但是这是一个挂载点,并且是在系统执行preinstall服务时才执行挂载。那我们怎么把媒体文件拷贝到这个数据区呢?
笔者想到的一个比较保守的方法,就是把媒体资源文件先压缩打包好,编译的时候拷贝到/system/media下面去,这样在编译的时候就会打包到system.img里面去,在烧写玩程序后重新开机后执行preinstall的时候再把媒体资源压缩包拷贝到数据区解压,这样就完成了资源文件预装。但是这里面有几个小问题需要注意,/mnt/sdcard挂载点要再执行完:/system/bin/sh /system/bin/pm preinstall /sdcard/preinstall才能使用。全志发布的状态:
#!/system/bin/busybox sh BUSYBOX="/system/bin/busybox" if [ ! -e /data/system.notfirstrun ]; then echo "do preinstall job" /system/bin/sh /system/bin/pm preinstall /system/preinstall /system/bin/sh /system/bin/pm preinstall /sdcard/preinstall # copy android modify tool files mkdir /mnt/nanda mount -t vfat /dev/block/nanda /mnt/nanda $BUSYBOX cp /mnt/nanda/vendor/system/build.prop /system/ $BUSYBOX cp /mnt/nanda/vendor/system/media/bootanimation.zip /system/media/ $BUSYBOX cp /mnt/nanda/vendor/system/usr/keylayout/*.kl /system/usr/keylayout/ sync umount /mnt/nanda rmdir /mnt/nanda $BUSYBOX touch /data/system.notfirstrun mkdir /databk mount -t ext4 /dev/block/nandi /databk rm /databk/data_backup.tar umount /databk rmdir /databk echo "preinstall ok" elif [ -e /system/data.need.backup ];then echo "data backup:tar /databk/data_backup.tar /data" mkdir /databk mount -t ext4 /dev/block/nandi /databk rm /databk/data_backup.tar $BUSYBOX tar -cf /databk/data_backup.tar /data rm /system/data.need.backup umount /databk rmdir /databk else echo "do nothing" fi
如果把拷贝媒体资源文件放到这两句之后,肯定能够拷贝成功,但是/system/preinstall执行的时间取决于预装的apk多少,多装几个游戏、应用apk,一般耗时比较多,多数在50秒以上。也就是说在进入桌面后50秒之内可能从文件管理器上看还没法看到预装的媒体资源文件,这样这种体验就不是很好。一旦进入桌面,用户就可以打开资源管理器进入预装的资源管理目录,播放预装的媒体文件。因此就需要做一些小调整,如下:
if [ ! -e /data/system.notfirstrun ]; then echo "do preinstall job" <span style="BACKGROUND-COLOR: #6666cc; COLOR: #000099">/system/bin/sh /system/bin/pm preinstall /sdcard/preinstall </span> <span style="COLOR: #ff0000">if [ -f /system/media/mediaresource.tar ]; then $BUSYBOX echo "######## Copy media resouce to sdcard ##########" $BUSYBOX cp /system/media/mediaresource.tar /mnt/sdcard cd /mnt/sdcard $BUSYBOX tar -xvf /mnt/sdcard/mediaresource.tar ; sync cd / if [ -d /sdcard/mediaresource ]; then rm /system/media/mediaresource.tar; rm /mnt/sdcard/mediaresource.tar; $BUSYBOX touch /data/system.mediapreinstallok fi fi </span> <span style="COLOR: #ffff33"><span style="BACKGROUND-COLOR: #3366ff">/system/bin/sh /system/bin/pm preinstall /system/preinstall </span> </span> # copy android modify tool files mkdir /mnt/nanda mount -t vfat /dev/block/nanda /mnt/nanda $BUSYBOX cp /mnt/nanda/vendor/system/build.prop /system/ $BUSYBOX cp /mnt/nanda/vendor/system/media/bootanimation.zip /system/media/ $BUSYBOX cp /mnt/nanda/vendor/system/usr/keylayout/*.kl /system/usr/keylayout/ sync umount /mnt/nanda rmdir /mnt/nanda $BUSYBOX touch /data/system.notfirstrun mkdir /databk mount -t ext4 /dev/block/nandi /databk rm /databk/data_backup.tar umount /databk rmdir /databk echo "preinstall ok" elif [ -e /system/data.need.backup ];then echo "data backup:tar /databk/data_backup.tar /data" mkdir /databk mount -t ext4 /dev/block/nandi /databk rm /databk/data_backup.tar $BUSYBOX tar -cf /databk/data_backup.tar /data rm /system/data.need.backup umount /databk rmdir /databk else echo "do nothing" fi
先判断媒体资源文件包的存在性,如果存在就拷贝再解压,如果解压成功就删除system里面的资源文件包,释放空间出来,这样就完成了整个预装。
这个问题本身没什么难度,本文实现方法经过验证可行,温馨提示资源文件包不要太大,控制在30M之内比较好。