此方法是将需要预置到手机中的媒体文件,包括音频视频等,预置到SDcard中。并实现用户可以手动删除,在恢复出厂设置的时候可以恢复。同样这一套机制也可以用来预置应用的配置文件等其他需要存放在data分区下的数据,实现原理就是恢复出厂设置只会清除data分区下的数据,在手机第一次开机或者恢复出厂设置的时候重新依靠脚本把提前预置到system分区下的文件拷贝到data区。
1.在系统device/project/copyfile/system/bin下添加.sh文件,内容如下:
#!/system/bin/sh # android里添加.sh文件必须要添加的第一行,要不系统不会识别
setprop persist.vold.sdcard.copy 0
# 需要提前预置一个busybox,android源码里不支持tar命令
/system/xbin/busybox tar -xvf /system/preinstall/text/text.tar -C /data/media/
sync
setprop persist.vold.sdcard.copy 1
2.把想要预置的东西,用在linux下用tar命令打包,通过copyfile复制到${OUT}/system/preinstall下
3.在init.rc下添加一个服务cpserver,代码如下:
# 注意格式,顶格写,m=1之间不能加空格
on property:persist.vold.sdcard.copy.run=1
# 注意格式,前面四个空格
start cpserver
on property:persist.vold.sdcard.copy.run=0
stop cpserver
service cpserver /system/xbin/busybox sh /system/bin/copy.sh # 添加/system/bin/logwrapper可以打印log
class main
user media_rw # 这里user和group都是用的media_rw,因为我们拷贝到的地方是/data/media下面
group media_rw # 开启了MTK_SHARED_SDCARD之后,内置卡其实就是data/media
disabled
oneshot
# end add by
4.在system/vold/Volume.cpp下添加代码,主要目的是在系统启动时,mountSD卡之后才执行我们的.sh,代码如下:
PS:调试时候用到的命令
adb shell下可以运行命令getprop和setprop来获取和修改properties值;
void Volume::setState(int state, bool isFat32) {
char msg[255];
int oldState = mState;
if (oldState == state) {
return;
}
if ((oldState == Volume::State_Pending) && (state != Volume::State_Idle)) {
mRetryMount = false;
}
mPreState = oldState;
mState = state;
SLOGD("Volume %s state changing %d (%s) -> %d (%s), isFat32(%d)", mLabel,
oldState, stateToStr(oldState), mState, stateToStr(mState), isFat32);
snprintf(msg, sizeof(msg),
"Volume %s %s state changed from %d (%s) to %d (%s) %d", getLabel(),
getFuseMountpoint(), oldState, stateToStr(oldState), mState,
stateToStr(mState), isFat32);
if (!strcmp(stateToStr(mState) ,"Mounted"))
{
/* code */
char internalcontent[PROPERTY_VALUE_MAX]; // 主要用来实现启动脚本的代码
memset(internalcontent, 0, PROPERTY_VALUE_MAX);
property_get("persist.vold.sdcard.copy", internalcontent,"0");
if (strcmp(internalcontent, "0")==0) {
property_set("persist.vold.sdcard.copy.run", "1");
}
}
PS:调试时候用到的命令
adb shell下可以运行命令getprop和setprop来获取和修改properties值;