Eliminate unnecessarily copy on magiskinit

This patch reuses the abused /data tmpfs for magisktmp
This commit is contained in:
LoveSy
2022-12-14 21:14:12 +08:00
committed by John Wu
parent 0d38c94c9c
commit 4ed34cd648
4 changed files with 30 additions and 76 deletions

View File

@@ -130,19 +130,6 @@ static void magic_mount(const string &sdir, const string &ddir = "") {
}
}
void SARBase::backup_files() {
if (access("/overlay.d", F_OK) == 0)
backup_folder("/overlay.d", overlays);
else if (access("/data/overlay.d", F_OK) == 0)
backup_folder("/data/overlay.d", overlays);
self = mmap_data("/proc/self/exe");
if (access("/.backup/.magisk", R_OK) == 0)
magisk_cfg = mmap_data("/.backup/.magisk");
else if (access("/data/.backup/.magisk", R_OK) == 0)
magisk_cfg = mmap_data("/data/.backup/.magisk");
}
static void patch_socket_name(const char *path) {
static char rstr[16] = { 0 };
if (rstr[0] == '\0')
@@ -181,7 +168,9 @@ static void extract_files(bool sbin) {
#define ROOTMIR MIRRDIR "/system_root"
#define NEW_INITRC "/system/etc/init/hw/init.rc"
void SARBase::patch_ro_root() {
void MagiskInit::patch_ro_root() {
mount_list.emplace_back("/data");
string tmp_dir;
if (access("/sbin", F_OK) == 0) {
@@ -205,7 +194,7 @@ void SARBase::patch_ro_root() {
if (tmp_dir == "/sbin")
recreate_sbin(ROOTMIR "/sbin", true);
xmkdir(ROOTOVL, 0);
xrename("overlay.d", ROOTOVL);
#if ENABLE_AVD_HACK
// Handle avd hack
@@ -222,9 +211,6 @@ void SARBase::patch_ro_root() {
}
#endif
// Handle overlay.d
restore_folder(ROOTOVL, overlays);
overlays.clear();
load_overlay_rc(ROOTOVL);
if (access(ROOTOVL "/sbin", F_OK) == 0) {
// Move files in overlay.d/sbin into tmp_dir
@@ -260,9 +246,7 @@ void SARBase::patch_ro_root() {
}
void RootFSInit::prepare() {
self = mmap_data("/init");
magisk_cfg = mmap_data("/.backup/.magisk");
prepare_data();
LOGD("Restoring /init\n");
rename(backup_init(), "/init");
}
@@ -270,6 +254,7 @@ void RootFSInit::prepare() {
#define PRE_TMPDIR "/magisk-tmp"
void MagiskInit::patch_rw_root() {
mount_list.emplace_back("/data");
// Create hardlink mirror of /sbin to /root
mkdir("/root", 0777);
clone_attr("/sbin", "/root");
@@ -307,9 +292,7 @@ void MagiskInit::patch_rw_root() {
chdir("/");
// Dump magiskinit as magisk
int fd = xopen("/sbin/magisk", O_WRONLY | O_CREAT, 0755);
write(fd, self.buf, self.sz);
close(fd);
cp_afc(REDIR_PATH, "/sbin/magisk");
}
int magisk_proxy_main(int argc, char *argv[]) {