Androidを英語設定にしたまま日本語をきれいなフォントで表示する

2016/05/26 追記

シンタックスハイライトとか要らんやろみたいなあたりをどうにかしたり常識の記述をどうにかした.読み直すとパーミッションnoobだったためなのか,chmod 777とかやってて完全にガバガバなのでもう少しどうにかならんかったのかという感じです.つか書いてからもう2年弱経ってるので信用しないほうが良いです.
追記ここまで.



お元気でしょうか
私は死んでます

久しぶりにこういう記事書くので緊張している

そもそも

英語を勉強している人に携帯を英語表記に設定している人が多かったのでまねしようとしたら,日本語フォントが中華フォントになった

しかし,Androidに対する知見が少ないために,元のフォントに戻す方法を知らなかったので調べた

手順

前提

  • root権限取得済み
  • adb shellを使える状態
  • 2014/11/11現在の情報 今後xmlファイルの内容が変更される可能性がある

環境として Galaxy Nexus(SC-04D)/ParanoidAndroid 4.6-BETA6 を用いた.

前座
Androidがフォントの読み込む際,優先順位は

/system/etc/fallback_font.xml

に記述されている順である.
システム言語が英語に設定されている場合,最下部には

<family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

と書いてある.通常,日本語設定では

<file lang="ja">MTLmr3m.ttf</file>

が読まれ,日本語はきれいなモトヤLマルベリ3等幅でレンダリングされる.
しかし,英語設定の場合ではその上の

<file>DroidSansFallback.ttf</file>

が読まれ,クソみたいなフォントでレンダリングされる.
今回はこの記述を改変する.

リマウント
通常ではAndroidの/systemは以下のパーミッションでマウントされる.

$ ls -l
...
drwxr-xr-x root root <タイムスタンプ> system
...

そこで,

$ su
# mount -o rw,remount -t ext4 /dev/block/foobar/system /system

これで/systemをいじれるようになった.
なお,ファイルシステムおよびfoobarの部分は引数なしのmountで確認できる.

この状態で放置するのはかなり恐ろしいことのような気がする.インターネット接続を切断しておいたほうが良いかもしれない.

ファイルいじり
目標のファイルは/system/etcにある.

# chmod 777 /system/etc

を叩いて/system/etcを読み書きできるようにする.モード指定は755でも差支えないだろう.
ちなみにadb shellでは文字列によるモード指定は使えないようである.*1

次に目標のファイルをPC上に持ってくる.別のコマンドプロンプト

>adb pull /system/etc/fallback_fonts.xml

を叩けば,adbを動かしているフォルダ(この環境ではsdk/platform-tools)にファイルがコピーされる.
これをエディタで開いて最下部を見ると,冒頭で書いたようになっている.

<family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

これを,

<family>
        <fileset>
            <file>MTLmr3m.ttf</file>
        </fileset>
    </family>
    <family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

とすれば,モトヤマルベリがDroidSansFallbackよりも先に読み込まれる.

後片付け
先ほど編集したファイルを元の場所に戻す.コマンドプロンプトで,

>adb push fallback_fonts.xml /system/etc

とした後,ファイルの属性を整える.

# chmod 644 /system/etc/fallback_fonts.xml
# chown root.root /system/etc/fallback_fonts.xml

/system/etcも元に戻す.

# chmod 755 /system/etc

再起動

# sync
# reboot
終了

調べるのにめっちゃ時間がかかった
2年位前まではfallback_fontsは言語の種類だけあったらしい(言語設定によって変わっていた?)が,今は一つのファイルに集約されているので混乱した
ちなみにキャリア公式のロムなら/system/vendor/の中にもあるらしく,そこも書き換えなければならないらしいのでめんどい
ここまでするならむしろ普通に英語勉強したほうが良い