预置SDcard资源

来源:互联网 发布:小众音乐软件 编辑:程序博客网 时间:2024/05/19 02:30

此方法是将需要预置到手机中的媒体文件,包括音频视频等,预置到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命令打包,放到目录device/project/copyfile/system/preinstall下

3.在init.rc下添加一个服务testserveice,代码如下:
    #注意格式,顶格写,m=1之间不能加空格    on property:persist.vold.sdcard.copy.run=1      #注意格式,前面四个空格        start huaweicopy    on property:persist.vold.sdcard.copy.run=0        stop huaweicopy    service huaweicopy /system/xbin/busybox sh /system/bin/huawei.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,代码如下:
    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];                            //主要用来实现启动脚本的代码            SLOGD("@@@@@@@@@@@@@@@@@@@@@@@@");            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 persist.vold.sdcard.copy.run 1手动设置变量;


1 0