原理:在android系统的recovery模式下,系统将进入data分区的格式化,而不是mount data分区后进入文件的删除,所以我们需要将系统进入recovery模式下格式化data分区修改成mount data分区,然后进入文件以及目录的删除。而MTK平台正常情况下MTK_SHARED_SDCARD = yes 这种模式下,系统编译后运行时FAT和data分区时合并在一起共享的,所以FAT的物理空间在data分区的范围内。在格式化data分区时会一并将FAT分区给格式化掉。所以需要进行mount后目录的删除。
方法如下:
1、项目全局配置:
device\autochips\ac8257_demo\ProjectConfig.mk
AUTO_ADD_GLOBAL_DEFINE_BY_NAME = xxx xxxx ATC_RECOVERY_NOERASE_DATA
ATC_RECOVERY_NOERASE_DATA = yes
2、selinux的修改
主要是在recovery系统进入重启的时候修改在recovery模式将selinux关闭,否则在recovery模式下mount data分区时将会失败。导致后面进入data分区删除不了文件目录。
2.1) 第一种修改方法
修改:vendor\mediatek\proprietary\bootable\bootloader\lk\target\ac8257_demo\rules.mk文件:
ifeq ($(ATC_RECOVERY_NOERASE_DATA),yes)
DEFINES += ATC_RECOVERY_NOERASE_DATA
endif
vendor\mediatek\proprietary\bootable\bootloader\lk\project\ac8257_demo.mk 文件中添加
ATC_RECOVERY_NOERASE_DATA = yes
修改vendor\mediatek\proprietary\bootable\bootloader\lk\app\mt_boot\mt_boot.c文件,如下:
int boot_linux_from_storage(void)
{
int ret = 0;
uint32_t kernel_target_addr = 0;
uint32_t ramdisk_target_addr = 0;
uint32_t tags_target_addr = 0;
uint32_t ramdisk_addr = 0;
uint32_t ramdisk_real_sz = 0;
........................................
#ifdef SELINUX_STATUS
#if SELINUX_STATUS == 1
cmdline_append("androidboot.selinux=disabled");
#elif SELINUX_STATUS == 2
cmdline_append("androidboot.selinux=permissive");
#endif
#endif
+#if defined(ATC_AOSP_ENHANCEMENT) && defined(ATC_RECOVERY_NOERASE_DATA)
+ if(RECOVERY_BOOT == g_boot_mode) {
+ cmdline_append("androidboot.selinux=permissive");
+}
.................................
}
2.2 修改/system/core/init.cpp中selinux的权限
方法如下:
bootable/recovery/recovery.cpp
--- a/bootable/recovery/recovery.cpp
+++ b/bootable/recovery/recovery.cpp
@@ -1085,7 +1085,7 @@ int
main(int argc, char **argv) {
time_t start = time(NULL);
- redirect_stdio(TEMPORARY_LOG_FILE);
+ redirect_stdio(LOG_TO_USART<

本文介绍如何在MTK平台的Android设备上,在Recovery模式中改变默认的数据分区格式化行为,实现仅删除data分区内的文件而不格式化整个分区,并保留FAT分区的方法。
最低0.47元/天 解锁文章
2026

被折叠的 条评论
为什么被折叠?



