Ice Cream Sandwich
を動かしてみて気が付いたこと
自己紹介
●
    twitter : @androidsola
    G+     : http://gplus.to/sola
    blog   : http://blog.sola-dolphin-1.net/
ICS の動作を確認した実機
●   PandaBoard
●   PandaBoard ES
●   BeagleBoard
●   BeagleBoard-xM
●   Snowball
●   I.MX53 QSB
●   ODROID-T
●   Nexus One
ICS を動かして気になった事
●   software navigation bar
●   Tablet/Phone 統合
●   SD カードの扱い
●   init の変化
●   input system の変化
●   Linux Kernel への変更
●   GPU 対応
software navigation bar
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 に設定する。
software navigation bar
●   (たぶん)気をつけた方がよいこと
    bar を表示すると、 bar を表示する領域のサイズだけ
    アプリが表示可能な領域が小さくなる。
software navigation bar
例 1 :解像度 720×1280 の端末

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

                引かれる領域
software navigation bar
例 2 :解像度 1280×720 の端末

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

          引かれる領域
Tablet/Phone 統合
Tablet/Phone 統合
●   Tablet と Phone の UI が統合されており、
    イカの処理で区別している。
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI
Service.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()                 Phone 向け
                ? R.string.config_statusBarComponent
                : R.string.config_systemBarComponent;
    } catch...                                             Tablet 向け
Tablet/Phone 統合
●   wm.canStatusBarHide() が返す true/false を
    決めている場所
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWi
ndowManager.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);
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;
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;
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_permiss
ions,allow_other 0 0
内蔵メモリを 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 を使う
init の変化
●   Android2.3→4.0 では init にも変化有り。
    Snowball で ICS を動かした時にはまった事を紹介。
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 の部分となる。
init の変化
●   init.xxxx.rc の xxxx 部分の決め方に変更有り。
system/core/init/util.c
get_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;
             }
init の変化
●   ICS に対応した init.xxxx.rc の作成
cat /proc/cpuinfo で得られる
Hardware の値を変換

Hardware : ST-Ericsson Snowball platform

空白を飛ばして大文字を小文字にすると、
st-ericssonsnowballplatform となるので、
init.st-ericssonsnowballplatform.rc となる。
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 は限界を突破する。
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 にコミットしたい内容 ...
input system の変化
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
input system の変化
●   idc ファイルの内容から deviceType を判定してる箇所
frameworks/base/services/input/InputReader.cpp
if (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());
    }
}
input system の変化
●   タッチパネルを使いたい時の idc ファイルの内容
    touch.deviceType = touchScreen
    の 1 行があれば良い。
input system の変化
●   idc ファイル命名時の注意事項
アルファベット、数字、「 - 」、「 _ 」はそのまま使用。
その他は、「 _ 」に変換する。

eGalax Inc. USB TouchController
という名前の場合、
eGalax_Inc__USB_TouchController.idc
となる。
input system の変化
●   マウスに対応
    Android2.3 までお世話になっていた、
    マウスカーソルのパッチは不要に。
リソース置き場
frameworks/base/core/res/res/drawable-xhdpi/pointer_arrow.png
frameworks/base/core/res/res/drawable-hdpi/pointer_arrow.png
frameworks/base/core/res/res/drawable-mdpi/pointer_arrow.png
Linux Kernel への変更
●   ICS 向けに必要な変更はあるのか?
    調査してみた。
Linux Kernel への変更
●   kernel config でイカを確認
    CONFIG_FB_EARLYSUSPEND を有効
    CONFIG_FRAMEBUFFER_CONSOLE を無効


    厳密には Honeycomb から必要な変更
    ソースは Emulator 向け kernel の変更履歴 
GPU 対応
●   Gingerbread で使えていたライブラリを
    ICS で使うと落ちて起動しない。
    現状は GPU を使わないようにして起動させている。
    Linaro や CyanogenMod で対応している内容。
GPU 対応
frameworks/base/core/java/android/app/ActivityManager.java
static 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;
}
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;
GPU 対応
●   BeagleBoard/BeagleBoard-xM で動作させた時は
    今のパッチは無くても良かった。
    厳密には解像度が 640×480 の時は動いた。
    1280×720 等の高解像度にすると、
    Out of Memory が出てアプリが落ちた。
GPU 対応
●   GPU 無効な状態で起動させると、
    色がおかしい状態で起動するものがあった。
    →ODROID-T
gralloc の変更
●   対策
hardware/libhardware/modules/gralloc/framebuffer.cpp
fb_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;
特定のターゲット用の 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

PF部2011年12月勉強会.androidsola

  • 1.
  • 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.
  • 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 から引かれる。 →1184 ro.sf.lcd_density が 240 の場合 48×240÷160=72 が縦の 1280 から引かれる。 →1208 ro.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 から引かれる。 →1196 ro.sf.lcd_density が 240 の場合 42×240÷160=63 が横の 1280 から引かれる。 →1217 ro.sf.lcd_density が 160 の場合 42×160÷160=42 が横の 1280 から引かれる。 →1238 引かれる領域
  • 10.
  • 11.
    Tablet/Phone 統合 ● Tablet と Phone の UI が統合されており、 イカの処理で区別している。 frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI Service.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() 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/PhoneWi ndowManager.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);
  • 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 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permiss ions,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 /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 を使う
  • 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.c get_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.
  • 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.cpp if (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.png frameworks/base/core/res/res/drawable-hdpi/pointer_arrow.png frameworks/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.java static publicboolean 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; }
  • 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.cpp fb_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