Pixel3・android11(R)正式リリース版でroot化!

じゃんくはっく
じゃんくはっく

Pixel3をAndroid11でroot化したよ!

どんなメリットがあるの?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

それは色々ありすぎて、目的によるね!

そんなマニアックなネタ、需要あるの?

ぴー
ぴー

はいー! ぴーちゃんの言う通り、マニアックネタになります。しかし、root化によるメリットは結構あります。もちろんデメリットもありますが、実際にいろいろ触って体験してみましょう。あと自己責任でよろしくね!真似して何か不利益が起きても著者は知りませんよ。

そもそも、root化ってなに?

このブログの趣旨としては、なるべく専用用語を使わずわかりやすく一般の人にも理解してもらいたい・そー著者は思っております。

すべて使わないのは無理があるわね!

ぴー
ぴー

root化 (Android OS)
出典: フリー百科事典『ウィキペディア(Wikipedia)』

https://ja.wikipedia.org/wiki/Root%E5%8C%96_(Android_OS)

wikiではこのように説明されていますね。一言で言えば、Androidの最高管理権限をゲットするということです。一体、この権限を取得して何をするのか? ということが、本来大事ですよね。目的があってこそのroot化です。

root化して何するの・・・?

今回、スマホ(Pixel3)をroot化したいなと思った1つの大きな目的はtermux です。Termuxは、root化しなくてもいろんなアプリが動作する大変面白い神アプリですが、1024ポート未満は、root権限がないと動作しません。例えば、nginxを80番ポートで動作させようとすると以下のようになります。

$ nginx
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /data/data/com.termux/files/usr/etc/nginx/nginx.conf:3
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

このようにroot権限がないと、バインドできないんです。WEBサーバ以外にも、例えばDNSの53ポートや、SSLの443など、なるべくそのままのポートで動作させたいものがあります。root化していれば、この制限がなくなります。つまり、今の所、内部向けDNSと、WEB・SSLサーバをスマホで動作させたいのが root化の大きな目的です。

 現在、このブログが動作している Umidigi F2というスマホにもtermuxが動作していて、そこでは8080と8443ポートで動作しているWordPressがあります。現在は外向け用に、グローバルIP+ポートをプライベートIP+内部ポートに変換して運用していますが、内部からのアクセスだとUターンNATができないルータの影響で、内部ネットワークからはドメイン名でWordPressにアクセスできないのです。ポート変換がなければ、内部向けDNSを作ればシンプルに解決できますので、ポート53で動作する省電力DNSサーバとWEB/SSLサーバが欲しかったわけです。まだ検討中なので、実運用するかどうかはわかりません。

 というわけで、Pixel3のroot化やってみましょうか。

ステップ1 概要

こういうのは、全体像が見えていることが大事です。今回、Pixel3のAndroid11最新バージョンの状態でroot化をどのようにするか、要点をまとめてみます。

・Magiskというツールを使い、twrpは使わない
・Magiskを使い、純正ファクトリーイメージに含まれるBootにパッチする
・adb純正ツールで、BootをPixelに書き込む
・Termuxはroot権限を利用できるようMagiskに設定しておく

root化というのは、Bootプロセスの一部に細工を加えその後に展開されるOSイメージのroot権限を奪取して、永続化できるよう書き換えるというものです。Pixelの場合は、ブートローダは普通にだれでもアンロックできますので boot.imgを程よく書き換えればその後マウントされる中でrootがイキの状態に持っていけるということです。

他にも違うやり方はあると思いますが、Magiskというツールがなかなかよかったので、今回はこれでやることにします。boot中にどのような手法でやっているのか(一部、脆弱性を利用していると思いますが)、その具体的な手法については未調査です。

ステップ2 必要なツールと準備

さて、まずは前準備が大切です。

SDK・プラットフォームツール
::
これは最新にしておいてね!

https://developer.android.com/studio/releases/platform-tools.html

AndroidStudioから、最新にする方法もあります。また入れてあれば上記からDLして、本来入っているところに上書きしておけばOKです。現在の最新は以下のバージョンです。

$ adb --version
Android Debug Bridge version 1.0.41
Version 30.0.4-6686687

次はファクトリーイメージをダウンロードしておきます。

Factory Image
::
“blueline” for Pixel 3
::
11.0.0 (RP1A.200720.009, Sep 2020)

https://developers.google.com/android/images

Pixel3のコードネームは、bluline です。これの現在最新の11.0.0 (RP1A.200720.009, Sep 2020)をダウンロードしておきます。コマンドでやる場合は以下のようになります。著者は、ルート直下にsrcディレクトリ作ってますが、別にどこでやってもいいです。パスが長くなるのが嫌だっただけです。

$ sudo mkdir /src
$ sudo chmod 777 /src
$ cd /src
$ wget https://dl.google.com/dl/android/aosp/blueline-rp1a.200720.009-factory-145e4cc4.zip
$ shasum -a 256 blueline-rp1a.200720.009-factory-145e4cc4.zip

 ※ Checksum を確認しておいてね。RP1A.200720.009

ステップ3 ファクトリーイメージを展開

ダウンロードしたファイルを展開します。

$ unzip blueline-rp1a.200720.009-factory-145e4cc4.zip 
$ tree blueline-rp1a.200720.009
blueline-rp1a.200720.009
├── bootloader-blueline-b1c1-0.3-6623201.img
├── flash-all.bat
├── flash-all.sh
├── flash-base.sh
├── image-blueline-rp1a.200720.009.zip
└── radio-blueline-g845-00107-200702-b-6648703.img

さらにその中のイメージファイルを展開

$ mv blueline-rp1a.200720.009/*.zip ./
$ mv blueline-rp1a.200720.009/*.img ./
$ unzip image-blueline-rp1a.200720.009.zip -d image-blueline-rp1a.200720.009
$ tree image-blueline-rp1a.200720.009
image-blueline-rp1a.200720.009
├── android-info.txt
├── boot.img
├── dtbo.img
├── product.img
├── super_empty.img
├── system.img
├── system_ext.img
├── system_other.img
├── vbmeta.img
└── vendor.img

$ mv image-blueline-rp1a.200720.009/boot.img ./

ステップ4 Magisk Managerを入れる

スマホのアプリなので、スマホから操作です。

Magisk Manager Canary
 ※ Magisk Manager Canary から、APKをDLして入れておく

https://github.com/topjohnwu/Magisk

Canaryビルドのほうが、現時点ではインターフェイスが新しくなって使いやすかったです。

ステップ5 boot.img をスマホに転送

さきほど、ファクトリーイメージの中から取り出した、boot.img をスマホに転送しておきます。adb コマンドでやる場合は以下

$ adb push ./boot.img /sdcard/Download/
./boot.img: 1 file pushed, 0 skipped. 83.1 MB/s (67108864 bytes in 0.770s)

Android File Transfer とか使ってもOKです。何らかの方法でスマホに転送してね。

ステップ6 Magisk Managerアプリでパッチ

スマホに転送したboot.imgをMagisk Managerアプリでパッチを当てます。

boot.imgを選択して、LET`S GO→ です。

All done! でパッチ当て成功です。

ステップ7 magisk_patched.img をPCにダウンロード

PCから、adbコマンドでパッチしたboot.imgを書き込みますのでさきほどの、magisk_patched.img をPCにダウンロードしておきます。adb コマンドでやる場合は、以下

$ adb pull /sdcard/Download/magisk_patched.img ./
/sdcard/Download/magisk_patched.img: 1 file pulled, 0 skipped. 69.2 MB/s (67108864 bytes in 0.925s)

ステップ8 OEMロック解除

開発者オプションから、OEMロック解除をOnにしておきます。あと、USBデバックはONで。

一回、電源を落とします。電源オフの状態から電源+ボリューム下キーを長押し “Fastboot Mode” を起動。

$ fastboot flashing unlock

スマホ本体よりボリューム↑↓キーで『Unlock the bootloader』を選択、電源キーで確定します。

$ fastboot reboot

ステップ9 PCからイメージファイルを書込

PCから、adbコマンドでいろいろ書き込みます。まずは、スマホをFastboot modeにしておきます。

・再起動>ボリューム下キー
 → Fastboot mode でスマホが起動

PCから認識されているか確認しておきます。以下のようにシリアルナンバーが表示されていればOKです。

$ fastboot devices
8*******6	fastboot

ファクトリーイメージに含まれる、以下ファイルを書き込みます。

$ fastboot flash bootloader <以下ファイルをD&D>

 bootloader-blueline-b1c1-0.3-6623201.img

実行例は以下です。

$ fastboot flash bootloader ./bootloader-blueline-b1c1-0.3-6623201.img
Sending 'bootloader_b' (8537 KB)                   OKAY [  0.290s]
Writing 'bootloader_b'                             (bootloader) Flashing Pack version b1c1-0.3-6623201
(bootloader) Flashing partition table for Lun = 0
(bootloader) Flashing partition table for Lun = 1
(bootloader) Flashing partition table for Lun = 2
(bootloader) Flashing partition table for Lun = 4
(bootloader) Flashing partition table for Lun = 5
(bootloader) Flashing partition msadp_b
(bootloader) Flashing partition xbl_b
(bootloader) Flashing partition xbl_config_b
(bootloader) Flashing partition aop_b
(bootloader) Flashing partition tz_b
(bootloader) Flashing partition hyp_b
(bootloader) Flashing partition abl_b
(bootloader) Flashing partition keymaster_b
(bootloader) Flashing partition cmnlib_b
(bootloader) Flashing partition cmnlib64_b
(bootloader) Flashing partition devcfg_b
(bootloader) Flashing partition qupfw_b
(bootloader) Flashing partition storsec_b
(bootloader) Flashing partition logfs
OKAY [  0.825s]
Finished. Total time: 1.384s

で、このコマンドをやっておきます。

$ fastboot reboot bootloader

実行例は以下です。

$ fastboot reboot bootloader
Rebooting into bootloader                          OKAY [  0.081s]
Finished. Total time: 0.081s

radioファイルを書き込みます。

$ fastboot flash radio <以下ファイル>

 radio-blueline-g845-00107-200702-b-6648703.img

実行例は以下です。

$ fastboot flash radio ./radio-blueline-g845-00107-200702-b-6648703.img 
Sending 'radio_b' (71436 KB)                       OKAY [  1.670s]
Writing 'radio_b'                                  (bootloader) Flashing Pack version SSD:g845-00107-200702-B-6648703
(bootloader) Flashing partition modem_b
OKAY [  0.555s]
Finished. Total time: 2.495s

で、このコマンドをやっておきます。

$ fastboot reboot bootloader

実行例は先と同じなので省略です。

Android11の本体イメージを書き込みます。

$ fastboot --skip-reboot update <以下ファイル>

 image-blueline-rp1a.200720.009.zip

実行例です。ここは少し時間がかかります。途中リブートしましたがほっとけばOKです。

$ fastboot --skip-reboot update ./image-blueline-rp1a.200720.009.zip 
--------------------------------------------
Bootloader Version...: b1c1-0.3-6623201
Baseband Version.....: g845-00107-200702-B-6648703
Serial Number........: 8*******6
--------------------------------------------
extracting android-info.txt (0 MB) to RAM...
Checking 'product'                                 OKAY [  0.058s]
Checking 'version-bootloader'                      OKAY [  0.060s]
Checking 'version-baseband'                        OKAY [  0.060s]
Setting current slot to 'b'                        OKAY [  0.396s]
extracting boot.img (64 MB) to disk... took 0.503s
archive does not contain 'boot.sig'
Sending 'boot_b' (65536 KB)                        OKAY [  1.531s]
Writing 'boot_b'                                   OKAY [  0.468s]
extracting dtbo.img (8 MB) to disk... took 0.017s
archive does not contain 'dtbo.sig'
Sending 'dtbo_b' (8192 KB)                         OKAY [  0.280s]
Writing 'dtbo_b'                                   OKAY [  0.170s]
archive does not contain 'dt.img'
archive does not contain 'recovery.img'
extracting vbmeta.img (0 MB) to disk... took 0.000s
archive does not contain 'vbmeta.sig'
Sending 'vbmeta_b' (8 KB)                          OKAY [  0.120s]
Writing 'vbmeta_b'                                 OKAY [  0.067s]
archive does not contain 'vbmeta_system.img'
archive does not contain 'vendor_boot.img'
extracting super_empty.img (0 MB) to disk... took 0.000s
Rebooting into fastboot                            OKAY [  0.060s]
< waiting for any device >

 ※端末がリブート > もう一度リブート
  >fastbootd 画面になる
  >さらに、コマンドが流れる

Sending 'system_b' (4 KB)                          OKAY [  0.001s]
Updating super partition                           OKAY [  0.006s]
Deleting 'system_a'                                OKAY [  0.005s]
Deleting 'vendor_a'                                OKAY [  0.005s]
Resizing 'product_b'                               OKAY [  0.005s]
Resizing 'system_b'                                OKAY [  0.005s]
Resizing 'system_ext_b'                            OKAY [  0.006s]
Resizing 'vendor_b'                                OKAY [  0.006s]
archive does not contain 'boot_other.img'
archive does not contain 'odm.img'
extracting product.img (1871 MB) to disk... took 14.110s
archive does not contain 'product.sig'
Resizing 'product_b'                               OKAY [  0.006s]
Sending sparse 'product_b' 1/8 (262140 KB)         OKAY [  6.294s]
Writing 'product_b'                                OKAY [  2.634s]
Sending sparse 'product_b' 2/8 (262140 KB)         OKAY [  6.388s]
Writing 'product_b'                                OKAY [  1.599s]
Sending sparse 'product_b' 3/8 (262140 KB)         OKAY [  6.376s]
Writing 'product_b'                                OKAY [  1.598s]
Sending sparse 'product_b' 4/8 (262140 KB)         OKAY [  6.399s]
Writing 'product_b'                                OKAY [  1.648s]
Sending sparse 'product_b' 5/8 (262140 KB)         OKAY [  6.375s]
Writing 'product_b'                                OKAY [  1.612s]
Sending sparse 'product_b' 6/8 (262140 KB)         OKAY [  6.385s]
Writing 'product_b'                                OKAY [  1.625s]
Sending sparse 'product_b' 7/8 (262140 KB)         OKAY [  6.404s]
Writing 'product_b'                                OKAY [  1.586s]
Sending sparse 'product_b' 8/8 (81204 KB)          OKAY [  2.447s]
Writing 'product_b'                                OKAY [  0.579s]
extracting system.img (784 MB) to disk... took 4.331s
archive does not contain 'system.sig'
Resizing 'system_b'                                OKAY [  0.006s]
Sending sparse 'system_b' 1/4 (262140 KB)          OKAY [  6.089s]
Writing 'system_b'                                 OKAY [  2.647s]
Sending sparse 'system_b' 2/4 (262140 KB)          OKAY [  6.203s]
Writing 'system_b'                                 OKAY [  1.607s]
Sending sparse 'system_b' 3/4 (262140 KB)          OKAY [  6.149s]
Writing 'system_b'                                 OKAY [  1.631s]
Sending sparse 'system_b' 4/4 (16400 KB)           OKAY [  0.806s]
Writing 'system_b'                                 OKAY [  0.171s]
extracting system_ext.img (183 MB) to disk... took 0.944s
archive does not contain 'system_ext.sig'
Resizing 'system_ext_b'                            OKAY [  0.005s]
Sending 'system_ext_b' (187564 KB)                 OKAY [  4.167s]
Writing 'system_ext_b'                             OKAY [  2.209s]
extracting system_other.img (68 MB) to disk... took 0.385s
archive does not contain 'system.sig'
Sending 'system_a' (69880 KB)                      OKAY [  1.558s]
Writing 'system_a'                                 OKAY [  0.420s]
extracting vendor.img (408 MB) to disk... took 2.065s
archive does not contain 'vendor.sig'
Resizing 'vendor_b'                                OKAY [  0.005s]
Sending sparse 'vendor_b' 1/2 (262140 KB)          OKAY [  5.997s]
Writing 'vendor_b'                                 OKAY [  2.631s]
Sending sparse 'vendor_b' 2/2 (156584 KB)          OKAY [  3.825s]
Writing 'vendor_b'                                 OKAY [  1.022s]
archive does not contain 'vendor_dlkm.img'
archive does not contain 'vendor_other.img'
Finished. Total time: 162.157s

最後です。スマホでパッチしたboot.imgを書き込みます。

$ fastboot flash boot <以下パッチしたimgファイル>

 magisk_patched.img

実行例です。

$ fastboot flash boot ./magisk_patched.img 
Sending 'boot_b' (65536 KB)                        OKAY [  1.454s]
Writing 'boot_b'                                   OKAY [  0.392s]
Finished. Total time: 1.855s

ステップ10 スマホをリブートする

スマホの画面は、fastbootd になっていますので、「Reboot system now」が選択された状態で電源ボタンを押します。リブートは40秒くらいして、OSが起動しました。

ステップ11 確認

Magiskアプリは以下のようになっていれば、root化は成功しています。Termuxからrootパッケージを入れて、su すると許可画面が出るのでOKしておけば以下のようにスーパーユーザーの画面に出てきます。

逆にアプリから隠したい場合は、MagiskHideからアプリを選択しておきます。Termux側からの操作、例えばrootパッケージを入れてどうなったかなどは次回また紹介することにします。あと、OSの自動アップデートはOffにしておいてくださいね。ここ、めちゃ大事。開発者オプションから選択できます。

まとめ

今回、作業してみての感想やまとめは以下です。

・root化は久しぶりで事情がだいぶ変わっていた
・Magiskアプリはよくできている
・TWRPは、対応したらやってみる。たぶんUmidigiF2でやることになりそう
・日本語で、まとまっているサイトがなかった
・今年中にまたOSアップデートが来ると思うが、その時は状況みて導入するか考える

あとがき

ステップ9はわけるべきだったか迷いました。まぁ、流れは書き込みなのでいいかな?w で、root化すると、tcpdump も使い放題、他のアプリ領域のデータも見放題となり、随分いろいろと物色してしまいました。また、当初の目標だった、1024ポート以下のサービス起動も問題なくできていろいろできることが増えそうです。

 あと、termux-root-packagesを見ていると知らないアプリがあって興味津々です。たとえば、tincとかっていうVPNデーモン。これすごく使いやすそうです。

著者にメッセージ

コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

    Pixel3・android11(R)正式リリース版でroot化!」への3件のフィードバック

    1. 詳しい解説記事をありがとうございます
      初めてでしたが、おかげさまでroot化成功しました。

      初心者の私がつまずいた点を、他の初心者のため残します。

      ・Magiskマネージャーはインストール後、設定→更新チャンネルをβ版に変更する必要あり(2020/11/14現在)
      ・ファイルをPCから送るときはコマンドの後に半角スペース必要 (fastboot flash bootloader)

    2. 詳しい解説記事をありがとうございます
      初めてでしたが、おかげさまでroot化成功しました!

      初心者の私がつまずいた点をメモとして残します。

      ・Magiskマネージャーは設定→更新チャンネルをβ版に変更する必要がありました(2020/11/14現在)

      ・半角スペース忘れないこと→例:fastboot flash bootloader<半角スペース><ファイルパス>

    お気軽にコメントどうぞ〜!