趕在 2017 年的最後幾天 ASUS 釋出 ZenFone 4 ZE554KL 的 Android O 升級 (14.1064.1711.96 -> 15.0405.1711.76) 想當然升級後的第一件事情就是刷入 Magisk,沒想到卻碰到了大釘子,手機不斷重新開機。

經過一番 trace code 與對照其他手機 Android 8.0 的 boot.img 內容後,發現是 SELinux 的問題,幸好有簡單的解法..

簡單來說呢,Magisk 在 init 執行之前會對 SELinux 與 filesystem 做一些手腳,以 SELinux 來說 Magisk 會

SELinux 在 Android 8.0 的使用與路徑跟 Android 7.0 有所不同,有興趣的可以去.. 啃一下文件,這邊就不多提了,那到底 ZE554KL 做了怎樣的神妙設定使得 Magisk 刷入後無法正常運行呢?從 patch_sepolicy() 那邊的邏輯來看..

  1. 系統根目錄 (boot.img) 沒有 sepolicy 這個檔案,因此改尋找 /vendor/etc/selinux 下的 precompiled_sepolicy 與 /system/etc/selinux 下的 plat_sepolicy.cil。
  2. 但 ZE554KL 為 Android 7.0 升級上來的裝置,沒有獨立 /vendor 分區,設定上也沒有 ab slot,在 /system 尚未掛載的前提下 ( init 之前) 無法存取到那兩個檔案。
  3. 最後因為 init 被修補的緣故沒載入預設 sepolicy ,新的 sepolicy 也因組態的問題沒讀取到任何資料而無法正確產生。在沒有任何 sepolicy rule 載入的情況下,init 便 駕.. 崩.. 了。

所以最簡單的解法就是把 /system/vendor/etc/selinux/precompiled_sepolicy 抓出來改名為 sepolicy 放在 ramdisk 的根目錄,重新打包一份 boot.img 讓 Magisk 進行 patch 即可。

BTW 針對 Android 8.0 的升級另外再快速打包一份 twrp,所以升級之後的 root 方式就是:

  1. fastboot flash boot 15.0405.1711.76_modified_boot.img
  2. fastboot boot twrp-3.2.1-Z01K-20171229.img
  3. adb sideload Magisk-v15.1.zip

不確定目前這樣的設定是否與 “ro.treble.enabled” 為 “true” 有關.. 還是不要做太多期待 :P
Happy Hacking ! :-)

Comments

comments powered by Disqus