PF部2011年12月勉強会.androidsola

  • 4,556 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,556
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
39
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Ice Cream Sandwichを動かしてみて気が付いたこと
  • 2. 自己紹介● twitter : @androidsola G+ : http://gplus.to/sola blog : http://blog.sola-dolphin-1.net/
  • 3. ICS の動作を確認した実機● PandaBoard● PandaBoard ES● BeagleBoard● BeagleBoard-xM● Snowball● I.MX53 QSB● ODROID-T● Nexus One
  • 4. ICS を動かして気になった事● software navigation bar● Tablet/Phone 統合● SD カードの扱い● init の変化● input system の変化● Linux Kernel への変更● GPU 対応
  • 5. software navigation bar
  • 6. software navigation bar● 表示させるにはイカの変更が必要frameworks/base/core/res/res/values/config.xml初期値<bool name="config_showNavigationBar">false</bool>表示させるために変更した後<bool name="config_showNavigationBar">true</bool>● Emulator で試す場合qemu.hw.mainkeys が 1 に設定されて、config_showNavigetionBar の値が false に変更される。emulator で試す場合は 0 に設定する。
  • 7. software navigation bar● (たぶん)気をつけた方がよいこと bar を表示すると、 bar を表示する領域のサイズだけ アプリが表示可能な領域が小さくなる。
  • 8. 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 引かれる領域
  • 9. 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 引かれる領域
  • 10. Tablet/Phone 統合
  • 11. Tablet/Phone 統合● Tablet と Phone の UI が統合されており、 イカの処理で区別している。frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.javapublic void onCreate() { // Pick status bar or system bar. IWindowManager wm = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); try { SERVICES[0] = wm.canStatusBarHide() Phone 向け ? R.string.config_statusBarComponent : R.string.config_systemBarComponent; } catch... Tablet 向け
  • 12. Tablet/Phone 統合● wm.canStatusBarHide() が返す true/false を 決めている場所frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.javaint 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);
  • 13. 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;
  • 14. 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;
  • 15. SD カードの扱い● SD カードスロットを持たないターゲット向けに、 内蔵メモリを /sdcard として使う仕組みが入っている。mount コマンドで /mnt/sdcard のマウント状態を確認root@android:/ # mount/dev/fuse /mnt/sdcard fuserw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
  • 16. 内蔵メモリを SD カードとして使う方法init.rc の on early-init にイカを追記 export EXTERNAL_STORAGE /mnt/sdcard mkdir /mnt/sdcard 0000 system system symlink /mnt/sdcard /sdcardinit.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 1init.rc で /system/bin/sdcard を実行service sdcard /system/bin/sdcard /data/media 1023 1023 class late_startCONFIG_FUSE_FS=y でビルドした kernel を使う
  • 17. init の変化● Android2.3→4.0 では init にも変化有り。 Snowball で ICS を動かした時にはまった事を紹介。
  • 18. 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 の部分となる。
  • 19. 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; }
  • 20. init の変化● ICS に対応した init.xxxx.rc の作成cat /proc/cpuinfo で得られるHardware の値を変換Hardware : ST-Ericsson Snowball platform空白を飛ばして大文字を小文字にすると、st-ericssonsnowballplatform となるので、init.st-ericssonsnowballplatform.rc となる。
  • 21. 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 は限界を突破する。
  • 22. init の変化● 対策として、 Linux Kernel を変更したarch/arm/mach-ux500/board-mop500.c変更前MACHINE_START(SNOWBALL, "ST-Ericsson Snowball platform")変更後MACHINE_START(SNOWBALL, "ST-Ericsson")以上のようにして、init.st-ericsson.rc を用意するようにした。● Android 側を修正して、 AOSP にコミットしたい内容 ...
  • 23. input system の変化
  • 24. 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
  • 25. 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()); }}
  • 26. input system の変化● タッチパネルを使いたい時の idc ファイルの内容 touch.deviceType = touchScreen の 1 行があれば良い。
  • 27. input system の変化● idc ファイル命名時の注意事項アルファベット、数字、「 - 」、「 _ 」はそのまま使用。その他は、「 _ 」に変換する。eGalax Inc. USB TouchControllerという名前の場合、eGalax_Inc__USB_TouchController.idcとなる。
  • 28. 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
  • 29. Linux Kernel への変更● ICS 向けに必要な変更はあるのか? 調査してみた。
  • 30. Linux Kernel への変更● kernel config でイカを確認 CONFIG_FB_EARLYSUSPEND を有効 CONFIG_FRAMEBUFFER_CONSOLE を無効 厳密には Honeycomb から必要な変更 ソースは Emulator 向け kernel の変更履歴 
  • 31. GPU 対応● Gingerbread で使えていたライブラリを ICS で使うと落ちて起動しない。 現状は GPU を使わないようにして起動させている。 Linaro や CyanogenMod で対応している内容。
  • 32. 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 wed really like to use hw drawing. return true; } */ return false;}
  • 33. 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;
  • 34. GPU 対応● BeagleBoard/BeagleBoard-xM で動作させた時は 今のパッチは無くても良かった。 厳密には解像度が 640×480 の時は動いた。 1280×720 等の高解像度にすると、 Out of Memory が出てアプリが落ちた。
  • 35. GPU 対応● GPU 無効な状態で起動させると、 色がおかしい状態で起動するものがあった。 →ODROID-T
  • 36. 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;
  • 37. 特定のターゲット用の 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