Android 13 添加自定义分区,恢复出厂设置不被清除

本文介绍了如何在Android 13的MTK设备上新增testdata分区,以满足在恢复出厂设置后仍保留特定数据的需求。详细步骤包括分区创建、目录配置、权限设置和SeLinux权限调整,并通过实验验证了分区的读写功能及在不同操作(恢复出厂设置、固件升级、OTA更新)后的数据持久性。

需求: 客户有些文件或数据,需要做得恢复出厂设置还存在,故需新增一个分区存储客户数据。

要求:
a) 分区大小为50M
b) 应用层可读可写
c) 恢复出厂设置后不会被清除
d) 不需要打包.img
e) 不影响OTA升级

缺点:
1).通过代码在分区创建目录和文件,会涉及到SeLinux权限的修改 【影响GMS验证】
2).在现有软件版本上,需要格式化下载

环境: MTK Android 13 支持AB分区升级

**

新增分区修改如下:

**

1.新增testdata分区

路径:vendor/mediatek/proprietary/tools/ptgen/MT8188/partition_table_emmc_ab.csv


 vendor_b,EXT4,524288,,EMMC_USER,UFS_LU2,main,N,N,NONE,Y,N,Y,,Y,,AUTO,,
 system_b,EXT4,3145728,,EMMC_USER,UFS_LU2,main,N,Y,system_other.img,Y,N,Y,,Y,,AUTO,,
 super,Raw data,3670016,,EMMC_USER,UFS_LU2,,N,Y,super.img,Y,N,Y,,Y,,AUTO,,"ne(DYNAMIC_PARTITION_SUPPORT,yes) or eq(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS,yes)"
+testdata,EXT4,51200,,EMMC_USER,UFS_LU2,,N,N,NONE,N,N,N,,N,,AUTO,,
 userdata,EXT4,3145728,,EMMC_USER,UFS_LU2,,N,Y,userdata.img,N,N,Y,,Y,,NEEDRE
<think>好的,我现在需要回答用户的问题:如何在Android设备恢复出厂设置时保留persist.sys相关的数据。首先,我得理解persist分区的特性。在Android系统中,persist分区通常用于存储持久性数据,这些数据在恢复出厂设置时默认会被清除过,用户可能遇到特殊情况,需要确保某些数据确实保留。 接下来,我需要考虑系统恢复出厂设置的流程。恢复出厂设置一般会清除/data和/cache分区,但会影响/persist。过,如果用户发现persist数据被删除了,可能有其他因素,比如自定义恢复脚本或特定厂商的实现。 然后,我应该检查系统源码中与恢复出厂设置相关的部分。例如,在Settings应用中,恢复出厂设置的代码可能调用MasterClearReceiver或RecoverySystem类。需要确认这些流程是否包含对persist分区的操作。例如,查看RecoverySystem.java中的clearWipeData()方法是否调用了格式化persist分区的命令。 另外,用户提到的removeDataDirsLI函数可能属于PackageManagerService,用于删除应用数据。但persist数据通常在这里处理,所以这可能相关。过,需要确认是否有其他服务或脚本在恢复过程中操作persist分区。 接下来,可能的解决方案包括修改系统源码或使用自定义恢复工具。修改源码的话,需要找到触发恢复出厂设置的代码位置,并移除任何涉及persist分区的操作。例如,在RecoverySystem中,确保wipe命令包含persist。或者,在init.rc脚本中,检查是否有恢复时格式化persist的指令。 如果用户没有源码权限,可以考虑通过adb在恢复前备份persist数据,恢复后再还原。这需要root权限,并且可能涉及dd命令或备份工具。此外,检查是否有系统属性控制persist分区的处理,例如在build.prop中添加配置。 还需要考虑同厂商的定制情况。例如,某些厂商可能在恢复过程中加入额外的清理步骤,因此需要具体分析设备的实现。用户提到的全志芯片设备可能有同的分区策略,需参考具体文档。 最后,需要提醒用户操作风险,修改系统分区可能导致设备变砖,建议谨慎操作并备份数据。同时,测试任何修改前应充分了解设备的具体情况。</think>在Android设备上恢复出厂设置时保留$persist.sys$相关数据,需根据系统分区特性及恢复机制进行调整。以下为具体实现路径: ### 一、persist分区特性分析 1. **持久性存储特性**:$persist$分区专为存储跨重启保留的数据设计,默认恢复出厂设置清除分区[^2] 2. **系统级保护机制**:原生Android恢复流程仅清除$data$和$cache$分区,但部分厂商定制ROM可能包含特殊处理逻辑 ### 二、关键技术实现方案 #### 方案一:修改恢复出厂设置源码 1. 定位恢复出厂设置入口类: ```java frameworks/base/services/core/java/com/android/server/MasterClearReceiver.java frameworks/base/core/java/android/os/RecoverySystem.java ``` 2. 拦截分区擦除指令: ```java // 修改RecoverySystem类的clearWipeData()方法 public static void clearWipeData(boolean shutdown) { String cmd = "wipe_data\n--preserve_persist\n"; // 新增保留persist参数 bootCommand(context, cmd); } ``` #### 方案二:调整文件系统挂载配置 在$fstab$文件中标记persist分区不可擦除: ```bash # device/<manufacturer>/<codename>/fstab.<hardware> /dev/block/bootdevice/by-name/persist /persist ext4 noatime,nosuid,nodev,barrier=1,noauto_da_alloc,nomerge wait,check,formattable=never # 关键参数 ``` #### 方案三:Hook系统服务 通过Xposed模块拦截数据清除操作: ```java XposedHelpers.findAndHookMethod("android.os.RecoverySystem", lpparam.classLoader, "clearWipeData", boolean.class, new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) { String originalCmd = (String) XposedHelpers.getObjectField(param.thisObject, "mCommand"); param.thisObject.setObjectField("mCommand", originalCmd.replace("wipe_persist", "")); } }); ``` ### 三、厂商定制系统应对策略 针对引用[2]提到的全志芯片设备,需特别注意: 1. 检查$vendor/partition/cleanup.sh$擦除脚本 2. 修改厂商自定义恢复组件: ```bash # 典型厂商擦除脚本片段 for part in system data cache; do make_ext4fs /dev/block/${part} # 移除persist分区处理 done ``` ### 四、验证与调试 1. 使用adb监控恢复过程: ```bash adb shell dmesg | grep -E 'wipe|persist' ``` 2. 验证persist数据保留: ```bash adb shell "ls -l /persist/sys && getprop persist.sys.*" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最乱纷飞的code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值