最近在研究recovery模式下 挂载内置存储的问题,在安卓7.1 系统,高通平台
修改点1 :
增加权限 system\sepolicy\recovery.te ,这样做的目的是让recovery模式下可以对data分区进行读取操作。
allow recovery media_rw_data_file:dir r_dir_perms;
allow recovery media_rw_data_file:file r_file_perms;
修改点3:
qcom/项目/fstab.qcom
@@ -7,7 +7,7 @@
@@ -7,7 +7,7 @@
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
/dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1,discard wait
-/dev/block/bootdevice/by-name/userdata /data ext4 nosuid,nodev,barrier=1,noauto_da_alloc,discard wait,forceencrypt=footer
+/dev/block/bootdevice/by-name/userdata /data ext4 nosuid,nodev,barrier=1,noauto_da_alloc,discard wait,encryptable=footer
/devices/soc/7864900.sdhci/mmc_host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto,noemulatedsd,encryptable=footer
/dev/block/bootdevice/by-name/config /frp emmc defaults defaults
/devices/soc/7000000.ssusb/7000000.dwc3/xhci-hcd.0.auto* /storage/usbotg vfat nosuid,nodev wait,voldmanaged=usbotg:auto
修改点4 :
目前升级失败了,继续解决。
问题解决了,重新制作了整包,加上了 -n 这个忽略时间戳的参数
最终升级成功了。从 data/media/0这目录进去
修改点2:
bootable/recovery 下面的修改内容如下
Index: device.cpp
===================================================================
--- device.cpp (revision 131)
+++ device.cpp (working copy)
@@ -20,6 +20,7 @@
"Reboot system now",
"Reboot to bootloader",
"Apply update from ADB",
+ "Apply update from internal storage",
"Apply update from SD card",
"Wipe data/factory reset",
#ifndef AB_OTA_UPDATER
@@ -36,6 +37,7 @@
Device::REBOOT,
Device::REBOOT_BOOTLOADER,
Device::APPLY_ADB_SIDELOAD,
+ Device::APPLY_INTERNAL_STORAGE,
Device::APPLY_SDCARD,
Device::WIPE_DATA,
#ifndef AB_OTA_UPDATER
Index: device.h
===================================================================
--- device.h (revision 131)
+++ device.h (working copy)
@@ -61,6 +61,7 @@
REBOOT = 1,
APPLY_SDCARD = 2,
// APPLY_CACHE was 3.
+ APPLY_INTERNAL_STORAGE = 3,
APPLY_ADB_SIDELOAD = 4,
WIPE_DATA = 5,
WIPE_CACHE = 6,
Index: recovery.cpp
===================================================================
--- recovery.cpp (revision 131)
+++ recovery.cpp (working copy)
@@ -110,6 +110,7 @@
static const char *CACHE_ROOT = "/cache";
static const char *DATA_ROOT = "/data";
static const char *SDCARD_ROOT = "/sdcard";
+static const char *INNER_ROOT = "/data/media/0";
static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log";
static const char *TEMPORARY_INSTALL_FILE = "/tmp/last_install";
static const char *LAST_KMSG_FILE = "/cache/recovery/last_kmsg";
@@ -1333,6 +1334,35 @@
return result;
}
+
+
+static int apply_from_internal(Device* device, bool* wipe_cache) {
+ modified_flash = true;
+ if (ensure_path_mounted(INNER_ROOT) != 0) {
+ ui->Print("\n-- Couldn't mount %s.\n", INNER_ROOT);
+ return INSTALL_ERROR;
+ }
+ char* path = browse_directory(INNER_ROOT, device);
+ if (path == NULL) {
+ ui->Print("\n-- No package file selected.\n");
+ return INSTALL_ERROR;
+ }
+
+ ui->Print("\n-- Install %s ...\n", path);
+ set_sdcard_update_bootloader_message();
+ // void* token = start_sdcard_fuse(path);
+
+ int status = install_package(path, wipe_cache,
+ TEMPORARY_INSTALL_FILE, false, 0/*retry_count*/);
+
+ // finish_sdcard_fuse(token);
+ ensure_path_unmounted(INNER_ROOT);
+ return status;
+}
// Return REBOOT, SHUTDOWN, or REBOOT_BOOTLOADER. Returning NO_ACTION
// means to take the default, which is to reboot or shutdown depending
// on if the --shutdown_after flag was passed to recovery.
@@ -1380,7 +1410,35 @@
if (!ui->IsTextVisible()) return Device::NO_ACTION;
break;
- case Device::APPLY_ADB_SIDELOAD:
+
+ case Device::APPLY_INTERNAL_STORAGE:
+ modified_flash = true;
+ // if (mt_prompt_and_wait_install(device, status, CACH
+
+ status = apply_from_internal(device, &should_wipe_cache);
+
+
+ if (status == INSTALL_SUCCESS) {
+ ota_completed = true;
+ }
+ if (status == INSTALL_SUCCESS && should_wipe_cache) {
+ if (!wipe_cache(false, device)) {
+ status = INSTALL_ERROR;
+ }
+ }
+
+ if (status != INSTALL_SUCCESS) {
+ ui->SetBackground(RecoveryUI::ERROR);
+ ui->Print("Installation aborted.\n");
+ copy_logs();
+ } else if (!ui->IsTextVisible()) {
+ return Device::NO_ACTION; // reboot if logs aren't visible
+ } else {
+ ui->Print("\nInstall from %s complete.\n SD card");
+ };
+ break;
+
+ case Device::APPLY_ADB_SIDELOAD:
case Device::APPLY_SDCARD:
{
bool adb = (chosen_action == Device::APPLY_ADB_SIDELOAD);
@@ -1812,7 +1870,7 @@
printf("(replacing path \"%s\" with \"%s\")\n",
update_package, modified_path);
update_package = modified_path;
}
}
if (!strncmp("/sdcard", update_package, 7)) {
//If this is a UFS device lets mount the sdcard ourselves.Depending
在android6.0系统上设置 --安全界面中有一个选项是【手机加密】
在android原生系统中该选项显示是:已加密,但在小米,华为等手机上该选项并是一定是显示:已加密,因为google把该选项的权限放给了各手机厂家,各手机厂家可以根据自己的要求是否要默认加密手机,如果手机加密了(即显示手机已加密)用户是不办法取消的,
一客户要求手机出厂后手机默认不加密,因为之前没有处理这问题,在网上找了很久也看了不少博客,但都没有解决方案,最后还是一同事知道我手上这样一个问题,他告诉我们需修改哪里,同事之中还是有不少高手的,
现记录一下方便自己以后修改,遇到同样问题的朋友也可参考一下,
device/qcom/xxxx(项目名)/fstab.qcom
上图红框部分内容如果是显示:forceencrypt则将其换成encryptable,如上图,然后再重新编译项目boot.img文件,fastboot flash boot入手机中再恢复出厂设置,设置-安全界面中【手机加密】默认已不是加密,
参考1 关闭高通平台加密 https://blog.csdn.net/nei504293736/article/details/51913749
参考2 ,5.0系统增加内置存储升级的方法 https://blog.csdn.net/m0_37321987/article/details/80347268