diff --git a/manager/app/src/main/jniLibs/arm64-v8a/libzakoboot.so b/manager/app/src/main/jniLibs/arm64-v8a/libzakoboot.so index 451ca81c..ce7478d6 100644 Binary files a/manager/app/src/main/jniLibs/arm64-v8a/libzakoboot.so and b/manager/app/src/main/jniLibs/arm64-v8a/libzakoboot.so differ diff --git a/manager/app/src/main/jniLibs/armeabi-v7a/libzakoboot.so b/manager/app/src/main/jniLibs/armeabi-v7a/libzakoboot.so new file mode 100644 index 00000000..157133c0 Binary files /dev/null and b/manager/app/src/main/jniLibs/armeabi-v7a/libzakoboot.so differ diff --git a/manager/app/src/main/jniLibs/x86_64/libzakoboot.so b/manager/app/src/main/jniLibs/x86_64/libzakoboot.so new file mode 100644 index 00000000..095ffe57 Binary files /dev/null and b/manager/app/src/main/jniLibs/x86_64/libzakoboot.so differ diff --git a/userspace/ksud/src/boot_patch.rs b/userspace/ksud/src/boot_patch.rs index b0f2caed..d8e484a3 100644 --- a/userspace/ksud/src/boot_patch.rs +++ b/userspace/ksud/src/boot_patch.rs @@ -167,6 +167,21 @@ fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { Ok(()) } +fn do_vendor_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { + let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(vendor_ramdisk_cpio) + .arg(cmd) + .status()?; + + ensure!(status.success(), "magiskboot cpio {} failed", cmd); + Ok(()) +} + fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result { let status = Command::new(magiskboot) .current_dir(workdir) @@ -234,6 +249,7 @@ pub fn restore( .status()?; ensure!(status.success(), "magiskboot unpack failed"); + let no_ramdisk = !workdir.join("ramdisk.cpio").exists(); let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU"); @@ -267,16 +283,28 @@ pub fn restore( } if new_boot.is_none() { - // remove kernelsu.ko - do_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?; - - // if init.real exists, restore it - let status = do_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok(); - if status { - do_cpio_cmd(&magiskboot, workdir, "mv init.real init")?; + if no_ramdisk { + // vendor ramdisk restore + do_vendor_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?; + // if init.real exists, restore it + let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok(); + if status { + do_vendor_cpio_cmd(&magiskboot, workdir, "mv init.real init")?; + } else { + let vendor_ramdisk = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + std::fs::remove_file(vendor_ramdisk)?; + } } else { - let ramdisk = workdir.join("ramdisk.cpio"); - std::fs::remove_file(ramdisk)?; + // remove kernelsu.koAdd commentMore actions + do_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?; + // if init.real exists, restore it + let status = do_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok(); + if status { + do_cpio_cmd(&magiskboot, workdir, "mv init.real init")?; + } else { + let ramdisk = workdir.join("ramdisk.cpio"); + std::fs::remove_file(ramdisk)?; + } } println!("- Repacking boot image"); @@ -465,17 +493,29 @@ fn do_patch( let mut need_backup = false; if !is_kernelsu_patched { - // kernelsu.ko is not exist, backup init if necessary - let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); - if status.is_ok() { - do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + if no_ramdisk { + // vendor ramdisk patching + let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_vendor_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + } else { + // kernelsu.ko is not exist, backup init if necessary + let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + need_backup = flash; } - - need_backup = flash; } - do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; - do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + if no_ramdisk { + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } else { + do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } #[cfg(target_os = "android")] if need_backup { @@ -501,7 +541,7 @@ fn do_patch( let output_dir = out.unwrap_or(std::env::current_dir()?); let now = chrono::Utc::now(); let output_image = output_dir.join(format!( - "kernelsu_patched_{}.img", + "SukiSU_patched_{}.img", now.format("%Y%m%d_%H%M%S") )); @@ -655,8 +695,13 @@ fn find_boot_image( let init_boot_exist = Path::new(&format!("/dev/block/by-name/init_boot{slot_suffix}")).exists(); + let vendor_boot_exist = + Path::new(&format!("/dev/block/by-name/vendor_boot{slot_suffix}")).exists(); + let boot_partition = if !is_replace_kernel && init_boot_exist && !skip_init { format!("/dev/block/by-name/init_boot{slot_suffix}") + } else if !is_replace_kernel && vendor_boot_exist && !skip_init { + format!("/dev/block/by-name/vendor_boot{slot_suffix}") } else { format!("/dev/block/by-name/boot{slot_suffix}") };