原因は次のようになります。かなり前(およそ 1 年前)に、テスト用に Google Pixel5 の携帯電話を持っていました。もちろん、いじることは避けられませんでしたので、Magisk や TaiChi などもインストールしました。しかし、ある操作ミスの後、携帯電話をリセットしてしまいました。そのため、もう一度やり直すしかありませんでしたが、Magisk をフラッシュする際に失敗し、携帯電話が無限に再起動するようになりました。当時は後悔しましたが、使えなくなったと思って放置していました。
しかし、先週、気が向いて携帯電話を充電したところ、なんと使えるようになっていました!時間が本当にバグを修正することができるのでしょうか(笑)
Android についてはあまり詳しくないので、ここで知識を補完することにしました。
いくつかの概念#
- OTA
OTA(Over-The-Air)イメージは、ワイヤレスでデバイスに送信されるシステムやアプリのアップデートパッケージを指します。OTA アップデートにより、デバイスメーカーやキャリア、アプリ開発者はユーザーのデバイスにアップデートをプッシュすることができます。ユーザーはコンピュータに接続する必要も外部ツールを使用する必要もありません。
簡単に言えば、通常のシステムアップデート時に、ワイヤレスでダウンロードして取得するパッケージのことです。具体的な OTA アップデートの原理については、こちらの android ota アップデート原理 3を参照してください。ただし、ここでは概念を理解するだけで十分です。
- Magisk
Magisk の原理については、システムファイルとは別のファイルシステムをマウントしてカスタムコンテンツをロードすることで、システムパーティションに平行世界へのアクセスを提供すると理解できます。すべての変更はその世界(Magisk パーティション)で行われ、必要に応じて(システムパーティションの観点からは)何も変更されていなかったと見なされることができます。
パーティションに関連するので、パーティションについても理解する必要があります。Windows のディスクパーティションと同様に、基本的にはディスク上の連続したストレージ領域を割り当て、一定の形式でデータを組織化することです。Windows にはブートパーティションがあるように、起動プロセスを振り返ってみましょう:
- CPU は BIOS の初期化、セルフチェックなどのプログラムを実行し、ディスクの内容を物理メモリの 0x7c00 にロードします。
- ブートセクタのブートプログラムから実行を開始します。
- ......
Android は本質的には Linux システムであり、起動プロセスも同様に比較できるため、Android のパーティションを理解するのは難しくありません。
- boot パーティション:カーネルなど、ブートローダーに必要なすべての情報が含まれています。
- system パーティション:Android オペレーティングシステム自体が含まれています。
- recovery パーティション:更新、バックアップ、システムの復元に使用されるリカバリモードのコードが含まれています。
- userdata パーティション:ユーザーデータとアプリケーションが含まれています。
- cache パーティション:一時データと OTA アップデートの保存に使用されます。
これらの情報は通常、ディスクの最初の数 KB に書き込まれます。mbr、gpt などのディスクパーティションテーブルについて理解していれば、理解するのは難しくありません。Windows では、WinHex を使用してブートパーティションの内容を直接表示できますが、Android ではどのように操作するのでしょうか?
dd コマンドを使用することができます:
adb shell su -c "dd if=/dev/block/bootdevice/by-name/boot_a of=/sdcard/boot.img"
adb pull /sdcard/boot.img
現在、Android システムは A/B パーティションスキームをサポートしており、つまり 2 つの独立したシステムパーティション、 boot_a
と boot_b
があります。このようなデバイスでは、1 つのパーティションでシステムを実行し、もう 1 つのパーティションでバックグラウンドで更新を実行し、次回の再起動時に新しいパーティションに切り替えることで、シームレスなシステムの更新が実現されます。
注:本質的には、Linux ではすべてがファイルです。boot_a は実際には /dev/block ディレクトリのデバイスファイルを指しています。
redfin:/ # ls -al /dev/block/bootdevice/by-name/boot_a
lrwxrwxrwx 1 root root 15 1970-01-04 03:33 /dev/block/bootdevice/by-name/boot_a -> /dev/block/sda6
したがって、Magisk が何をするかは明らかです。本質的には、 boot.img
の内容を抽出し、それにパッチを当てて Magisk パーティションを作成することです。
- ブートローダー
オペレーティングシステムの起動プロセスを覚えている場合、ブートローダーは実際にはメモリの初期化やディスクのブートパーティションのロードなど、非常に重要な機能を持っていることがわかります。したがって、ブートローダー画面に入ることができれば、携帯電話はほぼ修復可能です。
adb reboot bootloader
- fastboot
fastboot
は adb に似ており、デバイスのブートローダーと通信するために使用されます。主にアンロックやフラッシュに使用されます。
デバイスはブートローダーモード(または fastboot モード)である必要があるため、 fastboot
を使用できるようになります。
よく使用される fastboot
コマンド:
-
fastboot devices
:コンピュータに接続されているデバイスのリストを表示します。 -
fastboot flash [partition] [filename]
:指定したパーティションにフラッシュします。たとえば、リカバリパーティションにフラッシュするには:
fastboot flash recovery recovery.img
-
fastboot boot [kernel] [ramdisk]
:デバイスに直接フラッシュせず、指定したカーネル /ramdisk からのみブートします。 -
fastboot erase [partition]
:指定したパーティションを消去します。 -
fastboot oem unlock
:デバイスのブートローダーをアンロックします。
Magisk のインストール#
大まかに言えば、次の手順に分けることができます。
- ブートローダーのアンロック
- boot.img をパッチする
- パッチ後の boot.img をフラッシュする
- Magisk Manager を使用して Magisk をインストールする
最初のステップは、携帯電話のブランドによって異なりますが、Google はこの点で比較的オープンです。
また、Pixel の最大の利点は、公式ウェブサイトでデバイスのイメージが提供されていることです:ダウンロードリンク
携帯電話のバージョン番号を確認するだけで十分です(小米のように開発版を申請するためにポイントが必要な場合とは異なります)
ダウンロードして解凍し、 boot.img
を見つけて携帯電話に転送し、Magisk Manager でパッチを当ててエクスポートします。
パッチ後の img から起動すると、この操作は通常リスクがないですが、直接上書きすると問題が発生する可能性があります(ただし、問題はそれほど大きくありません)。
fastboot boot magisk_patched-26100_nRGcd.img
Sending 'boot.img' (98304 KB) OKAY [ 2.521s]
Booting (bootloader) boot.img missing cmdline or OS version
OKAY [ 1.577s]
Finished. Total time: 4.145s
起動後、一時的に root 権限を取得できます。ただし、再起動すると無効になります。なぜなら、再起動後は元の boot.img
から起動するからです。
この時点で、Magisk Manager を使用してフラッシュすることができます。この方法は比較的安全です。
問題の振り返り#
後で振り返ってみると、実際の問題は次のとおりです:
他の解決策もいくつかありますが、私は試してみましたがうまくいきませんでしたので、放置しました。
Magisk モジュールのおすすめ(空)#
本来はいくつかの Magisk モジュールをおすすめする予定でしたが、私は Android をあまり使わなくなりましたし、Magisk をインストールする目的も単に root 化するためだけです(笑)
Magisk をインストールした後に何をインストールする?私がおすすめする 20 以上のモジュール
参考#
Android の必須操作 - Pixel3 に Magisk をインストールする
[解決済み] Pixel 4 に Magisk をフラッシュすると、fastboot モードでデバイスが見つからない問題と復旧方法
[オリジナル] クラウドフォンの基礎技術の秘密:Android システムの起動と Magisk の原理
[オリジナル] Magisk 学習:vbmeta.img のフラッシュと avb2.0 検証の無効化