パスワードを忘れた? アカウント作成
12556548 journal
日記

taka2の日記: Nexus Player で音声検索が動かない その5(実験失敗)

日記 by taka2

Nexus Player で音声検索が動かない: その傾向と対策 4(対策はありません)の続き

前回までのあらすじ
・Nexus Player で、音声検索できなくなった。(音声認識はされるが、いつまで待っても検索実行されない)
・原因は「Google app for Android TV」のバージョンアップ後のエンバグ
・OSが5.1.1であれば、アップデートを削除すれば(OS付属のGoogle app に差し戻せば)音声検索できるようになる。
・OSが6.0だと、収録バージョンもバグ持ちなので音声検索できない。
・ファクトリイメージから5.1.1を入れれば音声検索できるが、OTAで強制的に6.0に上げられてしまう。5.1.1を使い続ける方法がない。
・5.1.1のイメージから付属のGoogle app を抽出することはできたが、6.0にインストールすることはできなかった。

で、今回のチャレンジは
・6.0のファクトリイメージを改変して、5.1.1付属のGoogle app を収録したカスタムROMを作る
というものです。
結果から言うと失敗でした。音声検索を実行しようとリモコンのマイクボタンを押すと「Googleが異常終了しました」と表示され、まったく音声検索できません。(この「Google」というのは、Google app for Android TV のアプリ一覧でのアプリ名です)
思えば、前回の「Google app をアプリ名を変えてインストール」した場合の「音声検索を実行しようとしたところでアプリの選択ポップアップが出るが、無理矢理入れた方のGoogle app を選択すると、異常終了してしまう」というのも、インストールに失敗していたのではなく、旧版の Google app は 6.0 では動かないものだった、ということなんだと思います。

で、まあ結果はダメだったんですが、カスタムROMを作る手順なんかで結構試行錯誤があったので、メモがてら日記に残しておきます。

前回はWindows上でcygwinを使ってましたが、今回、ext4をマウントする都合から、Linux(VM上の Ubuntu 15.04 Server)を使ってます。

1. google の公式サイトから、Nexus Player 用の6.0(MRA58K)のROMイメージをダウンロードする
https://developers.google.com/android/nexus/images#fugu
$ wget 'https://dl.google.com/dl/android/aosp/fugu-mra58k-factory-61ac65bc.tgz'

2. ダウンロードしたtgzから、imageファイルを展開
$ tar zxf fugu-mra58k-factory-61ac65bc.tgz fugu-mra58k/image-fugu-mra58k.zip
$ (cd fugu-mra58k; unzip image-fugu-mra58k.zip)

3. ext4_utils をダウンロード・インストール
http://forum.xda-developers.com/galaxy-s2/general/ref-unpacking-repacking-stock-rom-img-t1081239
$ wget 'http://forum.xda-developers.com/attachment.php?attachmentid=2380988&d=1383992072' -O ext4_utils_new_cygwin_fixed.tar.gz
$ tar zxvf ../ext4_utils_new_cygwin_fixed.tar.gz
$ cd ext4_utils_new
$ make
$ cp -p simg2img ext2simg make_ext4fs mkuserimg.sh ~/bin/

上述のsystem.img は、ファイルシステムとしてはext4ですが、単なるディスクイメージではなくsparseな部分を圧縮した独自形式になってます。

simg2img: sparse イメージを通常のext4イメージに変換するプログラム
ext2img: 通常のext4イメージをsparseイメージに変換するプログラム
make_ext4fs: 指定ディレクトリにあるファイル群から、ext4イメージやsparseイメージを構築するプログラム

4. sparseイメージからext4イメージへの変換およびマウント
$ simg2img fugu-mra58k/system.img fugu-mra58k/system.ext4
$ sudo mkdir -p /mnt/fugu-mra58k
$ sudo mount -o loop fugu-mra58k/system.ext4 /mnt/fugu-mra58k

ここでマウントしたディレクトリ下のファイルを更新すれば、それがext4イメージに反映されます。

5. 収録データの改変(5.1.1 の Google app for Android TV を、6.0にコピー)
$ sudo rm /mnt/fugu-mra58k/priv-app/Katniss/*
$ sudo cp -pr ほげほげ/priv-app/Katniss/* /mnt/fugu-mra58k/priv-app/Katniss/
「ほげほげ」は、前回5.1.1から抽出したGoogle app のディレクトリ

6. 修正した結果を元に、sparseイメージを再構築
ext2imgを使う方法と、make_ext4fsを使う方法の2通りあります。ext4がマウントできるLinuxからならext2imgの方が簡単

6A: ext2imgを使う方法
$ sudo umount /mnt/fugu-mra58k
$ ext2simg fugu-mra58k/system.ext4 fugu-mra58k-mod/system.img

6B: make_ext4fsを使う方法
$ make_ext4fs -s -l 1024M -a system fugu-mra58k-mod/system.img /mnt/fugu-mra58k/

-sオプション: sparseイメージの構築(未指定時はext4イメージを作ります)
-lオプション(1024M): イメージファイルのディスク容量
(今回は元のイメージサイズ(system.ext4のファイルサイズ)にあわせました。収録ファイルを増やした場合は容量不足でエラーになることがありますので、そのときは数値を増やします)
-aオプション(system): マウントポイント
第1引数(fugu-mra58k-mod/system.img): 作成するイメージファイル名
第2引数(/mnt/fugu-mra58k/): イメージに収録するファイルの置いてあるディレクトリ

7. sparseイメージをzipファイルに書き戻す
$ (cd fugu-mra58k; zip -u image-fugu-mra58k.zip system.img)

以上で修正作業完了です。あとは、adb 等をつかってこのイメージを書き込めば5.1.1付属の Google app for android TV入りのAndroid 6.0が立ち上がります

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー

読み込み中...