MTK平台android recovery模式不删除FAT分区

原理:在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); //日志打印到UART口

system/core/init/Android.mk

--- a/system/core/init/Android.mk
+++ b/system/core/init/Android.mk
@@ -11,8 +11,7 @@ else
 ifeq ($(strip $(MTK_BUILD_ROOT)),yes)
 init_options += -DALLOW_LOCAL_PROP_OVERRIDE=1 -DALLOW_DISABLE_SELINUX=1
 else
-#added by lzt for reset /data except media
-init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=1
+init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=0
 endif
 endif

system/core/init/init.cpp

--- a/system/core/init/init.cpp
+++ b/system/core/init/init.cpp
@@ -964,6 +964,12 @@ static void security_failure() {
     while (true) { pause(); }  // never reached
 }
 
+/***add by lzt for recovery mode to disable selinux***/
+static bool inline IsRecoveryMode() {
+    return access("/sbin/recovery", F_OK) == 0;
+}
+/***************************************************/
+
 static void selinux_initialize(bool in_kernel_domain) {
     Timer t;
 
@@ -973,6 +979,13 @@ static void selinux_initialize(bool in_kernel_domain) {
     cb.func_audit = audit_callback;
     selinux_set_callback(SELINUX_CB_AUDIT, cb);
 
+    /**add by lzt for recovery mode**/
+    //这里判断recovery系统重新启动时是否是recovery模式,是的话直接返回,不设置selinux模式
+    if(IsRecoveryMode())
+    {
+        return;
+    }
+    /*******************************/
+
     if (selinux_is_disabled()) {
         return;
     }

vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c

--- a/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
+++ b/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
@@ -1416,9 +1416,9 @@ int boot_linux_from_storage(void)
 #endif
 
 //add by lzt for reset /data except media
-    if(g_boot_mode == RECOVERY_BOOT){
-        cmdline_append("androidboot.selinux=disabled");
-    }else{		
+    //if(g_boot_mode == RECOVERY_BOOT){
+      //  cmdline_append("androidboot.selinux=disabled");
+  //  }else{		
 #ifdef SELINUX_STATUS
 #if SELINUX_STATUS == 1
 	cmdline_append("androidboot.selinux=disabled");
@@ -1426,7 +1426,7 @@ int boot_linux_from_storage(void)
 	cmdline_append("androidboot.selinux=permissive");
 #endif
 #endif
-}
+//}
 
 #ifdef MTK_POWER_ON_WRITE_PROTECT
 #if MTK_POWER_ON_WRITE_PROTECT == 1

vendor/mediatek/proprietary/system/core/multi_init/Android.mk

--- a/vendor/mediatek/proprietary/system/core/multi_init/Android.mk
+++ b/vendor/mediatek/proprietary/system/core/multi_init/Android.mk
@@ -16,15 +16,10 @@ else
 ifeq ($(strip $(MTK_BUILD_ROOT)),yes)
 init_options += -DALLOW_LOCAL_PROP_OVERRIDE=1 -DALLOW_DISABLE_SELINUX=1
 else
-#added by lzt for protect media from factory reset
-init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=1
+init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=0
 endif
 endif
 
-#added by lzt for protect media from factory reset
-#ifeq ($(strip $(TARGET_BUILD_VARIANT)),user)
-#LOCAL_CFLAGS += -DALLOW_DISABLE_SELINUX=1
-#endif
 
 # add mtk fstab flags support
 init_options += -DMTK_FSTAB_FLAGS

2、recovery进程的mount data分区并删除除FAT文件目录之外的data分区中的文件
bootable\recovery\recovery.cpp

static const char *TEMPORARY_INSTALL_FILE = "/tmp/last_install";
static const char *LAST_KMSG_FILE = "/cache/recovery/last_kmsg";
static const char *LAST_LOG_FILE = "/cache/recovery/last_log";
static const char *LOG_TO_USART = "dev/ttyMT0";
static const int KEEP_LOG_COUNT = 10;

+/*added by lzt for resetting /data except media*/
+static const int  MAX_PATH = 512;
+static const char *DATA_ROOT = "/data";
+/***added by lzt*/
..................................................
#ifdef ATC_AOSP_ENHANCEMENT
bool erase_volume(const char* volume)
#else
static bool erase_volume(const char* volume)
#endif
{
  bool is_cache = (strcmp(volume, CACHE_ROOT) == 0);
  +bool is_data = (strcmp(volume, DATA_ROOT) == 0);

  ui->SetBackground(RecoveryUI::ERASING);
  ui->SetProgressType(RecoveryUI::INDETERMINATE);
  ....................................................
   #if defined(ATC_AOSP_ENHANCEMENT) && defined(ATC_RECOVERY_NOERASE_DATA)
  /* Add format data/ with del files for shared sdcard */
  if (is_data) {
      if(reason && !strcmp(reason,"wipe_data_via_recovery")){
          ui->Print("this wipe data reason is %s . need format /data .\n", reason);
          }else{
              ensure_path_mounted(volume);
              DIR * dir;
              struct dirent* file;
              dir = opendir(DATA_ROOT);
              if(dir) {
                  LOGE("opendir %s success\n", DATA_ROOT);
                  char dir_path[MAX_PATH];
                  while((file = readdir(dir)) != NULL) {
                      memset(dir_path, 0, sizeof(char)*MAX_PATH);
                      if ((!strcmp(file->d_name, "..")) ||
                              (!strcmp(file->d_name, ".")) ||
                              (!strcmp(file->d_name, "lost+found")) ||
                              (!strcmp(file->d_name, "media")) ||
                              (!strcmp(file->d_name, ".layout_version")))
                      continue;
                      /* Del other files */
                      snprintf(dir_path, sizeof(dir_path),"%s/%s",DATA_ROOT, file->d_name);
                      LOGE("Del dir : %s\n", dir_path);
                      dirUnlinkHierarchy(dir_path);
                  }
                  /* imotor add: modify /data/.layout_version for installd */
                  FILE *fp = fopen_path("/data/.layout_version", "w");
                  if (fp){
                      LOGE("write /data/.layout_version 2\n");
                      fwrite("2", 1, 1, fp);
                      fclose(fp);
                  }
              } else {
                  LOGE("opendir failed: %s\n", strerror(errno));
                  return false;
              }
               LOGE("### format data true ###\n");
               closedir(dir);
               ensure_path_unmounted(volume);
               return true;
           }
        }
#endif
.....................................

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值