[ZTE Axon 7 Guides, News, & Discussion] haoyangw:
The Problem

TLDR: In Oreo ROMs, i.e. Android 8.0/8.1, DualBoot Patcher no longer works, as patched ROMs/kernels will get stuck on Android logo screen(for the Axon 7, it's the 'ZTE, POWERED BY android' screen), and never boot up.

In Oreo(Android 8.0/8.1), Google introduced a new function to fstab, which is early mounting specific partitions. The purpose was so that Android can boot up faster, by ensuring that essential partitions like /system and /vendor are mounted first and the boot process will not be held back by delays in non-essential things like setting up apps. More details can be found here.

So the important changes that affect DualBoot Patcher are:

1) There's an important file 'fstab.qcom', which lists all the partitions that Android can use, that got shifted from the '/' directory(the root partition/ramdisk, Android 7.x and below) to the '/system/vendor/etc' directory(in Android 8.x) 2) In addition, another file 'init.qcom.rc', once found in the '/' directory too(in Android 7.x and below), is now shifted to '/system/vendor/etc/init/hw' directory(in Android 8.x) 3) Because of 1), 'init.qcom.rc' now believes that 'fstab.qcom' is in '/system/vendor/etc' and not '/', and so it asks Android to read 'fstab.qcom' from '/system/vendor/etc' 4) In the 'fstab.qcom' file, there are entries for all partitions except /system(and /vendor for Treble devices). For these 2 partitions, they are now found in the dtb(short for Device Tree Binary).

How does this affect DualBoot Patcher?

1) DualBoot Patcher expects that 'fstab.qcom' is still in '/' directory(correct me if I'm wrong), so it fails to find this file in Android 8.x ROMs/kernels 2) DualBoot Patcher expects that '/system' is still defined in 'fstab.qcom', which is not the case.

Below are the exact changes that Google made(in the case of our Axon 7), note the red parts(the changes):

fstab.qcom(the strike means those lines are now removed/gone)

/dev/block/bootdevice/by-name/recovery /recovery emmc defaults defaults
[STRIKE][COLOR="red"]/dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1,discard wait[/COLOR][/STRIKE]

init.qcom.rc

on fs
wait /dev/block/platform/soc/${ro.boot.bootdevice}
symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice

mount_all [COLOR="Red"]/vendor/etc/fstab.qcom[/COLOR]

dtb(converted into dts with dtc)

fstab {
compatible = "android,fstab";

vendor {
compatible = "android,vendor";
dev = "/dev/block/platform/soc/7464900.sdhci/by-name/vendor";
type = "ext4";
mnt_flags = "ro,barrier=1,discard";
fsmgr_flags = "wait";
status = "disabled";
};

[COLOR="red"]system {
compatible = "android,system";
dev = "/dev/block/platform/soc/624000.ufshc/by-name/system";
type = "ext4";
mnt_flags = "ro,barrier=1,discard";
fsmgr_flags = "wait";
status = "ok";
};[/COLOR]
};

The Solution

There are 3 changes to make for each ROM/kernel: 1) Edit fstab.qcom, dtb and init.qcom.rc 2) Add fstab.qcom and init.qcom.rc back into the ramdisk(i.e. edit the ramdisk) 3) Delete '/system/vendor/etc/fstab.qcom' and '/system/vendor/etc/init/hw/init.qcom.rc'. There are 2 ways you can do this, either manually, or with my script(Work in progress, my sincere apologies)

Method 1: Manually modify ROM and kernel

Files you will need:

Note: the 'files.zip' attached below contains 'dtc', 'magiskboot', 'mkbootimg', 'unpackbootimg'. Extract it to get these files. Feel free to scan them for viruses, I assure you they are clean and not viruses for sure

- boot.img you want to patch

- init.qcom.rc, fstab.qcom from the ROM you are patching

- magiskboot binary(found in /data/magisk or /data/adb/magisk if you installed magisk, otherwise download the one attached below)

- dtc binary(download the one attached below)

If you are patching Hellsgate or Schwifty, you also need:

- unpackbootimg, mkbootimg(attached below)

- Image.gz-dtb(from the flashable zip of the kernel)

Note: You also need a boot.img, but this will be from the ROM you are flashing/have flashed(extract from the ROM zip)

Preliminary step: Prepare the files

- Before you start, I would recommend copying all the files into a directory where you can chmod/execute binaries. I personally recommend '/data/local/tmp', or '/cache'(anywhere in /cache is fine). The guide below assumes that all these files are in the same directory. Also, chmod all the binaries, for example, do this in your working directory:

chmod 0755 *

- Also, I would recommend backing up 'fstab.qcom' and 'init.qcom.rc'

Additional Step: If you wish to patch kernels like Hellsgate and Schwifty

- First, unpack your ROM's stock kernel:

./unpackbootimg -i boot.img

- Then, repack the kernel as a Hellsgate/Schwifty kernel:

./mkbootimg --kernel Image.gz-dtb --ramdisk boot.img-ramdisk.gz --cmdline "androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x237 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 cma=32M@0-0xffffffff androidboot.selinux=permissive buildvariant=userdebug" --base 80000000 --pagesize 4096 --kernel_offset 00008000 --ramdisk_offset 01000000 --second_offset 00f00000 --tags_offset 00000100 --os_version 8.1.0 --os_patch_level [COLOR="red"]2018-06[/COLOR] --hash sha1 --output ./boot-new.img

- Note: For the red part in the above command, adjust for the month that your desired kernel is released. E.g. If your desired kernel was released in 2018 June, you put '2018-06', while if it was released in 2018 July, you put '2018-07', and so on.

- From now on, take note that everytime I mention 'boot.img', for you, it will be 'boot-new.img'(I'll bold each one that you have to change to 'boot-new.img')

Step 1: Unpack the boot.img

./magiskboot --unpack [COLOR="red"]boot.img[/COLOR]

- Now you get 3 additional files: 1) kernel(not editing this) 2) ramdisk.cpio(gonna edit this) 3) dtb(also editing this)

Step 2: Decompile the dtb

Note: dtb is a BINARY so don't open it with a text editor

./dtc -I dtb -O dts -o dt.txt dtb

- Another note: It will probably give you a lot of warnings, but it's harmless so just ignore them(I've edited multiple kernels and tested them myself, no bugs so far)

Step 3: Edit the decompiled dts

- Open the created 'dt.txt' with a root text editor(I use Simple Explorer, you can use FX file explorer, or ES file explorer)

- Search for this word:

/system

. You should find this line:

dev = "/dev/block/platform/soc/624000.ufshc/by-name/system";

- Remove the entire chunk quoted below:

system {
compatible = "android,system";
dev = "/dev/block/platform/soc/624000.ufshc/by-name/system";
type = "ext4";
mnt_flags = "ro,barrier=1,discard";
fsmgr_flags = "wait";
status = "ok";
};

- Take note that you will have to remove 1 '};'(at the bottom of the above quote), nothing more, nothing less

Step 4: Recompile the dtb

./dtc -I dts -O dtb -o dtb1 dt.txt

- Again, it might give you a lot of warnings but just ignore them

- Also, rename the new dtb so that magiskboot will compile this new dtb into your modified kernel:

mv dtb dtb.bak

mv dtb1 dtb

Step 5: Edit fstab.qcom

- Open 'fstab.qcom' file with a root text editor

- Add the following red line, below the line about '/recovery', above the line about '/data':

/dev/block/bootdevice/by-name/recovery /recovery emmc defaults defaults
[COLOR="red"]/dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1,discard wait[/COLOR]

/dev/block/bootdevice/by-name/userdata /data f2fs nosuid,nodev,noatime,nodiratime,data_flush wait,check,encryptable=/dev/block/bootdevice/by-name/cryptkey,quota,formattable[/CODE]

- Save the 'fstab.qcom' file

Step 6: Edit init.qcom.rc

- Open 'init.qcom.rc' with a root text editor

- Look for this line:

mount_all /vendor/etc/fstab.qcom

- Change it into this line:

mount_all [COLOR="red"]/fstab.qcom[/COLOR]

- Save the 'init.qcom.rc' file

Step 7: Modify kernel ramdisk

-First do:

./magiskboot --cpio ramdisk.cpio 'add 0640 fstab.qcom fstab.qcom'

- Then do:

./magiskboot --cpio ramdisk.cpio 'add 0750 init.qcom.rc init.qcom.rc'

Step 8: Create a new, DBP-compatible boot.img

./magiskboot --repack [COLOR="red"]boot.img[/COLOR]

- You will get a new boot.img, named 'new-boot.img'

Step 9: Install the modified kernel

- First, flash the boot.img(using TWRP or Flashify or another tool)

- Then, delete these 2 files:

/system/vendor/etc/fstab.qcom

and

/system/vendor/etc/init/hw/init.qcom.rc

- Note: Make sure you do not reboot after installing boot.img and before deleting the above 2 files

That's it! If you completed all the steps above properly, you should have a working DBP-compatible boot.img that you can put in a flashable zip and patch with DualBoot Patcher

if you don't know how to make a flashable zip to install your modified boot.img, you can use the one I attached below(named 'flashable-kernel-template.zip'). What you have to do is download it, then extract it and make a new zip containing your modified boot.img(basically, create a new zip with the 'META-INF' folder from my zip and your 'boot.img'. The zip automatically deletes

/system/vendor/etc/fstab.qcom

and

/system/vendor/etc/init/hw/init.qcom.rc

so you won't need to do this yourself :)

Note: If you are using my flashable zip, note that you have to rename your modified '

new-

boot.img' to 'boot.img' before you compress it into a new flashable zip. Otherwise you will get an error when flashing in recovery

Note 2: Avoid using the flashable zip template for non-modified kernels, it can render your ROM unable to boot!

Method 2: Work in Progress

Method 2: Use my automated script

Please do leave feedback on whether this guide is clear, and also if any of the steps are not working for you! Happy Dualbooting :)

Sources:

Github Problem Discussion

Problem Solution