客户需求,要预置APK文件到data/media/0/System/APK文件下,也就是说客户要求预置资源文件到sdcard,系统第一次启动的时候,加载完谷歌向导之后,会启动客户的另外一个应用来选择是否安装预置到SD卡的应用文件,此应用可在文件浏览器中找到并且可安装卸载,恢复出厂设置之后,预置的文件APK文件保留。
如果只是预置可卸载的文件,恢复出厂设置不可恢复,很简单,只需要在Android.mk文件中加上:LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)就可以了。
不过这次需求是预置APK文件(非安装好的),在第一次启动之后加载完谷歌向导后,会启动客户另外一个已经预安装好的应用来选择是否要安装此应用,并且此应用可卸载,恢复出厂设置之后还要在SD卡中,预置文件到SD卡上比较简单,主要问题是恢复出厂设置还要在预置的APK文件还要在SD卡中。
下面直接给出解决方案:
1.预置到sdcard: 在项目的配置文件中,利用 PRODUCT_COPY_FILES 分别拷贝文件到system目录下与/data/media/0/System/APK,如下:
PRODUCT_COPY_FILES += \
tyconfig/tyOverSeaCommon/packages/apps/3rd_Oversea/archos/preset_apps/100Games_Archos_50_Neon_100_AB46.apk:data/media/System/APK/100Games_Archos_50_Neon_100_AB46.apk \
tyconfig/tyOverSeaCommon/packages/apps/3rd_Oversea/archos/preset_apps/100Games_Archos_50_Neon_100_AB46.apk:system/pre-install/100Games_Archos_50_Neon_100_AB46.apk
这样保证系统第一次启动的时候可以满足需求,之所以会要在system/pre-install/目录下拷贝一份,是为了备份一下这个文件,在恢复出厂设置的时候要把/system/pre-install目录下的文件拷贝到/data/media/文件下。
2.恢复出厂设置,文件可以恢复。
在恢复出厂设置这一块代码下手,恢复出厂设置会把/data分区跟/cache全部清除,data分区清除意味着预置的APK文件也将会被清除掉。所以,在/data,以及/cache清除完毕后,可以做一个操作,复制/system/pre-install/目录下的文件到/data/media/0/System/APK目录,这样就能够保证在恢复出厂设置之后,预置的APK文件还在sdcard中。
bootable/recovery/recovery.cpp
//拷贝方法,需要把 build/libs/host/include/host/CopyFile.h 与 /build/libs/host/CopyFile.c文件拷贝至recovery.cpp同级目录
#include "CopyFile.h"
static int
apply_pre_installed_apps() {
if (ensure_path_mounted("/data")) {
ui_print("copy_app_data: mount /data failed!");
return -1;
}
if (ensure_path_mounted("/system/")) {
ui_print("copy_app_data: mount /system failed!");
return -1;
}
//保证对应目录存在
if(mkdir("/data/media/",00777) != 0)
{
LOGE("create /media failed\n");
}
if(mkdir("/data/media/System/",00777) != 0)
{
LOGE("create /System