root化とかカスタムROMとか

いろいろいじってます

Android8.1(oreo)以降のOSをmultiromでデュアルブートする方法

今回はAndroid8.1以降(Pieで確認)のOSと純正OS(8.0以前)とのデュアルブートの方法を書いていきます。

経緯

カスタムOSをインストールしようとした際に、純正OSを保持したままデュアルブートにしたいことがあると思います。例えば指紋センサーやNFC、デュアルカメラなどはカスタムOSでは使えないことが多いので、必要な時だけ純正OSに切り替えて使う、といったことができるからです。Android8.0以前であれば、MultiROMというものをそのまま使えば良かったのですが、8.1以降では一工夫必要だったので記事にしていきます。

使用環境

  • HTC m8
  • senseROMベースの4.4のカスタムOS(4.4のファクトリーイメージが見つからなかったため)
  • Lineage16
  • MultiRom v33

通常の方法でできない原因

MultiRomではfstabに書かれているマウントポイントをSDカード上などにして実現していたようですが、android8.1以降ではそのfstabがカーネルの中にあるため、読み込むことができなくなってしまいました。その関係で、Android8.1以降のOSではセカンダリOSとして使うことができず、通常と環境を変えないプライマリOSとして使う必要があります。 しかし厄介なのが、一度プライマリOSのLineageを立ち上げると、セカンダリとしての純正OSは白いHTCの画面で止まってしまいます。なので、通常の方法ではどちらもセカンダリOSとして起動することはできません。

解決策

一度プライマリOSのLineageを立ち上げると、セカンダリは立ち上がらなくなってしまいます。どうやらストーレージ内の権限を自動で変えているようです。通常の使い方であれば問題ないですが、権限を変えられてしまうと純正OSが立ち上がりません。そこで、Lineage側から純正OSの権限を書き換えられないように、TWRPのターミナルから

#chmod 000 /sdcard/multirom

としてやります。最初は書き込みできなければいいかと思い

#chmod 400 /sdcard/multirom

にしたのですが、見えてしまうと管理者権限以上の権限?で変えてしまい、同じように立ち上がらなかったので、読み込みさえできなくします。TWRPからは読み書きできるので大丈夫です。 そしてLineage16はMultiRomから直接起動できなさそうだったので、boot.imgを書き換える方法を取りました。

OSの切り替え

毎回TWRPでboot.imgを切り替えるのは手間がかかるので、スクリプトを実行してくれるアプリを使います。私はGScriptを使いました。GScriptはPieで使われることを考慮されておらず一度作成したスクリプトは編集できないので結構めんどくさいですが、root権限で動かしてくれるまともなアプリが他にありませんでした。 /mnt/block/mmcblk0p42がboot領域になるのでddコマンドを使って

dd if=/sdcard/pieboot.img of=/dev/block/mmcblk0p42

といった感じで保存します。senseベースのカスタムOSではrebootコマンドが使えなかったので手動でやる必要があり、また、純正OSを立ち上げようとする際はMultiRomのboot.imgを書き込んで再起動するのですが、自動でプライマリーを立ち上げようとするため毎回セカンダリを選択してあげないといけません。

まとめ

手間がかかるなど問題は残っていますが、頻繁にOSを切り替えるわけでもないので十分満足に使うことができています。HTC m8はLineageにするとデュアルカメラが使えなくなるのですが、この方法を使うことで普段は最新のOSを使い、写真をとる時だけ純正OSを使うといったことができます。純正OSが8.0以前のものであれば使えるはずなので、Axon7などでもできると思います。

f:id:jesuscorona:20190628191907j:plain