MagiskでOneplus 11のrootを獲る!

 管理人はあまりスマホのOSにはこだわりはない方ですので、大陸版 Oneplus 11 に搭載されている ColorOS 13 はちょっと真面目に使ってみたいと思っています (OxygenOS は 3T と 7T で堪能した)。しかし、Googleのロケーション履歴が有効にできないのは個人的にどうしても許せないので、その一点のためにまずはMagiskを入れてrootを獲るのに挑戦してみます。

 なお、本項の手順は OnePlus 11 中国版 ブートローダーアンロックとMagisk導入の手順 (by @mita_98_さん) をMacbook Pro 2021 (M1Pro) でなぞっているだけです。少し補足を加えてはいますが手順はそちらが一次情報なので、本稿を読み進む前にまずそちらを参照してください!

事前準備 : 現在のColor OSのバージョンを確認する

 後述しますが、Magiskを導入するためには対象スマホに導入されているOSに対応したStock Firmware を入手し、init_boot.imgというファイルにパッチを適用する必要があります。この作業にはバージョンの一貫性が求められるため、念のため最初に確認しておきます。本稿執筆時点での最新バージョンは ColorOS 13.0.0 A.08 でした。

Stock Firmwareの入手

 前述の通り、現在動作しているOSにパッチを適用する必要があるため、パッチを適用するファイルを入手する必要があります。これは通常、メーカー純正のOSイメージである Stock Firmware から抽出を行います。

 Stock Firmwareはスマホメーカーが公開していることもありますが、していない場合は別のどこかから入手する必要があります。今回は、伝統と信頼のあるXDAのOneplus 11フォーラムで公開されている、利用中のOSに対応するStock Firmware (ColorOS 13.0.0 A.08) をダウンロードしました。ファイル名は “cf666351ea3d4df19569b9e81c63a3a0.zip” でした。

 また、Stock FirmwareはOTAと呼ばれる場合もあります。OTA = Over The Airとは、スマホのOSアップデートの時に配信されるファイルのことで、不思議な名前だと思う方がいるかもしれませんが、通信速度や信頼性の観点で巨大かつ重要なファイルの配信にはが有線接続が利用されていた時代があり、無線経由で降ってくるファイルは区別してOTAと呼称した時代の名残です。OTAにはフルパッケージと差分パッケージとがありますが、root化作業に必要なるのはフルパッケージで、XDAに載っているのも基本的にフルパッケージのみ (のはず) です

payload dumperの導入

 先ほどダウンロードしたStock Firmwareの中身を見てみると、巨大なpayload.binというファイルと、メタ情報が書かれたファイルが収められていることがわかります。

~ % unzip -l cf666351ea3d4df19569b9e81c63a3a0.zip  
Archive:  cf666351ea3d4df19569b9e81c63a3a0.zip
signed by SignApk
  Length      Date    Time    Name
---------  ---------- -----   ----
      989  01-01-2009 00:00   META-INF/com/android/metadata
      841  01-01-2009 00:00   META-INF/com/android/metadata.pb
7058916668  01-01-2009 00:00   payload.bin
      356  01-01-2009 00:00   payload_properties.txt
     1424  01-01-2009 00:00   META-INF/com/android/otacert
---------                     -------
7058920278                     5 files

 payload.binは特殊なファイル形式で、そのままでは扱うことができません。このため、payload.bin からのファイル抽出を可能にするツールである payload dumper を導入します。payload dumperはGO言語で書かれており、実行・インストール方法は何種類かありますが、管理人は以下の手順でbrew経由でインストールを行いました。

# brewのインストール
~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
(長いので省略)

# payload-dumper-goのbrew経由でのインストール
~ % brew install payload-dumper-go
==> Fetching d
==> Fetching xz
==> Downloading https://ghcr.io/v2/homebrew/core/xz/manifests/5.4.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/xz/blobs/sha256:26ede511c3cc726
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Fetching payload-dumper-go
==> Downloading https://ghcr.io/v2/homebrew/core/payload-dumper-go/manifests/1.2
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/payload-dumper-go/blobs/sha256:
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Installing dependencies for payload-dumper-go: xz
==> Installing payload-dumper-go dependency: xz
==> Pouring xz--5.4.1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/xz/5.4.1: 95 files, 1.7MB
==> Installing payload-dumper-go
==> Pouring payload-dumper-go--1.2.2.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/payload-dumper-go/1.2.2: 5 files, 6MB
==> Running `brew cleanup payload-dumper-go`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

 brew経由で導入が完了するとpayload-dumper-goにパスが通るので、抽出したpayload.binがあるディレクトリに移動し、payload.binを引数にpayload-dumper-goを起動します。

Downloads % payload-dumper-go payload.bin
payload.bin: payload.bin
Payload Version: 2
Payload Manifest Length: 273363
Payload Manifest Signature Length: 267
Found partitions:
recovery (105 MB), engineering_cdt (1.0 MB), modem (291 MB), devcfg (49 kB), odm (1.5 GB), xbl_config (192 kB), xbl_ramdump (832 kB), xbl (1.2 MB), system_ext (1.1 GB), my_product (838 MB), vbmeta_vendor (4.1 kB), featenabler (98 kB), tz (3.9 MB), system_dlkm (348 kB), vendor (1.1 GB), vbmeta_system (8.2 kB), aop_config (16 kB), qupfw (57 kB), init_boot (8.4 MB), abl (221 kB), splash (332 kB), cpucp (188 kB), system (680 MB), my_engineering (336 kB), vendor_boot (201 MB), my_manifest (430 kB), vendor_dlkm (132 MB), dtbo (25 MB), my_carrier (336 kB), bluetooth (1.1 MB), my_bigball (815 MB), my_heytap (1.2 GB), keymaster (410 kB), hyp (1.6 MB), shrm (66 kB), uefisecapp (180 kB), my_stock (2.1 GB), my_region (3.8 MB), product (6.2 MB), dsp (67 MB), vbmeta (12 kB), boot (201 MB), imagefv (74 kB), aop (278 kB), uefi (3.2 MB), oplus_sec (852 kB), oplusstanvbk (618 kB)
Number of workers: 4
engineering_cdt (1.0 MB)  [==============================================] 100 %
recovery (105 MB)         [==============================================] 100 %
devcfg (49 kB)            [==============================================] 100 %
modem (291 MB)            [==============================================] 100 %
odm (1.5 GB)              [==============================================] 100 %
xbl_config (192 kB)       [==============================================] 100 %
xbl_ramdump (832 kB)      [==============================================] 100 %
xbl (1.2 MB)              [==============================================] 100 %
system_ext (1.1 GB)       [==============================================] 100 %
my_product (838 MB)       [==============================================] 100 %
vbmeta_vendor (4.1 kB)    [==============================================] 100 %
featenabler (98 kB)       [==============================================] 100 %
tz (3.9 MB)               [==============================================] 100 %
system_dlkm (348 kB)      [==============================================] 100 %
vendor (1.1 GB)           [==============================================] 100 %
vbmeta_system (8.2 kB)    [==============================================] 100 %
aop_config (16 kB)        [==============================================] 100 %
qupfw (57 kB)             [==============================================] 100 %
init_boot (8.4 MB)        [==============================================] 100 %
abl (221 kB)              [==============================================] 100 %
splash (332 kB)           [==============================================] 100 %
cpucp (188 kB)            [==============================================] 100 %
system (680 MB)           [==============================================] 100 %
my_engineering (336 kB)   [==============================================] 100 %
vendor_boot (201 MB)      [==============================================] 100 %
my_manifest (430 kB)      [==============================================] 100 %
vendor_dlkm (132 MB)      [==============================================] 100 %
dtbo (25 MB)              [==============================================] 100 %
my_carrier (336 kB)       [==============================================] 100 %
bluetooth (1.1 MB)        [==============================================] 100 %
my_bigball (815 MB)       [==============================================] 100 %
my_heytap (1.2 GB)        [==============================================] 100 %
keymaster (410 kB)        [==============================================] 100 %
hyp (1.6 MB)              [==============================================] 100 %
shrm (66 kB)              [==============================================] 100 %
uefisecapp (180 kB)       [==============================================] 100 %
my_stock (2.1 GB)         [==============================================] 100 %
my_region (3.8 MB)        [==============================================] 100 %
product (6.2 MB)          [==============================================] 100 %
dsp (67 MB)               [==============================================] 100 %
vbmeta (12 kB)            [==============================================] 100 %
boot (201 MB)             [==============================================] 100 %
imagefv (74 kB)           [==============================================] 100 %
aop (278 kB)              [==============================================] 100 %
uefi (3.2 MB)             [==============================================] 100 %
oplus_sec (852 kB)        [==============================================] 100 %
oplusstanvbk (618 kB)     [==============================================] 100 %

 抽出されたファイルはextracted_YYYYMMDD_HHMMSSというフォルダに格納されます。目的のファイルは、この中にあるinit_boot.imgです (画面出力上は拡張子がありませんが、抽出された全ファイルの拡張子は.img)。

init_boot.imgへのパッチ

 init_boot.imgは、Android OSの起動イメージが格納された重要なファイルです。Android 12まではboot.imgというファイルが利用されていましたが、Android 13よりinit_boot.imgになりました。ColorOS 13はもちろんAndroid 13ベースのOSなので、Oneplus 11ではinit_boot.imgが参照されるということになります。

 Magiskは起動イメージを弄ることでrootを獲るので、このファイルにパッチを当てる必要があります。パッチを当てる機能はMagisk自体に内蔵されているので、一度このファイルをOneplus 11に転送して、パッチ当てを行います。Magiskは公式ページからブラウザで最新版 (本稿執筆時点では25.2) のAPKをダウンロード・インストールしてください (左の画像)。 Magiskを起動すると “インストール済み なし” となりますが、これはまだrootを獲っていないことを意味します

 続けて、Oneplus 11とMacとをケーブルで直結し、Oneplus 11の適当なパスにiniti_boot.imgをコピーします。事前にAndroid File Transferの最新版を導入してあれば、ケーブルで接続した時点でそれが起動し、Drag & Dropでファイル転送ができるはずです。管理人は/Downloadにコピーしました。

 前述の通り、Magiskがパッチする機能を持っているので、Magiskを起動して “インストール” をタップ、次の画面 (左の画像) で “パッチするファイルの選択” をタップしてinit_boot.imgを指定してから、”はじめる” をタップします。パッチが開始され、”All Done!” と表示されれば成功です。パッチされたファイルの名前とパスは画面に表示されますが、接続中のAndroid File Transferにはリアルタイムでは反映されません。Android File Transfer を再起動すると、パッチが適用されたファイルが /Download に現れているはずです。そのファイルをDrag & DropでMacにコピーしておきます。

パッチが適用されたファイルの確認

 念のためではありますが、ここでパッチが適用されたファイルをチェックしてみます。先頭で紹介した@mita_98_さんのページにパッチ済みファイルが置かれているので、ダウンロードして比較してみます。

Downloads % openssl sha1 magisk_patched-25200_PHB110_A08.img 
SHA1(magisk_patched-25200_PHB110_A08.img)= 70abac66c6e63d82b65fbe5544c01144ff878897
Downloads % openssl sha1 magisk_patched-25200_iQ3vp.img     
SHA1(magisk_patched-25200_iQ3vp.img)= 70abac66c6e63d82b65fbe5544c01144ff878897

 当然と言えば当然ですが、計算したハッシュ値は一致しました。Macでもちゃんとパッチできるということと、@mita_98_さんがアップロードしているファイルを利用するとショートカットできることがこれで証明されたことになります。

Boot Loader Unlockの事前準備

 いよいよ後戻りができない工程、Boot Loader Unlock (= BLU) に進みます…が、事前にFactory Resetをしてパスコードを解除しておくことを絶対に忘れないようにする必要があります。この工程を行わず、パスコードを設定したままBLUするとかなり大きな手戻りが発生するので、必ず事前にパスコードは解除しておきましょう (ほとんどの人が設定しているはず)。

 設定アプリの “パスワードとセキュリティ” でパスワードなどがすべて無効になっている状態 (左の画像) であることを確認してから、その他の設定 – 端末のリセットから “すべてのデータを消去” (右の画像) を実施します。もちろん全データがきれいに消えるので、必要があれば事前にバックアップを取得しておきましょう。

 ”すべてのデータを消去” をすると、箱から出した時と同じ初期セットアップが始まります。BLUの時に再度全データが消去されるので、ここの初期セットアップは可能な限りスキップで進んで問題ありません (インターネット接続も不要)。

BLUの実施

 BLUの手順自体 (開発者向けオプションの有効化 – その中のメニューでのOEMロック解除の許可 – fastbootモードでの再起動 – コマンドを投入してのBLU実施) はOneplus 3Tの手順とほぼ同一である上、@mita_98_さんのページでも仔細に解説されているため、ここでは手順は割愛しますが、一つだけ予想外のこと起きたので、それについてだけ書いておきます。

 管理人はfastbootモードで再起動した後、Macからデバイスが見えない (fastboot devicesで何も返ってこない) 状態になりました。結論から書くと、TypeC – TypeCでMacbook ProとOneplus 11とを直結していたケーブルを、TypeC – TypeA の Oneplus 純正ケーブル (とは言っても 7T 付属のもの、Macbook Pro には TypeA の口はないので、間に変換は噛ましている) に交換したら、認識するようになりました。 確認した限りでは、このケーブルは通常状態のみ通信可能で、7T 付属のケーブルは fastboot モードのみ通信可能という、よくわからない状態でした…

パッチしたイメージの書き込み

 BLUを実施すると、全データがWipeされて再度初期セットアップが開始します。以降ではデータ削除はないので、Wifi等の各種設定を投入しつつ “真面目に” セットアップしてもいいでしょう。初期設定が完了した後、管理人はMagiskを導入しておきました (後でも構いません)。

 USBデバッグを有効にしてから、再度fastbootモードで起動します。起動後、以下のコマンドでパッチしたイメージをinit_bootパーティションに書き込みます。パッチしたイメージはpaltform-toolと同じ場所に置いてあるという前提です。ここを間違えると超高級な文鎮が爆誕するので、念には念を入れて慎重に作業を実施してください。イメージを書き込んだら、OSを再起動します。

# 念の為fastbootからデバイスが見えるかを確認しておく
platform-tools % ./fastboot devices                                       
4ab7280a	fastboot

# パッチを適用したイメージを書き込む
# ***** 書き込み先(init_boot)、書き込みファイルを絶対に間違えないこと *****
platform-tools % ./fastboot flash init_boot magisk_patched-25200_iQ3vp.img
Sending 'init_boot' (8192 KB)                      OKAY [  0.192s]
Writing 'init_boot'                                OKAY [  0.005s]
Finished. Total time: 0.330s

# そのまま再起動を行う
platform-tools % ./fastboot reboot
Rebooting                                          OKAY [  0.000s]
Finished. Total time: 0.000s

rootが獲れたどうかの確認

 最後に、本当にrootが獲れたかを確認します。先に導入したMagiskを起動すると、追加セットアップを求められるので (左の画像)、そのまま求めに応じます。再起動後、”インストール済み” のところにバージョン番号が入っていれば、無事rootが獲れていることになります。

Enjoy!

 これでrootが取れましたので、ColorOS特有の制限を取り払うことが可能になります。さまざまなモジュールがあるので、バックグラウンドタスクの上限数の撤廃やGoogleロケーション履歴の有効化など、大抵のことはできるはずです。

 なお、おそらくですがOTAが適用されるとMagiskも無効になってしまうと思われるため、開発者向けオプションにある “自動システムのアップデート” (デフォルトで有効) は無効にしておいた方がいいと思います (確信なし、知見がある方教えてください)。

OxygenOS?

 管理人はもちろん、2/7にOxygenOSを搭載したOneplus 11のグローバル版が登場することは承知しています。しかし、先人の試行錯誤の結果では、今のところ大陸版Oneplus 11へのOxygenOSの導入はなかなか厳しいものがあるようです (もし正規のStock Firmwareがあったとしても)。もしrootを獲ったColorOS 13では不便と思う場面があったら、その時改めて OxygenOS への乗り換えよを検討しよう思っています。

 

コメントする