预置SDcard资源

此方法是将需要预置到手机中的媒体文件,包括音频视频等,预置到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,代码如下:
 
    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值;
 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值