预置SDcard资源

本文介绍了一种在Android设备上预置媒体文件的方法,通过在system分区放置文件并在首次开机或恢复出厂设置时使用脚本将其复制到data分区,使用户能够手动删除这些文件,并在恢复出厂设置时再次恢复。

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

 

 

 

<think> 我们正在回答用户关于Magisk模块开发工具和资源推荐的问题。参考引用内容,我们可以提供以下推荐: 1. **Magisk-Modules-Repo-Util** [^1]:这是一个专为Magisk模块仓库维护设计的Python工具。它自动化了模块仓库的索引生成、同步和发布流程,适合模块开发者管理自己的模块仓库。 2. **Magisk All-in-One Module Template** [^2]:这是一个GitHub上的模板项目,提供了模块开发的基础结构。它预置了配置文件、脚本示例和文档,帮助开发者快速创建模块原型。 3. **官方资源**: - Magisk GitHub仓库(https://github.com/topjohnwu/Magisk):核心文档和源码,包含模块开发规范。 - Magisk开发者指南:官方文档中详细说明模块的挂载机制、脚本执行顺序等。 4. **社区资源**: - XDA Developers论坛(https://forum.xda-developers.com/):大量模块开发教程和讨论专区。 - Android开发文档:了解系统文件结构和权限管理。 5. **开发工具**: - ADB(Android Debug Bridge):用于设备调试和日志抓取。 - 文本编辑器(VS Code、Sublime Text等):编写脚本和配置文件。 - Git:版本控制和协作开发。 这些工具和资源覆盖了模块开发的全周期,从搭建到发布。开发者应优先参考官方文档以确保兼容性。 §§相关问题§§ 1. Magisk模块开发中如何管理模块依赖? 2. 如何为Magisk模块添加自动更新功能? 3. Magisk模块如何兼容不同的Android设备? </think> ### Magisk模块开发工具与资源推荐 以下推荐基于官方文档和社区最佳实践,覆盖开发全流程所需工具及学习资源,重点参考引用内容[^1][^2]: --- #### **一、核心开发工具** 1. **模块模板工具** - **Magisk All-in-One Module Template** [^2] - GitHub开源项目:https://github.com/Androidacy/Magisk-Module-Template - 功能:提供预置配置文件(`module.prop`)、标准文件夹结构(`system/`, `META-INF/`)和示例脚本(`post-fs-data.sh`),支持一键生成模块框架。 - 优势:内置模块打包脚本,简化ZIP文件生成流程: ```bash ./build.sh all # 打包完整模块 ``` 2. **仓库管理工具** - **Magisk-Modules-Repo-Util** [^1] - 项目地址:https://github.com/Magisk-Modules-Repo/magisk-module-repo-util - 功能:Python脚本工具,自动化实现: - 模块索引生成(`modules.json`) - 版本同步与更新检查 - 仓库元数据校验 - 使用示例: ```bash python3 mmrutil.py sync --update # 同步模块更新 ``` 3. **本地开发环境** - **Android SDK & ADB** - 调试脚本执行:`adb logcat | grep "Magisk"` - 实时文件推送:`adb push module.zip /sdcard/` - **终端工具** - Windows:Git Bash(支持Linux命令) - macOS/Linux:内置Terminal --- #### **二、学习资源推荐** 1. **官方文档** - **Magisk开发者文档** - 核心机制:模块挂载原理、脚本执行顺序(`post-fs-data.sh` vs `service.sh`) - 地址:https://topjohnwu.github.io/Magisk/guides.html 2. **社区平台** - **XDA Developers论坛** - 模块开发专区:https://forum.xda-developers.com/f/magisk.5903/ - 案例:热门模块源码(如Systemless Hosts、ViPER4Android) - **GitHub探索** - 搜索关键词:`magisk-module template` - 高星项目参考: - Universal SafetyNet Fix(兼容性解决方案) - MagiskHide Props Config(设备指纹修改) 3. **调试资源** - **日志分析工具** - MatLog(Android应用):实时过滤 `Magisk` 和模块名日志 - **错误代码库** - Magisk错误代码表:`/cache/magisk.log` 中的 `ERROR [code]` 解析 --- #### **三、开发流程工具链** ```mermaid graph LR A[初始化模板] --> B[修改模块功能] B --> C[本地测试] C --> D[打包发布] D --> E[仓库管理] A --工具--> Magisk_All_in_One[All-in-One Template] D --工具--> build.sh[build.sh 打包脚本] E --工具--> Magisk_Modules_Repo_Util[Repo-Util] ``` --- #### **四、最佳实践建议** 1. **版本控制** - 使用Git管理模块代码,结合GitHub Actions自动化构建[^1] 2. **兼容性测试** - 在 `emu64`(ARM64模拟器)和真机多Android版本测试 3. **模块维护** - 通过 `update.json` 实现静默更新(参考:Magisk文档) > 注:避免直接修改 `/system` 分区,始终使用 `$MODPATH/system` 路径替换文件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值