pf部2011年12月勉強会.androidsola

37
Ice Cream Sandwich を動かしてみて気が付いたこと

Upload: akihiro-maeda

Post on 29-Jun-2015

4.746 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: PF部2011年12月勉強会.androidsola

Ice Cream Sandwichを動かしてみて気が付いたこと

Page 2: PF部2011年12月勉強会.androidsola

自己紹介

● twitter : @androidsola

G+ : http://gplus.to/sola

blog : http://blog.sola-dolphin-1.net/

Page 3: PF部2011年12月勉強会.androidsola

ICS の動作を確認した実機

● PandaBoard

● PandaBoard ES

● BeagleBoard

● BeagleBoard-xM

● Snowball

● I.MX53 QSB

● ODROID-T

● Nexus One

Page 4: PF部2011年12月勉強会.androidsola

ICS を動かして気になった事

● software navigation bar

● Tablet/Phone 統合

● SD カードの扱い

● init の変化

● input system の変化

● Linux Kernel への変更

● GPU 対応

Page 5: PF部2011年12月勉強会.androidsola

software navigation bar

Page 6: PF部2011年12月勉強会.androidsola

software navigation bar

● 表示させるにはイカの変更が必要

● Emulator で試す場合

frameworks/base/core/res/res/values/config.xml初期値<bool name="config_showNavigationBar">false</bool>表示させるために変更した後<bool name="config_showNavigationBar">true</bool>

qemu.hw.mainkeys が 1 に設定されて、config_showNavigetionBar の値が false に変更される。emulator で試す場合は 0 に設定する。

Page 7: PF部2011年12月勉強会.androidsola

software navigation bar

● (たぶん)気をつけた方がよいこと

bar を表示すると、 bar を表示する領域のサイズだけ

アプリが表示可能な領域が小さくなる。

Page 8: PF部2011年12月勉強会.androidsola

software navigation bar

例 1 :解像度 720×1280 の端末

ro.sf.lcd_density が 320 の場合( Galaxy Nexus )48×320÷160=96 が縦の 1280 から引かれる。→1184ro.sf.lcd_density が 240 の場合48×240÷160=72 が縦の 1280 から引かれる。→1208ro.sf.lcd_density が 160 の場合48×160÷160=48 が縦の 1280 から引かれる。→1232

引かれる領域

Page 9: PF部2011年12月勉強会.androidsola

software navigation bar

例 2 :解像度 1280×720 の端末

ro.sf.lcd_density が 320 の場合42×320÷160=84 が横の 1280 から引かれる。→1196ro.sf.lcd_density が 240 の場合42×240÷160=63 が横の 1280 から引かれる。→1217ro.sf.lcd_density が 160 の場合42×160÷160=42 が横の 1280 から引かれる。→1238

引かれる領域

Page 10: PF部2011年12月勉強会.androidsola

Tablet/Phone 統合

Page 11: PF部2011年12月勉強会.androidsola

Tablet/Phone 統合

● Tablet と Phone の UI が統合されており、

イカの処理で区別している。

frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java

public void onCreate() { // Pick status bar or system bar. IWindowManager wm = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); try { SERVICES[0] = wm.canStatusBarHide() ? R.string.config_statusBarComponent : R.string.config_systemBarComponent; } catch...

Phone 向け

Tablet 向け

Page 12: PF部2011年12月勉強会.androidsola

Tablet/Phone 統合

● wm.canStatusBarHide() が返す true/false を

決めている場所

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / DisplayMetrics.DENSITY_DEVICE;mStatusBarCanHide = shortSizeDp < 600;mStatusBarHeight = mContext.getResources().getDimensionPixelSize( mStatusBarCanHide ? com.android.internal.R.dimen.status_bar_height : com.android.internal.R.dimen.system_bar_height);

Page 13: PF部2011年12月勉強会.androidsola

Tablet/Phone 統合

● Galaxy Nexus での計算式int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / DisplayMetrics.DENSITY_DEVICE;mStatusBarCanHide = shortSizeDp < 600;

int shortSizeDp = 720 (縦横の小さい方の解像度) * 160 / 320; ( ro.sf.lcd_density の値)mStatusBarCanHide = 360 < 600;

Page 14: PF部2011年12月勉強会.androidsola

Tablet/Phone 統合

● 解像度 800×480 なタブレットの場合の例int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / DisplayMetrics.DENSITY_DEVICE;mStatusBarCanHide = shortSizeDp < 600;

int shortSizeDp = 480 (縦横の小さい方の解像度) * 160 / 120; ( ro.sf.lcd_density の値)mStatusBarCanHide = 640 < 600;

Page 15: PF部2011年12月勉強会.androidsola

SD カードの扱い

● SD カードスロットを持たないターゲット向けに、

内蔵メモリを /sdcard として使う仕組みが入っている。

mount コマンドで /mnt/sdcard のマウント状態を確認root@android:/ # mount/dev/fuse /mnt/sdcard fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

Page 16: PF部2011年12月勉強会.androidsola

内蔵メモリを SD カードとして使う方法

init.rc の on early-init にイカを追記 export EXTERNAL_STORAGE /mnt/sdcard mkdir /mnt/sdcard 0000 system system symlink /mnt/sdcard /sdcard

init.rc の on post-fs-data にイカを追記 mkdir /data/media 0775 media_rw media_rw chown media_rw media_rw /data/media setprop vold.post_fs_data_done 1

init.rc で /system/bin/sdcard を実行service sdcard /system/bin/sdcard /data/media 1023 1023 class late_start

CONFIG_FUSE_FS=y でビルドした kernel を使う

Page 17: PF部2011年12月勉強会.androidsola

init の変化

● Android2.3→4.0 では init にも変化有り。

Snowball で ICS を動かした時にはまった事を紹介。

Page 18: PF部2011年12月勉強会.androidsola

init の変化

● Snowball 固有の設定を書いていた、

init.st-ericsson.rc の内容が反映されなかった。

● init でログを出してみたところ、

init.st-ericsson.rc 自体が読み込まれていなかった。

init.xxxx.rc の xxxx 部分についてcat /proc/cpuinfo で得られる Hardware の値を使用する。Snowball の場合はイカの通り。

Hardware : ST-Ericsson Snowball platform

このうち空白文字までの文字を小文字にしたものが、xxxx の部分となる。

Page 19: PF部2011年12月勉強会.androidsola

init の変化

● init.xxxx.rc の xxxx 部分の決め方に変更有り。

system/core/init/util.cget_hardware_name 関数@@ -439,8 +382,9 @@ if (x) { x += 2; n = 0;- while (*x && !isspace(*x)) {- hardware[n++] = tolower(*x);+ while (*x && *x != '\n') {+ if (!isspace(*x))+ hardware[n++] = tolower(*x); x++; if (n == 31) break; }

Page 20: PF部2011年12月勉強会.androidsola

init の変化

● ICS に対応した init.xxxx.rc の作成

cat /proc/cpuinfo で得られるHardware の値を変換

Hardware : ST-Ericsson Snowball platform

空白を飛ばして大文字を小文字にすると、st-ericssonsnowballplatform となるので、init.st-ericssonsnowballplatform.rc となる。

Page 21: PF部2011年12月勉強会.androidsola

init の変化

● init.st-ericssonsnowballplatform.rc では

読み込まれない原因

system/core/init/init.c を見ると、従来からの仕様 get_hardware_name(hardware, &revision); snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);

tmp は char tmp[32]; で定義。init.st-ericssonsnowballplatform.rc は限界を突破する。

Page 22: PF部2011年12月勉強会.androidsola

init の変化

● 対策として、 Linux Kernel を変更した

● Android 側を修正して、 AOSP にコミットしたい内容 ...

arch/arm/mach-ux500/board-mop500.c変更前MACHINE_START(SNOWBALL, "ST-Ericsson Snowball platform")変更後MACHINE_START(SNOWBALL, "ST-Ericsson")

以上のようにして、init.st-ericsson.rc を用意するようにした。

Page 23: PF部2011年12月勉強会.androidsola

input system の変化

Page 24: PF部2011年12月勉強会.androidsola

input system の変化

● ICS からは、

Input Device Configuration Files が存在する。

http://goo.gl/tPP8p

(ソースを調べた後で気が付いた ... )

idc ファイルはイカの順に探される。(=優先度) /system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc /data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc /system/usr/idc/Vendor_XXXX_Product_XXXX.idc /data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc /system/usr/idc/DEVICE_NAME.idc /data/system/devices/idc/DEVICE_NAME.idc

Page 25: PF部2011年12月勉強会.androidsola

input system の変化

● idc ファイルの内容から deviceType を判定してる箇所

frameworks/base/services/input/InputReader.cppif (getDevice()->getConfiguration().tryGetProperty(String8("touch.deviceType"), deviceTypeString)) { if (deviceTypeString == "touchScreen") { mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN; } else if (deviceTypeString == "touchPad") { mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD; } else if (deviceTypeString == "pointer") { mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER; } else if (deviceTypeString != "default") { LOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string()); }}

Page 26: PF部2011年12月勉強会.androidsola

input system の変化

● タッチパネルを使いたい時の idc ファイルの内容

touch.deviceType = touchScreen

の 1 行があれば良い。

Page 27: PF部2011年12月勉強会.androidsola

input system の変化

● idc ファイル命名時の注意事項

アルファベット、数字、「 - 」、「 _ 」はそのまま使用。その他は、「 _ 」に変換する。

eGalax Inc. USB TouchControllerという名前の場合、eGalax_Inc__USB_TouchController.idcとなる。

Page 28: PF部2011年12月勉強会.androidsola

input system の変化

● マウスに対応

Android2.3 までお世話になっていた、

マウスカーソルのパッチは不要に。

リソース置き場frameworks/base/core/res/res/drawable-xhdpi/pointer_arrow.pngframeworks/base/core/res/res/drawable-hdpi/pointer_arrow.pngframeworks/base/core/res/res/drawable-mdpi/pointer_arrow.png

Page 29: PF部2011年12月勉強会.androidsola

Linux Kernel への変更

● ICS 向けに必要な変更はあるのか?

調査してみた。

Page 30: PF部2011年12月勉強会.androidsola

Linux Kernel への変更

● kernel config でイカを確認

CONFIG_FB_EARLYSUSPEND を有効

CONFIG_FRAMEBUFFER_CONSOLE を無効

厳密には Honeycomb から必要な変更

ソースは Emulator 向け kernel の変更履歴 

Page 31: PF部2011年12月勉強会.androidsola

GPU 対応

● Gingerbread で使えていたライブラリを

ICS で使うと落ちて起動しない。

現状は GPU を使わないようにして起動させている。

Linaro や CyanogenMod で対応している内容。

Page 32: PF部2011年12月勉強会.androidsola

GPU 対応

frameworks/base/core/java/android/app/ActivityManager.javastatic public boolean isHighEndGfx(Display display) {/* MemInfoReader reader = new MemInfoReader(); reader.readMemInfo(); if (reader.getTotalSize() >= (512*1024*1024)) { // If the device has at least 512MB RAM available to the kernel, // we can afford the overhead of graphics acceleration. return true; } Point p = new Point(); display.getRealSize(p); int pixels = p.x * p.y; if (pixels >= (1024*600)) { // If this is a sufficiently large screen, then there are enough // pixels on it that we'd really like to use hw drawing. return true; } */ return false;}

Page 33: PF部2011年12月勉強会.androidsola

GPU 対応

frameworks/base/core/java/android/view/HardwareRenderer.java/** * A process can set this flag to false to prevent the use of hardware * rendering. * * @hide *///public static boolean sRendererDisabled = false;public static boolean sRendererDisabled = true;

Page 34: PF部2011年12月勉強会.androidsola

GPU 対応

● BeagleBoard/BeagleBoard-xM で動作させた時は

今のパッチは無くても良かった。

厳密には解像度が 640×480 の時は動いた。

1280×720 等の高解像度にすると、

Out of Memory が出てアプリが落ちた。

Page 35: PF部2011年12月勉強会.androidsola

GPU 対応

● GPU 無効な状態で起動させると、

色がおかしい状態で起動するものがあった。

→ODROID-T

Page 36: PF部2011年12月勉強会.androidsola

gralloc の変更

● 対策

hardware/libhardware/modules/gralloc/framebuffer.cppfb_device_open@@ -335,7 +339,7 @@ if (status >= 0) { int stride = m->finfo.line_length / (m->info.bits_per_pixel >> 3); int format = (m->info.bits_per_pixel == 32)- ? HAL_PIXEL_FORMAT_RGBX_8888+ ? (m->info.red.offset ? HAL_PIXEL_FORMAT_BGRA_8888 : HAL_PIXEL_FORMAT_RGBX_8888) : HAL_PIXEL_FORMAT_RGB_565; const_cast<uint32_t&>(dev->device.flags) = 0; const_cast<uint32_t&>(dev->device.width) = m->info.xres;

Page 37: PF部2011年12月勉強会.androidsola

特定のターゲット用の gralloc 作成

● ODROID-T の場合の例

device/sec/odroidt/gralloc を作成hardware/libhardware/modules/gralloc からのコピーに対して、framebuffer.cpp を修正したもの。

Android.mk の修正-LOCAL_MODULE := gralloc.default+LOCAL_MODULE_TAGS := optional+LOCAL_MODULE := gralloc.hkdkc110 LOCAL_CFLAGS:= -DLOG_TAG=\"gralloc\"

device/sec/odroidt/device.mk に追記PRODUCT_PACKAGES += gralloc.hkdkc110