diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Config.kt b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt
index 015562660..089c02688 100644
--- a/app/src/main/java/com/topjohnwu/magisk/core/Config.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt
@@ -109,9 +109,10 @@ object Config : PreferenceModel, DBConfig {
else
Value.DEFAULT_CHANNEL
- @JvmStatic var keepVerity = false
- @JvmStatic var keepEnc = false
- @JvmStatic var recovery = false
+ @JvmField var keepVerity = false
+ @JvmField var keepEnc = false
+ @JvmField var patchVbmeta = false
+ @JvmField var recovery = false
var bootId by preference(Key.BOOT_ID, "")
var askedHome by preference(Key.ASKED_HOME, false)
diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt
index 2fca909ab..376cf387e 100644
--- a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt
@@ -34,6 +34,7 @@ object Info {
@JvmField val isZygiskEnabled = System.getenv("ZYGISK_ENABLED") == "1"
@JvmStatic val isFDE get() = crypto == "block"
@JvmField var ramdisk = false
+ @JvmField var vbmeta = false
@JvmField var hasGMS = true
@JvmField val isPixel = Build.BRAND == "google"
@JvmField val isEmulator =
diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
index 5f683fbf3..5478d0f17 100644
--- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
@@ -357,6 +357,7 @@ abstract class MagiskInstallImpl protected constructor(
"cd $installDir",
"KEEPFORCEENCRYPT=${Config.keepEnc} " +
"KEEPVERITY=${Config.keepVerity} " +
+ "PATCHVBMETAFLAG=${Config.patchVbmeta} " +
"RECOVERYMODE=${Config.recovery} " +
"sh boot_patch.sh $srcBoot")
diff --git a/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt
index 5ef0f9d11..c138d8ded 100644
--- a/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt
@@ -75,6 +75,7 @@ class ShellInit : Shell.Initializer() {
Const.MAGISKTMP = getVar("MAGISKTMP")
Info.isSAR = getBool("SYSTEM_ROOT")
Info.ramdisk = getBool("RAMDISKEXIST")
+ Info.vbmeta = getBool("VBMETAEXIST")
Info.isAB = getBool("ISAB")
Info.crypto = getVar("CRYPTOTYPE")
@@ -82,6 +83,7 @@ class ShellInit : Shell.Initializer() {
Config.recovery = getBool("RECOVERYMODE")
Config.keepVerity = getBool("KEEPVERITY")
Config.keepEnc = getBool("KEEPFORCEENCRYPT")
+ Config.patchVbmeta = getBool("PATCHVBMETAFLAG")
return true
}
diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
index 59eab5e70..3db8ca7f0 100644
--- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
@@ -1,6 +1,7 @@
package com.topjohnwu.magisk.ui.install
import android.net.Uri
+import android.os.Build
import androidx.databinding.Bindable
import androidx.lifecycle.viewModelScope
import com.topjohnwu.magisk.BR
@@ -26,11 +27,11 @@ class InstallViewModel(
) : BaseViewModel() {
val isRooted = Shell.rootAccess()
- val skipOptions = Info.isEmulator || (Info.ramdisk && !Info.isFDE && Info.isSAR)
+ val skipOptions = Info.ramdisk && !Info.isFDE && Info.isSAR && !(!Info.vbmeta && Build.VERSION.SDK_INT >= 30)
val noSecondSlot = !isRooted || Info.isPixel || Info.isVirtualAB || !Info.isAB || Info.isEmulator
@get:Bindable
- var step = if (skipOptions) 1 else 0
+ var step = if (Info.isEmulator || skipOptions) 1 else 0
set(value) = set(value, field, { field = it }, BR.step)
var _method = -1
diff --git a/app/src/main/res/layout/fragment_install_md2.xml b/app/src/main/res/layout/fragment_install_md2.xml
index f1eb7848f..fefd90d83 100644
--- a/app/src/main/res/layout/fragment_install_md2.xml
+++ b/app/src/main/res/layout/fragment_install_md2.xml
@@ -9,6 +9,8 @@
+
+
@@ -34,7 +36,7 @@
+
+
Preserve force encryption
Preserve AVB 2.0/dm-verity
+ Patch vbmeta in boot image
Recovery Mode
Options
Method
diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh
index baa18c336..c72d42a4b 100644
--- a/scripts/util_functions.sh
+++ b/scripts/util_functions.sh
@@ -403,7 +403,14 @@ get_flags() {
KEEPFORCEENCRYPT=false
fi
fi
- [ -z $PATCHVBMETAFLAG ] && PATCHVBMETAFLAG=false
+ if [ -z $PATCHVBMETAFLAG ]; then
+ if [ -e /dev/block/by-name/vbmeta_a ] || [ -e /dev/block/by-name/vbmeta ]; then
+ PATCHVBMETAFLAG=false
+ else
+ PATCHVBMETAFLAG=true
+ ui_print "- Not found vbmeta partition, patch vbmetaflag"
+ fi
+ fi
[ -z $RECOVERYMODE ] && RECOVERYMODE=false
}