2011年05月12日

Android 2.3(Gingerbread)でアイコンやフォントの表示が小さくなる件(解決)

前回(KZM-A9-DualでAndoridのGingerbreadを動かす最短の手順)の記事で、画面のアイコンやフォントの表示がいままでよりも小さくなってしまっていました。これを調べていままでと同じようにできるようにしました。

(English version of this page)



画面の表示がいままでより小さい?

Froyoの画面

DSC00257

Gingerbreadの画面

DSC00340

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と同等の表示になりました。

DSC00343DSC00342

後で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


トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード