From 07140d33a76f66cdc9a9f5c4d757b0afa52d6eef Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 21 Jul 2018 01:59:28 +0800 Subject: [PATCH] Bring back installing to second slot after OTA on A/B devices --- .../magisk/asyncs/InstallMagisk.java | 36 ++++++++++++++---- .../com/topjohnwu/magisk/utils/ShowUI.java | 5 +++ app/src/full/res/raw/bootctl | Bin 0 -> 19832 bytes app/src/full/res/raw/utils.sh | 19 +++++++-- 4 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 app/src/full/res/raw/bootctl diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java index 988d37632..82f7d877a 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java @@ -17,7 +17,9 @@ import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; +import com.topjohnwu.superuser.io.SuFile; import com.topjohnwu.superuser.io.SuFileInputStream; +import com.topjohnwu.superuser.io.SuFileOutputStream; import com.topjohnwu.utils.SignBoot; import org.kamranzafar.jtar.TarInputStream; @@ -214,6 +216,20 @@ public class InstallMagisk extends ParallelTask { } } + private void postOTA() { + SuFile bootctl = new SuFile(Const.MAGISK_PATH + "/.core/bootctl"); + try (InputStream in = mm.getResources().openRawResource(R.raw.bootctl); + OutputStream out = new SuFileOutputStream(bootctl)) { + ShellUtils.pump(in, out); + Shell.Sync.su("post_ota " + bootctl.getParent()); + console.add("***************************************"); + console.add(" Next reboot will boot to second slot!"); + console.add("***************************************"); + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override protected Boolean doInBackground(Void... voids) { if (mode == FIX_ENV_MODE) { @@ -240,13 +256,16 @@ public class InstallMagisk extends ParallelTask { mBoot = ShellUtils.fastCmd("find_boot_image", "echo \"$BOOTIMAGE\""); break; case SECOND_SLOT_MODE: + String slot = ShellUtils.fastCmd("echo $SLOT"); + String target = (TextUtils.equals(slot, "_a") ? "_b" : "_a"); + console.add("- Target slot: " + target); console.add("- Detecting target image"); - char slot[] = ShellUtils.fastCmd("echo $SLOT").toCharArray(); - if (slot[1] == 'a') slot[1] = 'b'; - else slot[1] = 'a'; - mBoot = ShellUtils.fastCmd("SLOT=" + String.valueOf(slot), - "find_boot_image", "echo \"$BOOTIMAGE\""); - Shell.Async.su("mount_partitions"); + mBoot = ShellUtils.fastCmd( + "SLOT=" + target, + "find_boot_image", + "SLOT=" + slot, + "echo \"$BOOTIMAGE\"" + ); break; case FIX_ENV_MODE: mBoot = ""; @@ -257,7 +276,8 @@ public class InstallMagisk extends ParallelTask { return false; } - console.add("- Target image: " + mBoot); + if (mode == DIRECT_MODE || mode == SECOND_SLOT_MODE) + console.add("- Target image: " + mBoot); List abis = Arrays.asList(Build.SUPPORTED_ABIS); String arch; @@ -284,6 +304,8 @@ public class InstallMagisk extends ParallelTask { if (patched == null) return false; outputBoot(patched); + if (mode == SECOND_SLOT_MODE) + postOTA(); console.add("- All done!"); } } catch (Exception e) { diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java b/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java index 3add96f34..66f95ed76 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java @@ -26,6 +26,7 @@ import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.receivers.ManagerUpdate; import com.topjohnwu.magisk.receivers.RebootReceiver; import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.ShellUtils; import java.util.ArrayList; import java.util.List; @@ -134,6 +135,10 @@ public class ShowUI { if (Shell.rootAccess()) { options.add(mm.getString(R.string.direct_install)); } + String s = ShellUtils.fastCmd("grep_prop ro.build.ab_update"); + if (s != null && Boolean.parseBoolean(s)) { + options.add(mm.getString(R.string.install_second_slot)); + } new AlertDialog.Builder(activity) .setTitle(R.string.select_method) .setItems( diff --git a/app/src/full/res/raw/bootctl b/app/src/full/res/raw/bootctl new file mode 100644 index 0000000000000000000000000000000000000000..74f359ada0d11565009e2993883f9c7fdfceb5cb GIT binary patch literal 19832 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 EUw<{ZSO5S3 literal 0 HcmV?d00001 diff --git a/app/src/full/res/raw/utils.sh b/app/src/full/res/raw/utils.sh index e88ab9b03..ecdfa9ac6 100644 --- a/app/src/full/res/raw/utils.sh +++ b/app/src/full/res/raw/utils.sh @@ -73,11 +73,11 @@ mm_patch_dtbo() { } restore_imgs() { - SHA1=`cat /.backup/.sha1` - [ -z $SHA1 ] && SHA1=`grep_prop #STOCKSHA1` + local SHA1=`cat /.backup/.sha1` + [ -z $SHA1 ] && local SHA1=`grep_prop #STOCKSHA1` [ -z $SHA1 ] && return 1 - STOCKBOOT=/data/stock_boot_${SHA1}.img.gz - STOCKDTBO=/data/stock_dtbo.img.gz + local STOCKBOOT=/data/stock_boot_${SHA1}.img.gz + local STOCKDTBO=/data/stock_dtbo.img.gz [ -f $STOCKBOOT ] || return 1 find_boot_image @@ -93,3 +93,14 @@ restore_imgs() { fi return 1 } + +post_ota() { + cd $1 + chmod 755 bootctl + ./bootctl hal-info || return + [ `./bootctl get-current-slot` -eq 0 ] && SLOT_NUM=1 || SLOT_NUM=0 + ./bootctl set-active-boot-slot $SLOT_NUM + echo '${0%/*}/../bootctl mark-boot-successful;rm -f ${0%/*}/../bootctl $0' > post-fs-data.d/post_ota.sh + chmod 755 post-fs-data.d/post_ota.sh + cd / +}