ASUS Zenfone 2 Selfie(ZD551KL WW)のCM13を2016/07/02以降にアップデートする

ASUS Zenfone 2 Selfie(ZD551KL WW)のCM13 NIGHTLYを追いかけるための前提が変わったことによる対処。(2016/7/27)

背景

CM13で安定して使用していたASUS Zenfone 2 Selfie(ZD551KL WW)だが、ある日を境にCM13が更新できなくなった。
これは2016/07/02のビルドより、CM13の前提ファームウェアが変更になったことに伴うもの。
この前提を整え、最新のNIGHTLYビルドを適用できるようにする。

発生する事象

ファームウェアが前提バージョンになっていないと、アップデートしようとしてもassertに引っかかり以下のようなメッセージが表示され失敗する。
Comparing TZ version TZ.BF.3.0.C3-00025 to TZ.BF.3.0.R2-00064

assert failed: asus.verify_trustzone("TZ.BF.3.0.C3-00025") == "1"
Updater process ended with ERROR: 7

Error installing zip file 'cm-13.0-20160703-NIGHTLY-Z00T.zip'

純正ROMのAndroid 6(MM)を適用しようとして失敗する

上記の事象の解決方法としてフォーラムで呪文のように繰り返されるのが
「Apply STOCK MM first.」(先に純正のMM-ROMにしろ)

なるほどと思い、早速WW用のMM ROM(WW_21.40.0.1692)を適用することにする。

適用作業をする前に、TWRPでバックアップを取得する。
かならずBOOTも含めて取得すること。発行元をまたいでROMを書き換える場合BOOTも変更になるため、SYSTEMとDATAだけでは復旧できない。
また、OS上からバックアップソフトで内部SDカードもバックアップしておくことを推奨する。

いざ、ダウンロードしてきたファイルをインストールしようと試みる。
ところが今度はSKUが違うといわれて失敗する。
script aborted: Please use the right SKU for updating...
Device image SKU:

スクリプトでこけたとのことなので、ダウンロードしたMM ROMのZIPの中にあるupdater-scriptをのぞいてみると以下のような記述があった。

updater-script:
ui_print("Device image SKU:");
ui_print(getprop("ro.build.asus.sku"));
ui_print("OTA image SKU: WW");
getprop("ro.build.asus.sku") == "WW" || abort("Please use the right SKU for updating...");

どうやらアップデートスクリプトの中でSKUを判定する処理が入っており、TWRPがSKUを返さないためにエラーになっているようだ。
TWRPからSKUを返すようにsetpropするという手も使えそうではあるが、またなにか前提でこけても面倒くさいのでいったん純正のリカバリーに戻すことにする。
が、実は純正ROMの中にはリカバリーのイメージが入っていないようだ。
Googleで検索してみたところ、以下のファイルを発見した。

Asus Zenfone Selfie ZD551KL Original Recovery and Kernel

このなかのrecovery.imgを使用してリカバリーを書き換える。
※注) このリカバリーイメージがJP版でも使用できるかどうかは不明。そもそもこのイメージがどこを見てSKU判定しているのかわからない。(ハードコーディングの可能性もゼロじゃない)

例によってfastbootモードにして、以下のコマンドを実行。

> fastboot flash recovery recovery.img
> fastboot reboot


これで再度リカバリーモードに入ると純正のリカバリーが起動した。

それでもやっぱり失敗する

改めて、純正リカバリーから先ほどのROMのインストールを試してみる。
今度はSKUチェックに引っかからず、インストールが始まったようだ。
ところがまたアップデートに失敗する。下のxxxxは日付っぽい
Can't install this M package (xxxx) L less than 20160426 build (xxxx)
(status 7)
E: fota_return_code 409

どうやら前提ROMであるMM ROM(WW_21.40.0.1692)のさらなる前提があるようだ。
「M package」というのが「Marshmallow package」とすれば「L package」は「Lolipop package」ということになり、かつ「20160426」以降のビルドという意味になる。
これに該当するのは同じダウンロードページにある最新のLolipop ROM(WW-1.15.40.1582)ということになる。
なお、ダウンロードページには紛らわしいことに「WW-51.15.40.1582(degrade) 」というファイルがあるが、これは純正MMにアップデートした人がLolipopにdowngradeするためのファイルなので使用できない。

いったんLolipopへ、そしてCM13 NIGHTLYにたどり着く

まずはダウンロードしてきたLolipop ROM(WW-1.15.40.1582)をインストールする。
この段階で内蔵SDの中身が壊れることがあるようだ。バックアップしてないなら慌てずに通常起動してバックアップしてから作業すること。

今度はうまくいったようだ。
ここでいきなりMMにしようとすると失敗するので、いったん通常起動して久しぶりの純正Lolipopを見ようではないか。

そしておもむろに再度リカバリーモードで起動しなおし、あらためてMM ROM(WW_21.40.0.1692)をインストールする。
今度はエラーが出ることもなく正常にインストールできた。

ここでもいったん通常起動し、純正MM ROMが動作することを確認する。
インストールした段階で、ファームウェアはCM13の前提バージョンに更新されているはず。

あとは最初の時と同様の手順である。

fastbootで起動してTWRPをリカバリーに書き込む。
リカバリーモードでTWRPを起動して、Factory Resetを実行する。
そして最新のCM13をインストールする。

一回WIPEしてしまったので、DATAだけリストアすればアプリ類と設定はほとんど復旧する。
内部SDカードのデータは飛んでいるようなら適宜リストアすれば、めでたく最新のCM13が使用できるようになった。

メモ

もし通常起動できず、TWRPのみしか起動できなくなった場合、ROMの転送はsideloadから行う。
TWRPの画面で「Advanced」-「Sideload」を選択すると、USB接続したPCからadbデバイスとして認識される。
ただしASUSのUSBドライバではなぜか認識しなくなるので、Google USB Driverをダウンロードしてインストールする。
この段階でもWindowsのデバイスマネージャから自動認識に失敗するので、ドライバを直接指定してADB Interfaceとして認識させる。

あとはADBのプロンプトから以下を実行すればZIPからインストールできる。
> adb devices
xxxxxxx sideload      ←sideloadとしてデバイスリストに表示される

> adb sideload xxxxxxxxx.zip

余談

段取りよくやったように書いてあるが、fastbootでしか起動しなくなったり、データを吹っ飛ばしたりいろいろあって夜中までかかって復旧した。
これから同じことをやろうとこの文章を参照している人は、ポイントポイントに書いてあるバックアップを必ず実行すること。結構な確度で内蔵SDのデータ消えるので。