・Android 7.0以降の環境では、systemパーティションの書き換えにはdm-verityの無効化が必要
本論
Androidでsystemパーティションにapkやら何やらを追加したい場合、端末のroot化が一般的かと思うのですが、私の場合はrootを取らずにrecoveryから書き込むってのをよくやっていました。(もちろんTWRPなどのカスタムリカバリが必要)
しかしAndroid7.0で同様の手順を行ったところ、recoveryでは問題なく書き込まれているように見えるファイルが、通常boot時には書き込まれていないという現象に遭遇。それもrecoveryに戻るとちゃんと書き込まれたままなので何だかよく分からない。
これ、どうやらAndroid7.0で適用が厳格化されたセキュアブートの影響のようです。
Google Developers Japan: セキュアブートの厳格な適用とエラー訂正
https://developers-jp.googleblog.com/2016/08/secure-boot.html
dm-verityさんがパーティションの改変を検出して、元の状態に復旧してしまっているご様子。
さてこの状況を回避するために、私はdm-verityを無効化したbootパーティションを適用しています。
nexus 5Xだとxda-developersの以下のスレッドで公開されていました。
Modified boot.imgs for 5X (Nougat)-Disable f… | LG Nexus 5X
https://forum.xda-developers.com/nexus-5x/general/modified-boot-imgs-android-n-t3495169
使うのは、
forced encryption disabled
の方ではなく、
forced encryption disabled & dm-verity disabled
の方ですね。
公式ROMの適用からsystem書き換えまでの手順は以下のような感じです。
1.nexus公式のROM imageを適用
2.端末が起動してきたら電源をOFFしてbootloaderを起動
3.ダウンロードしてきたdm-verity無効なbootをflash
4.userdataとcacheのフォーマット(force encryption disabledの対応)
5.TWRP等のカスタムリカバリを起動
6.systemパーティションの書き換え
ちなみにrootを取得してしまってもよいのであれば、
1.nexus公式のROM imageを適用
2.端末が起動してきたら電源をOFFしてbootloaderを起動
3.TWRP等のカスタムリカバリを起動
4.SuperSUの適用
5.systemパーティションの書き換え
これでもOKです。(SuperSUがdm-verity無効化もしてくれているようです)
ただ、私が以前に試したとき(7.0 betaの頃?)には、3のTWRP起動時にパーティションの暗号化解除パスワードを求められてTWRPがちゃんと起動しなかったんですよね。なのでforced encryption disabledなbootに置き換えてからSuperSU適用して…という流れになっていたのですが、現時点ではその必要はないようです。(その頃はdm-verity disabledなbootが公開されていなかったので、system書き換えにroot化は必須でした)
[updated 8-27-16] [Decrypted] [Modified Boot… | LG Nexus 5X
https://forum.xda-developers.com/nexus-5x/general/4-17-16-t3360574
先人の偉大なる成果に感謝。