Essential PhoneにAndroid Oreo MR1のROMを焼き直した

こんにちは。
Essential Phoneを入手し、Android P Betaをインストールした後に題名のことを行おうとしたら若干手間がかかった為、備忘録がてら記事を残すことにしました。
(初めてQiitaに書いた記事が、結構ニッチなことであれですが…)

注意！
**上級者向けです。操作を誤ると、端末が使用不能になる恐れがあります。**
また、この操作を行うことで、保証もへったくれもなくなります。
一切の責任は負いませんので、悪しからず。(自己責任で)
下記手順は2018/6/17現在のものです。(変わる可能性があります)

---

# あらすじ (読み飛ばし可)

## なぜEssential Phone?

Android端末はXperia Z3を最後に購入していなかったのですが、最新のAndroidを試してみたいなと考え情報を探し、技適が通っている端末となるとこの端末くらいしかない…ということが分かりました。
https://developer.android.com/preview/devices/?hl=ja
(Xperia XZ2もリストにありますが、P Betaに対応しているのはグローバルモデル(恐らく技適なし)のみ…)

なので、Amazon.comから個人輸入で購入しました。
※Essential公式からも購入できるもよう
https://www.amazon.com/gp/product/B074BWGRKH/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
諸費用込みで、およそ6万円ちょっとでした。
Amazon.comから購入しましたが、急速充電用アダプターはちゃんと日本向けのコンセントタイプのものが付いてきました。

## OTA用ファイルを用いてAndroid Pをインストール

してみました。
詳細は下記記事が詳しいです。
https://qiita.com/aoinakanishi/items/2bb6bd5f95bc4995b3c8

## しかし…。

![unable_to_install_from_google_play.jpg](https://qiita-image-store.s3.amazonaws.com/0/264762/eead83ea-7f69-4dea-925c-61d18f02226b.jpeg)

とあるアプリをGoogle Playからインストールしようとしたのですが、何度再挑戦しても、見たことの無い「-504」エラー。
Google Playや開発者サービスのキャッシュを削除してもダメ、Googleアカウントを入りなおしてもダメ…。
となると、Android P Betaのバグなのかなと考えました。
その為、一度正規のAndroid Oreo MR1のイメージに戻して、再度インストールを試みることにしました。

---

# ここから本題

## 準備する必要があるもの

- Android SDK (Android Studioをインストールしていれば、くっついてくるはず)
- Essential Phone用Windowsドライバ (Windowsのみ)
- Android Oreo MR1リストア用イメージ
- 時間と、万が一文鎮化してもくじけない心

## Essential公式の手順を参照してみたが…

https://www.essential.com/developer/current-builds
公式資料としては上記ページが提供されていますが、
結論、ここに記載の手順だけでは焼き直しできませんでした＼(^o^)／

基本的には上記ページを参照していただくとして、手順を記載していきます。

---

# 下準備

1. Android SDKを用意する (+SDKのplatform-toolsディレクトリにパスを通しておくと、尚良い)
2. (Windowsのみ) Essential Phoneのドライバをインストールする
https://www.essential.com/developer/current-builds の下の方(利用規約同意前)、「Click here to download current Windows Drivers for Essential Phone.」のあたりのリンクからDL可能
3. Essential Phone側で「開発者向けオプション」を表示させる
(「端末情報」の「ビルド番号」を連打 & 端末のPINコード設定済の場合はそれを入力)
4. 「開発者向けオプション」から「USBデバッグ」を許可してadbコマンドを使えるようにする
(フィンガープリントが出てきたら、「このパソコンからのUSBデバッグを常に許可する」としておきましょう)
5. 「開発者向けオプション」から「OEMロック解除」をONにして、指示通り端末を再起動する

ここからコマンド入力が必要。
Essential PhoneをWin/mac等に繋ぎましょう。

```
$ adb devices
```

でEssential Phoneが認識されていることを確認し、

```
$ adb reboot bootloader
```

で再起動をかけて、bootloaderの画面を出す。Bootloaderの画面が表示された後、

```
$ fastboot devices
```

でEssential Phoneが認識されていることを確認する。
Windowsと接続している場合で、ここで認識されていない場合は、恐らくEssential Phoneのドライバがきちんと入っていない。
表示は、adb devices時と似たような感じになる。

```
PM1xxxxxxxxxxxxx        fastboot
```

ここまで来たら、Bootloaderのアンロックを行う。Essentialの公式ページには「unlock」のコマンドしか記載されていないが、**実際には下記に示す「unlock_critical」も行わなければならないことに注意。**
(unlock_criticalもしないと、書込時に「Flashing is not allowed for Critical Partitions」のエラーで怒られます)

```
$ fastboot flashing unlock
$ fastboot flashing unlock_critical
```

「fastboot flashing unlock」(または「unlock_critical」)のコマンドを実行した際、画面が切り替わる。
切り替わった画面で、Volume Downボタンを押下してYESのところに持っていき、電源ボタンを押下する必要がある。
YES押下後は端末再起動がかかります。Bootloaderのunlockに関する警告が消えた瞬間にVolume Downボタンを押しっぱなしで、再度Bootloaderの画面に行くことができます。
(うまくいかない場合は、端末を起動しきってしまって「adb reboot bootloader」からやり直すのが良いです)

---

## システムイメージの用意

**DLしたファイルに用意されている「.bat」or「.sh」を実行せよと記載されていますが、そのままでは、こんな感じでイメージファイルの書込に失敗します。**
(そんなパーティションないぞ！と怒られてしまう)
ですので、下準備が必要です。

```
$ fastboot flash nvdef nvdef.img

Sending 'nvdef__b' (310KB)    OKAY [  0.094s]
Writing 'nvdef__b'            FAILED (remote: No such partition.)
Finished. Total time: 0.109s

(以下略)
```

まずは、Android Oreo MR1のシステムイメージをDL&解凍。
https://www.essential.com/developer/current-builds で利用規約に同意して、必ず「Download (Fastboot).」をDLする。
注意書きもありますが、イメージを焼き直さなければダウングレードできない為、OTA版は使えません。

**(ここからが大事！)**
解凍したファイルを確認し、flashall.bat (Mac等ではflashall.sh) を探して開く。
元は、下記のようになっています。

```shell:flashall.bat
fastboot flash nvdef nvdef.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash bluetooth bluetooth.img
fastboot flash abl abl.img
fastboot flash dsp dsp.img
fastboot flash modem modem.img
fastboot flash vendor vendor.img
fastboot flash cmnlib cmnlib.mbn
fastboot flash cmnlib64 cmnlib64.mbn
fastboot flash tz tz.mbn
fastboot format userdata
fastboot reboot
```

これを、下記のようにパーティション全てに「\_b」を追加して保存します。
(「\_\_b」(アンスコ2文字)ではなく、**「\_b」(アンスコ1文字)**なので注意)

```shell:flashall.bat
fastboot flash nvdef_b nvdef.img
fastboot flash boot_b boot.img
fastboot flash system_b system.img
fastboot flash bluetooth_b bluetooth.img
fastboot flash abl_b abl.img
fastboot flash dsp_b dsp.img
fastboot flash modem_b modem.img
fastboot flash vendor_b vendor.img
fastboot flash cmnlib_b cmnlib.mbn
fastboot flash cmnlib64_b cmnlib64.mbn
fastboot flash tz_b tz.mbn
fastboot format userdata
fastboot reboot
```

Redditの下記投稿が参考になりました。
(既に、同じ問題を抱えている人がいたもよう。。)
https://www.reddit.com/r/essential/comments/8pgikp/unable_to_flash_official_images_using_fastboot/

引用はじめ

> Im having the same problem and need to edit the bath file (flashall.bat) and need to add a "\_b" to all command. For exemple fastboot flash nvdef_b nvdef.img

引用おわり

---

# さぁ焼き直そう！

ここまで準備ができれば、後は焼き直すだけです。
改めて、Bootloaderの画面を表示させましょう。

```
$ adb reboot bootloader
```

念のため、fastbootで認識するかどうかを確認し…。

```
$ fastboot devices

PM1xxxxxxxxxxxxx        fastboot
```

あとは、「flashall.bat」(または「flashall.sh」)を実行すればよいです。
成功する場合、書き込みには数分程度かかります。

.bat or .shの最後にrebootコマンドが仕込まれているため、処理終了後端末が再起動します。
暫く待たされますが、背景が白い初期化設定画面が表示されれば、無事焼き直し成功です！
お疲れ様でした。

---

# ちなみに

Google Playでインストールに問題があったアプリ、Oreo MR1の状態では正常にインストールできました。
Android P Betaに問題がありそうなので、追ってFeedbackしようと考えています。

尚、単にcompileSdkVersionが低いだけであれば、ちゃんと下記ダイアログがP Beta上で表示されていたのは確認しました。
何等か別種の問題があるものと予想されます。

![lower_compile_sdk_version.jpg](https://qiita-image-store.s3.amazonaws.com/0/264762/59403f69-388a-16f2-ebc7-eeb4b1f505b3.jpeg)