2011年05月12日
Android 2.3(Gingerbread)でアイコンやフォントの表示が小さくなる件(解決)
前回(KZM-A9-DualでAndoridのGingerbreadを動かす最短の手順)の記事で、画面のアイコンやフォントの表示がいままでよりも小さくなってしまっていました。これを調べていままでと同じようにできるようにしました。
画面の表示がいままでより小さい?
Froyoの画面
Gingerbreadの画面
Gingerbreadにしたらアイコンやフォントが小さくなってしまいました。ちょっと見にくいです。
Nexus OneではFroyoからGingerbreadにアップデートしてもこのような変化はありませんでした。KZM-A9-DualでもNexus Oneと同じような大きさの表示にしたいです。
Nexus Oneと起動ログを比較する
まず最初に怪しいと思うのは、kernelのフレームバッファデバイスから情報を取得しているところです。これはSurfaceFlingerのgrallocです。
以下のコマンドで、Nexus OneとKZM-A9-Dualのlogcatのログをファイルに保存して比較してみます。
$ adb logcat -d > logcat.txt
grallocでログを検索してみます。
Nexus Oneのログ
I/SurfaceFlinger( 96): SurfaceFlinger is starting I/SurfaceFlinger( 96): SurfaceFlinger's main thread ready to run. Initializing graphics H/W... I/qsd8k.gralloc( 96): using (fd=24) I/qsd8k.gralloc( 96): id = msmfb I/qsd8k.gralloc( 96): xres = 480 px I/qsd8k.gralloc( 96): yres = 800 px I/qsd8k.gralloc( 96): xres_virtual = 480 px I/qsd8k.gralloc( 96): yres_virtual = 1600 px I/qsd8k.gralloc( 96): bpp = 32 I/qsd8k.gralloc( 96): r = 0:8 I/qsd8k.gralloc( 96): g = 8:8 I/qsd8k.gralloc( 96): b = 16:8 I/qsd8k.gralloc( 96): width = 48 mm (254.000000 dpi) I/qsd8k.gralloc( 96): height = 80 mm (254.000000 dpi) I/qsd8k.gralloc( 96): refresh rate = 60.00 Hz
KZM-A9-Dualのログ
I/SurfaceFlinger( 80): SurfaceFlinger is starting I/SurfaceFlinger( 80): SurfaceFlinger's main thread ready to run. Initializing graphics H/W... I/gralloc ( 80): using (fd=24) I/gralloc ( 80): id = EMXX FB I/gralloc ( 80): xres = 800 px I/gralloc ( 80): yres = 480 px I/gralloc ( 80): xres_virtual = 800 px I/gralloc ( 80): yres_virtual = 5184 px I/gralloc ( 80): bpp = 24 I/gralloc ( 80): r = 0:8 I/gralloc ( 80): g = 8:8 I/gralloc ( 80): b = 16:8 I/gralloc ( 80): width = 127 mm (160.000000 dpi) I/gralloc ( 80): height = 76 mm (160.421051 dpi) I/gralloc ( 80): refresh rate = 60.00 Hz
yres_virtualの値とwidth, heightとdpiの値が違っています。
試しにgrallocの中を細工して、yres_virtualにyres*2を入れるようにしてみました。すると、表示の再描画がおかしくなったのですが、アイコンやフォントのサイズは変わりませんでした。
yres_virtualは元に戻して、今度はwidthとheightの値を細工してNexus Oneと同じ254dpiになるようにしてみました。しかし結果は何も変わりませんでした。この部分は無関係のようです。
Nexsus Oneとsystem propertyを比較する
今度はsystem propertyの値をファイルに保存して比較してみます。
$ adb shell getprop > prop.txt
それらしいものを見つけました。以下の項目はNexus OneにあるけれどもKZM-A9-Dualにはありません。
[ro.sf.lcd_density]: [240]
ソースコードを検索すると、このsystem propertyの値は以下のところで参照しています。
- frameworks/base/services/surfaceflinger/DisplayHardwareDisplayHardware.cpp
- frameworks/base/core/java/android/util/DisplayMetrics.java
Nexus Oneの場合は
device/htc/passion/passion.mk
でこのsystem propertyの設定をしています。
本来ならば、deviceの下に同じようなディレクトリを作るのですが、とりあえずはターゲットのルートディレクトリにあるdefault.propに書いてみました。
/default.prop
ro.sf.lcd_density=240
これで起動したらうまくいきました! Nexus Oneと同等の表示になりました。
後でKZM-A9-DualのFroyo(ルネサスさんのEMMA Mobile評価ボード用のBSPから移植したもの)を見てみたら、system.propに ro.sf.lcd_density = 240 が書いてありました。
おまけ
Gingerbreadになって今までよりも一層表示にGPUを活用するようになっています。
しかし今の段階ではKZM-A9-Dualボードでまだ3Dのアクセラレータのライブラリを組み込んでいません。そのため表示はもっさりです。
設定を変更して、画面遷移のときのアニメーションを止めると少し快適になります。
Settingsのアプリで
Display > Animation > No Animations