往年の名機、 三星 初代 note GT-N7000 に、Android 9 Pie ベースの LineageOS 16 の非公式カスタムROMを焼いて、 安全出行 LeaveHomeSafe アプリの身代わり端末にしてみました。
CyanogenMod 11
第一線を退いた後、ストックROMの更新はとっくに終わり、Android 4.4 Kitkat ベースの CyanogenMod 11を入れ予備機としていましたが、WhatsAppやSNS系のアプリはセキュリティ上の観点から次々とサポート外となり、現在ではRaziko(+Radiko)専用端末に。
LineageOS 15.1 へ
そんな中、香港政府謹製COVID-19追跡アプリ、安全出行 LeaveHomeSafe だけを入れた身代わり端末にしようとアップデートを思い立ち、CyanogenMod後継のLineageOSを調べていたところ、こちらの非公式カスタムROMを見付けました。
ROM焼いて終わりと言う単純な話ではなく、リパーティションを含めて作業量も多めなのですが、個々のステップについてしっかり丁寧に解説されているので、一つ一つ進めましょう。
まず、当時三星系などのカスタムリカバリではポピュラーだった、ClockworkModがリカバリに入っているので、「INSTALLATION FROM STOCK ROM」項の1〜4は飛ばし、
5. You should be in CWM recovery now. Flash this zip to get TWRP IsoRec:
20210209-boot_n7000-twrp_i9100_3311.zip
より開始します。母艦でリンクからダウンロードしたTWRPリカバリv3.3.1-1を転送。
1 |
$adb push ./20210209-boot_n7000-twrp_i9100_3311.zip /sdcard0/Download/ |
ファイル名にあるi9100とは、三星 Galaxy S2 i9100のことで、どうもデバイス名変数にi9100が格納されていました。
この後、どうしてもリパーティションに尻込みして脱線。LineageOS15.1系のカスタムROMを見付けたので、試しに焼いてみます。
1 2 3 4 |
$ ls -l 322564445 byte Nightowl-lineage15.1-beta3-n7000.zip $ adb push ./Nightowl-lineage15.1-beta3-n7000.zip /sdcard0/Download/ ./Nightowl-lineage15.1-beta3-n7000.zip: 1 file pushed. 4.1 MB/s (322564445 bytes in 74.226s) |
やや長めの初回起動を経て立ち上がった、LineageOS 15.1(Android 8.1ベース)のシステム情報は次の通りです。
ちなみに今時のAndroidではタスクボタン長押しで撮れるスクリーンショットが撮れないので調べてみたところ、以下の要領で電源ボタン長押し時に出てくるサイドメニューに追加させることが出来ました(後述のLineageOS 16でも同仕様)。
「Setting → System → Buttons → Power Menu → Check Screenshot」
それでは、別途入手した安全出行のapkファイル(執筆当時最新ver.1.1.6)を端末内へ転送し、Playストアを経由せずに直接インストールします。
1 |
adb push ./hk.gov.ogcio.leavehomesafe_v1.1.6.apk /sdcard0/Download/ |
早速アプリを起動してQRコードのスキャンを試してみますが、接写モードで固定されているような状態で、枠内にQRコードを収めるとフォーカスが全く合いません。同アプリ内にあるもう一つの機能、タクシーのナンバプレートを画像読取りでのカメラは通常モードで動作することや、カメラアプリ自体は普通に使えることから、カメラ自体に問題は無さそうです。
LineageOS 16 へ
このままでは目的にそぐわないので当初の通り、こちらの手順に戻ってLineageOS 16のインストールを進めます。「INSTALLATION」項の1から。
1. Choose your desired emulated storage partitioning configuration
ここではパーティショニングをどうするか選ぶよう、提示されています。が、ここでは選ぶだけで特に作業はありません。今回は後腐れなく、「 Android 9/10 capable」を選んでおきました。
2. Flash emulated storage capable TWRP IsoRec (flash as Image to Recovery):
i9100-LOS-16.0-Emulated-Storage-TWRP-3.3.1-1.img
次にEmulatedストレージ対応のTWRPをイメージとしてリカバリに焼きます。
1 2 3 |
$ ls -l 5957435 byte i9100-LOS-16.0-Emulated-Storage-TWRP-3.3.1-1.img $ adb push ./i9100-LOS-16.0-Emulated-Storage-TWRP-3.3.1-1.img /sdcard0/Download/ |
3. Flash i9100-to-n7000 TWRP conversion:
lanchon-twrp-patcher-20160417-n7000.zip
端末再起動してリカバリに入り直したら、最初に入れたi9100化されているTWRPリカバリをn7000にするパッチを当てます。
1 2 3 |
$ ls -l 7335 byte lanchon-twrp-patcher-20160417-n7000.zip $ adb push ./lanchon-twrp-patcher-20160417-n7000.zip /sdcard0/Download/ |
4. Flash the repartition script that you have chosen in Step 1
再び端末再起動でリカバリに入り直したら、Step.1で選択したリパーティション方法に沿ったスクリプトをダウンロードして焼き込みます。
1 2 3 |
$ ls -l 824999 byte lanchon-repit-20170115-system=1.5G+wipe-data=max+wipe-sdcard=min+wipe-preload=min+wipe-n7000.zip $ adb push ./lanchon-repit-20170115-system=1.5G+wipe-data=max+wipe-sdcard=min+wipe-preload=min+wipe-n7000.zip /sdcard0/Download/ |
ところが、Zipパッケージを置いた /sdcard0 もリパーティションされてしまうことから、これは当然失敗に。親切なことにZipパッケージは /tmp に複製されたので、メニュー戻って /tmp にあるZipパッケージをインストールします。
5. Wipe /cache, /system, Non-emulated Storage. Then, run Format Data
再起動の後Cache、System、Non-emulated Storageをワイプし、Format Dataします。
6. Proceed to flash my builds
いよいよROMを焼きます。フォーラムページのDOWNLOAD項にあるGoogle Driveへのリンクからダウンロードしました。ROM本体と同じフォルダにある boot.img も併せてダウンロード。端末内はリパーティションされたまっさらな状態なので、Zipパッケージは /data 直下に仮置きします。boot.imgは小さいので /tmp へ。
1 2 3 4 5 |
$ ls -l 8003684 byte boot.img 429132021 byte lineage-16.0-20210211-UNOFFICIAL-n7000.zip $ adb push ./lineage-16.0-20210211-UNOFFICIAL-n7000.zip /data $ adb push ./boot.img /tmp/ |
尚、今回は不要なので省きますが、通常必要なGAppsはこちらでダウンロードし、このタイミングでインストールします。
以上でリカバリモードでの作業は終わりです。いよいよシステム起動させますが、ここでTWRPアプリをインストールしないよう、必ずチェックを全て外し、画面下のスワイプではなく「Do Not Install」ボタンを押して再起動させましょう。
リパーティションなどを行ったので心配でしたが、むしろ初回起動もスムースに起動した印象です。システム情報と、初期状態のストレージ情報は以下の通りです。
次にLineageOS 15.1の時と同じ方法で安全出行アプリをインストールして、その動作を確認しましたが今回は問題無くQRコードも認識することが出来ました。ROMを焼く際に付随のboot.imgも焼いたのが有意に働いたのかも知れません。最後に「身代わりスマホ」らしく、ホーム画面を安全出行アプリアイコンで埋め尽くして完成です(どうしてこんな端末こさえているのかは心の中で察してください)。
よく使う adb コマンドまとめ
最後に余談として、こんな時ぐらいにしか使わない、adbコマンドを自分のためにまとめておきます。
先ずUbuntu母艦にツールが無かったらインストール。
1 |
$ sudo apt install android-tools-adb android-tools-fastboot |
端末のUSBデバッグモードを有効にし、母艦とUSBケーブルで繋いだら確認(初回は端末通知から許可しない限りunauthorizedのまま)。
1 2 3 4 5 6 7 8 9 |
$ adb devices List of devices attached * daemon not running; starting now at tcp:5037 * daemon started successfully 009955bbaabbee unauthorized $ adb devices List of devices attached 009955bbaabbee device |
母艦から端末をリカバリモードへ再起動。
1 2 3 4 |
$ adb reboot recovery $ adb devices List of devices attached 009955bbaabbee recovery |
母艦へファイル転送時にタイムスタンプを保持(-a)、進捗表示(-p)。フォルダ単位の母艦への転送(ファイル名にワイルドカード使えない為)。
1 2 3 |
$ adb pull -a -p /sdcard/Pictures/Screenshots/ . $ adb pull -a -p /sdcard0/Pictures/Screenshots/ . $ adb pull -a -p /data/media/Pictures/Screenshots/ . |
treeコマンド代替のディレクトリ情報出力(ルート以下の全情報を得る例)。
1 |
$ adb shell ls -l -R / > ./output.txt |
端末内のscreencapをadbで操作してスクリーンショット撮影し、母艦に直接出力(機能しないバージョンもあり)。
1 |
$ adb shell screencap -p | sed 's|\r$||' > screenshot.png |
同じくスクリーンショット撮影し、端末内のフォルダに出力。
1 |
$ adb shell screencap /storage/88EE-0000/Pictures/Screenshots/screenshot.png |
出力ファイル名を日付時刻文字列で。
1 2 |
$ adb shell screencap /storage/88EE-0000/Pictures/Screenshots/Screenshot_`date +%Y%m%d-%H%M%S`.png $ adb shell screencap -p > Screenshot_`date +%Y%m%d-%H%M%S`.png |