2018年9月20日木曜日

【技術メモ】FiiO X7 MarkII にカスタムROM Fidelizerを焼いた(後編:カスタムROM解析編)

焼くということ
前編ではROM焼きとどんな感じで変わったのか、比較的「やってみた系」でエントリーを書きました。

【技術メモ】FiiO X7 MarkII にカスタムROM Fidelizerを焼いた(前編:カスタムROM焼き編)

後編では実施した解析について少し詳しく書いていこうと思います。

AndroidのカスタムROMについて多少前提知識が必要です。

雑感としては、有料版であっても過去カスタムROMを作ってたときに流行ったTweaksが入ったりしていて、若干古さを感じます。

OS自体が5.1なのと、ハードウェアスペック的に結構貧弱(除くサウンド的な部分)なので仕方ない感じはしますが、それにしてもちょっと気になるところが2-3あって、そのうち修正のRequestしようかなと思います。

音楽プレイヤーなんでまあいいかなぁと思ったり思わなかったりです。

ROMをバラす

Rockchip RK3188なのでこれに準拠した方法でバラします。

Windows、Linuxそれぞれでそれぞれに適したツールがあるのでそれを利用します。なおMacOSは知りません。

基本的にはupdate.imgがバラす対象です。

ここで必要なのは各Imageファイルが得られるかどうかです。


イメージ名 内容 備考
boot.img ブートイメージ。起動中に出る画面の話ではない。 ここがオリジナルと違う場合は起動しなくなることがあるので注意
kernel.img Kernel本体 多分チップメーカー以外ソースコードを持っていないはずなので変わっていることはあまりない。変わっていると二度見する。
system.img プリインアプリやOSの設定が入っている。 大体の場合ext4で作られたディスクイメージ


これらが得られたらあとはそれぞれを比較してその内容を吟味するフェーズです。


FiiO公式とFidelizer PuristROMの違い

ここではFiiO公式 Ver1.0.6とFidelizer PuristROM Ver1.0.6の違いを見てみます。

kernel.imgもboot.imgも変わっていないので、system.imgの中だけ違いが見られれば良さそうです。

公式、Fidelizerどちらもext4でマウントして、全ファイルを別なディレクトリにコピーして、あとはDiffツールあたりを使って両ディレクトリを比較するだけです。

アプリのバージョンやディレクトリの違いあたりは割とどうでもいいので見なかったことにします。興味があれば別途追ってみても良いと思います。

ApolloMusicPlayerの追加なども追加されていますね。これライセンス的に大丈夫なんだろうか。

調査した結果、影響がありそうな本命は
  1. build.prop
  2. audio_effects.conf
の2ファイルのようです。

ざっくり内容の説明はしますが、ファイルの中身を晒してしまうのはちょっと不躾かなと思うのでそのあたりは控えようと思います。ご容赦ください。

build.prop

build.propにはAndroidが動作する上で必要な設定が書かれています。

OSが確保するメモリ、タスクが開放されるタイミング、タッチパネルの反応、ハードウェアアクセラレーションの有無などなどです。

こういう性質のファイルなので、変な設定をしたりするとOSが起動しなくなります。

build.propの変更点
修正されている箇所は
  1. ro.build.display.id で表示されるBuild名にFidelizerが追加されている。
  2. グラフィックアクセラレーション周り。特にEGL周りのアクセラレーションが有効になっているのでNeutronMusicPlayerみたいにEGLでゴリゴリ描画しているアプリケーションは動作が早くなったように感じるかも。
  3. CyanogenModの時代、バッテリーの持ちを左右するのではといわれていた周り。
EGL周りはここで設定しなくても開発者モードから設定出来るので、PuristROM版ではあまり効果はないかもしれないですね。

あと、NeutronMPがEGLでゴリゴリ画面描画してるっていう下りはあくまでも想像です。
細かい所まで解析はしてないですが、ざっくり見た感じではresourceにWedgetくらいしかないのと、画面周りのコードにEGLのWindowSurfaceを取得している部分があったのでそういう感じなのかな、というくらいです。

audio_effects.conf

ファイル名の通りオーディオエフェクトの設定が書かれています。

audio_effects.confの変更点
X7iiには元々ViPER4AndroidのNEONビルド版が入っています。

PuristROMではデフォルトのオーディオエフェクトを削除してこのViPER4Androidを呼び出しています。

ちなみに、FiiO公式のbuild.propに
ro.fiio.disable_sound_effect=true
という設定があるのでこの変更に意味があるのか、ViPER4Androidを敢えて通しているのか意図は正直わかりません。
が、意図的にViPERを通していて、これが有効になっているのだとしたら音が変わるのも頷ける気はします。

国際版ではリリースされていないVer1.0.7JPの存在

Ver1.0.7JPはFiiO社のWebでは公開されておらず、FiiO Japan、つまり日本代理店のWebからのみ辿れる状態です。

これは当然海外の人から探すのは非常に厳しいでしょう。

FidelizerがVer1.0.7JPに対応したPuristROMを作ってくれた

そこで、Fidelizerにコンタクトを取ってみました。

内容を要約すると
日本版ファームウェアで1.0.6の変更に加えて/dataが4GBになるという特殊な変更が入っているけど、PurisROMになったりしない?
という感じです。

無視されるだろうと思っていたので、その間に勝手に1.0.7JPとPuristROMをバラして俺得ROMを作っていたのであまり困らない予定だったのですが。

2日後、Fidelizerから返事が帰ってきました。
ほんとにか!それは知らなかった!
いま作ってるFidelizer8.2が終わったら作ってみるよ!
ここで言っているFidelizer8.2はおそらくこれのことでしょう。

Fidelizer - Fidelizer 8.2 released – Introducing multiple media player applications and resolve adding new network card

そして、これがリリースされた2日後、Fidelizer PuristROM Ver1.0.7JPがリリースされました。

Fidelizer - Fiio X7ii Purist ROM version 1.0.7 JP update with partition mapping update released

マジか...Fidelizer...

Fidelizer Advanced ROMを買ってみた

わざわざPuristROMで対応してくれたのでお礼としてAdvancedROMを買いました。
決済はPayPalです。

購入後、20時間くらいでFidelizerからダウンロードリンクが送られてきました。

早速インストールしてみましたが、4GBストレージに対応されておらず、2GBに戻ってしまったので、已む無くHack。

公式Ver1.0.7JPにAdvancedROMの変更内容を合体させて、Fidelizer AdvancedROM Ver1.0.7JP勝手版を作りました。

で、このときにAdvancedROMが何をやっているのか解析したので、最後にその内容に少し触れておこうと思います。

AdvancedROMのざっくりした内容

有料版の詳細を公開してしまうのは誰にとってもフェアではないので詳細は非公開です。ご容赦ください。

多分、ベースは先行で開発していたiBassoのファームウェアではないかな、という感じです。

build.prop
多くの設定が追加されます。
具体的にはメモリの確保とか開放とか、Kernelに渡す設定まわりです。

一部、携帯電話ではやっちゃいけない部分があるんでそのうち報告しようと思いますが、音楽プレイヤーなら実害はなさそうな気はします。

あと、AdvancedROMからなのかEnhancedROMからなのか解りませんが、何故か自前でいわゆるLinuxの有名なというかもはや標準のサウンドドライバが動作するように設定されています。

元々Androidでも同じサウンドドライバが動作しているので意味があるのかどうかは解りませんが...

理由はいくつか考えられますが、想像の域を出ないので有効無効については触れないでおきます。

X7iiではSRC回避をしている(らしい)のですが何故かこのサウンドドライバにはSecretRabbitCodeを動かしている部分があって、これも正直蛇足なのでは感はあります。

この部分、本当に効果があるのかどうか聴き比べていないので正直わからないです。

が、確かにX7ii上でterminal動かして/procをポチポチみてると一応きちんと動いてるっぽいんで、まっさらなX7iiと並べて聴き比べてみたいなぁ、と思うんですが流石に2台目は欲しくないです。

audio_effect.conf
なにもなくなります。

PuristROMで設定されていたViPER4Androidすら設定されなくなります。

この記述ってアリなんだっけか...Androidのソースコード見てる感じでは問題なさそうだし、エラーも吹いてないから大丈夫なんだと思いますけど。

その代わりにSecretRabbitCodeが動いているみたいなのでどうなんだろう?という感じはします。

与太話

ちなみにsystem.img。rw属性でremountするとエラーになって結局ro属性のエラー時マウントにされてしまいます。
なのでディスクイメージを直接書き換えられないため、自前でイメージ作らなきゃならないです。
まだ試してません。

雑感

そもそも改造行為なので無害とは言いませんが、内容的にはPuristROMはそんなに大きな害はないと思います。

ViPER4Androidの影響なのか、奥行きのある音に感じますしEGLのアクセラレーションが有効になっているのでNutronMPの動きが多少軽くなった気がしますし。

AdvancedROMは各追加設定量が多すぎてが有効なのかどうか判断するのが難しいです。

サウンドドライバ周りは調整幅がありそうなこと、多分効果のなさそうな設定あたりをバシバシ外していってどうなるかなぁという感じです。
うまくいってもいかなくても、絶対に日の目を見ることのないかわいそうなROMになりそうですけど。

珍しく技術メモっぽいこと書いた気がしますね。