2019年06月19日

FireHD10 解明されてこなかったフォント変更の謎を暴いてみた!?

Kindle Fire HD 10のフォント変更に関するXDAでの話題は極めて少なく、その少ない情報にしてもFireロゴループを招く(リカバリーモードから起動して最新アップデートをsideload※1する以外に復旧する手段の無い)いい加減な情報だけでした。

※1 sideloadとは、アプリケーションストアを通じてアプリの配布や管理を行っているシステムにおいて、正規のアプリケーションストアを経由せずにファームウェアを直接入手してインストールすることを意味する。

あたしは3度もその情報に踊らされました。(*´Д`)

そんな中、老体に鞭を打ちながら調べ続けてみると、2か月近くかかってようやくその闇に光を当てることができました。

本日はその情報のお披露目です。(^^)/

fontsの闇に隠されたものとは(^^)↓

・/system/fontsというフォルダは/mnt/sqfs/fontsにシンボリックリンクされている*2
・/mnt/sqfsは/dev/block/loop0をsquashfsとしてマウントしている*3
・/mnt/sqfs/fontsというフォルダは/system/sqfs/container.sqfsをマウントしたもの
・container.sqfsとは圧縮された読み取り専用のSquashFSイメージである
・つまりは/dev/block/loop0というのはcontainer.sqfsそのものか!?

※2 「ls -l /system」で容易に確認できます。
※3 「cat /proc/mounts」で確認できます。

これだけわかればフォント変更は可能です。(*^-^*)

簡単にフォント変更できるようにしてみました。(^^)↓

Gothic->Mincho->Gothicに変更する動画です。

フォント変更の詳細は下記をご覧ください。(^^)↓

@SquashFSって何か?
ASquadhFSを扱える環境を構築する
Bcontainer.sqfsの内部を知る
C好みのfontsにした世界に一つだけの新container.sqfsを作る
D新container.sqfsを本体に組込む

@SquashFSって何か?

Wikipediaによると?

SquashFS (.sfs) はLinux向けの 圧縮された読み込み専用ファイルシステムである。SquashFSはファイル、inodeとディレクトリを圧縮し、高圧縮のためブロックサイズを1024KBまでサポートする。SquashFSファイルシステムにアクセスするための(GPLでライセンスされた)フリーソフトウェアもSquashFSと呼ばれる。
SquashFSは低いオーバーヘッドが要求され、ブロックデバイスやメモリの制限が厳しい(組み込みシステムのような)システムを対象とした汎用読み取り専用ファイルシステムである。SquashFSにLZMA圧縮をもたらすプロジェクトもあるが、標準的なバージョンのSquashFSはgzip圧縮を使っている。

Kindle Fire HD 10では、fontsフォルダ以下に100個を超えるフォントファイルを擁するSquashFSとして実装しています。

container.sqfs自体は、単純に考えればfontsフォルダを圧縮したもので、フォントを追加・削除するには直接は出来ないので、ファイルシステムとして復元してその中にフォントを追加・削除して新たにSquashFSとして作成することになります。

ASquadhFSを扱える環境を構築する

LinuxターミナルとしてはTermuxとUserLandが使えそうですが、Termuxには「mksquashfs」も「unsquashfs」も存在しないし、「squashfs-tools」というパッケージも提供されていないので、必然的にUserLandをインストールしてLinuxディストリビューションの「Debian」をインストールして「squashfs-tools」というパッケージを追加して使うようになります。

ではUserLandというアプリをGoogle Playからインストールして操作環境を整えましょう。

UserLand.png

起動画面です。

Screenshot_2019-06-09-09-35-56.png

上から3番目のDebianをタップしてダウンロードと環境設定を開始します。

login.png

ユーザー名とパスワードを入力してcontinueで続けます。

ssh.png

SSHでcontinueで続けます。

ログインしたら以下のコマンドを投入します。

sudo apt update」パッケージの更新リストを取得
sudo apt upgrage」パッケージをアップデート
date」日付確認
sudo dpkg-reconfigure tzdata」タイムゾーンの再設定
6」アジア
79」東京

Screenshot_2019-06-09-09-55-04.png

では、SquashFSツールをダウンロードします。

sudo apt install squashfs-tools

ttol.png

以上で「mksquashfs」と「unsquashfs」コマンドが使えるようになります。

Bcontainer.sqfsの内部を知る

UserLandのDebianからホストマシンであるKindle Fire HD 10のファイルシステムにアクセスするには、/host-rootfsからアクセスできますし、/sdcardからは直接内部ストレージのダウンロードフォルダにアクセスできます。

container.sqfsを解析するには、UserLandを起動して、/host-rootfs/system/sqfs/container.sqfsをカレントフォルダにコピーします。

sudo cp /host-rootfs/system/sqfs/container.sqfs .
ls -l

ls.png

unsquashfsコマンドを使ってcontainer.sqfsがどんなイメージなのかを教えてもらいましょう。

sudo unsquashfs -s container.sqfs

03.png
この情報から分かることは?

・SQUASHFS 4:0の有効なスーパーブロックである
・最終更新日時は、Thu May 16 01:30:14 2019
・ファイルサイズは、87026.97 Kbytes (84.99 Mbytes)
・圧縮形式は lz4で、高圧縮オプション-Xhcが指定されている
・ブロックサイズは、32768
・ファイルシステムはNFS経由でエクスポート可能
・iノードは圧縮されている
・データは圧縮されている
・fragmentsは圧縮されている
・always-use-fragmentsオプションが指定されていない
・Xattrは圧縮されている
・重複が削除された
・fragmentsの数は、18
・inodesの数は、164
・idsの数は、1

ということで、ヘルプ情報(mksquashsf -help)から判断すると?

container.sqfsと同じ形式でSquashFSイメージを作成するには、-compと-bと-all-rootと-Xhcを指定する必要があることが分かります。

C好みのfontsにした世界に一つだけの新container.sqfsを作る

ではcontainer.sqfsを復元します。

sudo unsquashfs container.sqfs
ls -l

002.png

カレントフォルダにsquashfs-rootというフォルダが出来て、その中にはfontsというフォルダがあり、その中にたくさんのフォントが復元されていることが分かります。

削除して良さそうフォントは次の通りです。

STBShusongRegular.ttf
STShusongBold.ttf
TsukuMinPr5-Bold.ttf
TsukuMinPr5-Medium.ttf
NotoSansJP-Regular.otf
DroidSansFallback.ttf
合計57.8MBを削除

どうしてこれらを削除して良いと思ったか?

・ST*.ttfとTsukuMinPr5-*.ttfは、そもそもfonts.xmlでは使用されていない
・NotoSansJP-Regular.otfはMediumを代用する
・DroidSansFallback.ttfは中華フォントだから

あたしの場合はGoogle Fontsの日本語正式サポート8書体とあおぞら明朝を追加しました。

AozoraMincho-bold.ttf
AozoraMinchoMedium.ttf
KosugiMaru-Regular.ttf
Kosugi-Regular.ttf
MPLUS1p-Bold.ttf
MPLUS1p-Medium.ttf
MPLUSRounded1c-Bold.ttf
MPLUSRounded1c-Medium.ttf
NotoSansJP-Bold.otf
NotoSansJP-Medium.otf
NotoSerifJP-Bold.otf
NotoSerifJP-Medium.otf
SawarabiGothic-Regular.ttf
SawarabiMincho-Regular.ttf
合計53.6MBを追加

削除と追加が終わったら、次のコマンドでフォントのパーミッションを変更しておきましょう。

sudo chmod 644 squashfs-root/fonts/*

世界にひとつのnewcontainer.sqfsを作成するには次のコマンドを叩きます。

sudo mksquashfs squasfs-root newcontainer.sqfs -comp lz4 -Xhc -b 32768 -all-root

new.png

newcontainer.sqfsが作成されました。

ここで気を付けるのは、container.sqfsはファイルシステムsquashfsとしてリードオンリーでマウントされていたということ。

少なくとも、オリジナルのcontainer.sqfs以下のサイズにして置き換えるのが安全だと思いますよ。

D新container.sqfsを本体に組込む

UserLandのDebianで作成したnewcontainer.sqfsは、/sdcard/downloadなどにコピーして置きましょう。

sudo cp newcontainer.sqfs /sdcard/download

これで後はパソコンとデバッグ接続してadbから置換え作業を行います。

・kindle_fire_usb_driver.zipダウンロードサイト。
・adb-setup-1.4.3.exeのダウンロードサイト
・mtk-su_r16.zipのダウンロードサイト

・adbはc:\adbにインストールし、そこにmtk-su_r16.zipを解凍したarm64フォルダ内のmtk-suを入れておく。

cd \adb
adb devices
接続を確認したら
adb push mtk-su /data/local/tmp
adb shell
cd /data/local/tmp
chmod 755 mtk-su
./mtk-su
UID=0を確認したら
mount -o remount -rw /system
rm /system/sqfs/container.sqfs
cp /sdcard/download/newcontainer.sqfs /system/sqfs/container.sqfs
chmod 644 /system/sqfs/container.sqfs
ls -l /system/sqfs/container.sqfs
きちんとファイルの存在とパーミッションを確認したら
reboot

これでcontainer.sqfsの置換えは完了です。

フォントの変更は/system/etc/fonts.xmlを編集して差し替えます。

Android 5.1のフォントを決定しているのは、/system/etc内に存在する「fallback_fonts.xml」と「fonts.xml」かとか云われてきましたが、Kindle Fire HD 10(2017以降)の日本語設定に関しては影響するのは「fonts.xml」だけでした。

具体的には?
<family lang="ja">
<font weight="400" style="normal">NotoSansJP-Regular.otf</font>
<font weight="300" style="normal">NotoSansJP-Light.otf</font>
</family>
<family lang="ja">
<font weight="400" style="normal">MTLmr3m.ttf</font>
</family>
だけでした。

赤字部分のフォント名を使いたいものに変えるだけです。

編集したものをnewfonts.xmlとしたら

adbツールはc:\adbに、そこにArm64のmtk-suとnewfonts.xmlを入れているものと仮定します。

cd \adb
adb devices
接続を確認したら
adb push mtk-su /data/local/tmp
adb push newfonts.xml /data/local/tmp
adb shell
cd /data/local/tmp
chmod 755 mtk-su
./mtk-su
UID=0を確認したら
mount -o remount -rw /system
rm /system/etc/fonts.xml
cp newfonts.xml /system/etc/fonts.xml
chmod 644 /system/etc/fonts.xml
ls -l /system/etc/fonts.xml
きちんとファイルの存在とパーミッションを確認したら
reboot

これでfonts.xmlの置換えは完了です。

やるなら自己責任でお願いします。

以上、参考まで。

posted by 63歳で再就職した生涯現役のシステムエンジニア。 at 01:23| 山口 ☁| Comment(0) | KindleFireHD10 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]