Background

昨今は細い (light)フォントが流行っていて、 android アプリの一部にも細いフォントを指定しているのがある。

一方で、日本語フォントは android デフォルトでは「モトヤLマルベリ3 (MotoyaLMaru W3)」である。 丸ゴシック体な上に細いフォントは提供していない。 「游ゴシック」みたいに light/medium/bold の 3 ウェイト提供してくれればいいのだが、 そういうことなく “W3” のみの提供である。

よって最近のアプリで細い英字フォントに通常の太さの日本語フォントが混ざって表示されるという現象が見られる。

Firefox location bar (using MotoyaLMaruW3)
An App Description on Google Play App (using MotoyaLMaruW3)

これに関して、android の標準フォントとして Noto Sans JP を投入することを紹介する。(注:要 root)

Fallback

/system/etc/fallback_fonts.xml というのがあって、ここでフォント指定の「フォールバック」をすることになっている。

ここには、下記のように NotoSansJP-Regular.otf というのが書かれているため、 Noto Sans JP が使われるように見える。

    <family>
        <fileset>
            <file lang="ja">NotoSansJP-Regular.otf</file>
        </fileset>
    </family>

が、標準で入っていた /system/fonts/NotoSansJP-Regular.otf は、特殊な文字が入っているだけの168kB程度のファイルであった。 なので、この記述よりも後ろの下記の内容が有効となるので日本語は特に断りがなければ、 /system/fonts/MTLmr3m.ttf (モトヤLマルベリ3) で表示されるのである。

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

よって、NotoSansJP-*.otf として日本語フォントを送り込み、 fallback_fonts.xml で追加した方のフォントにフォールバックするように設定すれば良い。

Recipe

要 root 。 /system/fonts を編集するので再マウントをするか、 暗黙的に再マウントをしてくれるような CM File Manager などを使用する必要がある。 (説明が煩雑化するので再マウントの方法はここには書かない。)

  1. NotoSansJP-*.otf を取得する。 例えば、github:watiko/fonts-notosansjp から NotoSansJP-{Light,Regular,Bold,Black}.otf を取得する。
  2. /system/fonts/ に上記ファイルを入れる。パーミッションは owner=root(0), group=root(0) で -rw-r--r-- にすること。 このとき既存の /system/fonts/NotoSansJP-Regular.otf は上書きしてしまって良い。
  3. /system/etc/fallback_fonts.xml に上記で追加したフォントへの fallback を記述し、既存の日本語フォントへの fallback を削除する。 例えば、下記のようにする。

    <!-- 既存の日本語フォントへの fallback を削除 -->
    <!--family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
    </family-->
    <!-- ここ以下を追加 -->
    <family>
        <fileset>
            <file lang="ja">NotoSansCJKJP-Light.otf</file>
            <file lang="ja">NotoSansCJKJP-Regular.otf</file>
            <file lang="ja">NotoSansCJKJP-Bold.otf</file>
            <file lang="ja">NotoSansCJKJP-Black.otf</file>
        </fileset>
    </family>
    
  4. /system/etc/fonts.xml に上記で追加したフォントの内容を登録する。 ここで weight なども設定することとなる。 例えば、下記を追加する。

    <family>
        <fileset>
            <file lang="ja">NotoSansCJKJP-Light.otf</file>
            <file lang="ja">NotoSansCJKJP-Regular.otf</file>
            <file lang="ja">NotoSansCJKJP-Bold.otf</file>
            <file lang="ja">NotoSansCJKJP-Black.otf</file>
        </fileset>
    </family>
    
  5. 最後に再起動をする。

Recipe (using TWRM Zip)

TWRM などの ZIP インストールの場合は下記のような感じで:

  • japanese-NotoSans-install.zip
    • META-INF/
      • com/
        • google/
          • android/
            • update-binary
            • updates-script
    • system/
      • etc/
        • fallback_fonts.xml
        • fonts.xml
      • fonts/
        • NotoSansJP-Black.otf
        • NotoSansJP-Bold.otf
        • NotoSansJP-Regular.otf
        • NotoSansJP-Light.otf

updates-script:

ui_print("=== Japanese-NotoSans-install ===");
ui_print("Mounting file system...");
run_program("/sbin/mount", "/system");
ui_print("Installing...");
package_extract_dir("system", "/system");
set_perm(0, 0, 0644, "/system/etc/fonts.xml");
set_perm(0, 0, 0644, "/system/etc/fallback_fonts.xml");
set_perm(0, 0, 0644, "/system/fonts/NotoSansJP-Black.otf");
set_perm(0, 0, 0644, "/system/fonts/NotoSansJP-Bold.otf");
set_perm(0, 0, 0644, "/system/fonts/NotoSansJP-Regular.otf");
set_perm(0, 0, 0644, "/system/fonts/NotoSansJP-Light.otf");
ui_print("Unmounting...");
run_program("/sbin/umount", "/system");
ui_print("all done!");

(追記) github に hammerhead (Nexus 4 2013) 用のを入れておいた。cat-in-136/NotoSansJP-hammerhead

Result

うまく行けば下記のように、細い英字フォントにマッチした和文フォントが表示されるはずだ。

Firefox location bar (using NotoSansJP-Light)
An App Description on Google Play App (using NotoSansJP-Light)

そしてそして、この無駄に font-weight: 300 を設定している このページについても細い英字フォントにマッチした和文フォントが表示されるはずだ。

This page apperance on Firefox using NotoSansJP-Light

Reference