SlideShare a Scribd company logo
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

More Related Content

PDF
㉒初期プロジェクトを改造!
Nishida Kansuke
 
PDF
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
Ryota Shiroguchi
 
PDF
Halide for Memory
Koumei Tomida
 
PDF
Linux KVM環境におけるGPGPU活用最新動向
Taira Hajime
 
PDF
enchant.jsでゲーム制作をはじめてみよう
Ryota Shiroguchi
 
PDF
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
PDF
Halide による画像処理プログラミング入門
Fixstars Corporation
 
㉒初期プロジェクトを改造!
Nishida Kansuke
 
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
Ryota Shiroguchi
 
Halide for Memory
Koumei Tomida
 
Linux KVM環境におけるGPGPU活用最新動向
Taira Hajime
 
enchant.jsでゲーム制作をはじめてみよう
Ryota Shiroguchi
 
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
Halide による画像処理プログラミング入門
Fixstars Corporation
 

What's hot (20)

KEY
GPGPU deいろんな問題解いてみた
Ryo Sakamoto
 
PDF
Reconf 201506
Takefumi MIYOSHI
 
PPTX
[CEDEC2017] LINEゲームのセキュリティ診断手法
LINE Corporation
 
PDF
Das 2015
Takefumi MIYOSHI
 
PDF
Synthesijer fpgax 20150201
Takefumi MIYOSHI
 
PPTX
RHEL on Azure、初めの一歩
Ryo Fujita
 
PPTX
Aiwolf seminar 2019_ja
Takedaatsushi
 
PDF
MeeGo Seminar Winter Porting 20101209
Mitz Amano
 
PDF
I2CでRaspberry Piから 複数の周辺機器を制御する
Hirokazu Nishio
 
PDF
機械学習 (AI/ML) 勉強会 #2 IoT編
Fujio Kojima
 
PDF
HalideでつくるDomain Specific Architectureの世界
Fixstars Corporation
 
PDF
【テストレポート】Datrium DVXによるIOmark-VM性能テスト
デイトリウム
 
PDF
dm-thin-internal-ja
Akira Hayakawa
 
PDF
Hello, DirectCompute
dasyprocta
 
PPTX
Your hash is.
abend_cve_9999_0001
 
PDF
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
智啓 出川
 
PDF
OrigenBoard and PandaBoard
android sola
 
PPTX
Raspberry pi 2用のi2cアダプターの
Takehiko Tomiyama
 
PDF
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
Yasuhiro Ishii
 
PDF
x86とコンテキストスイッチ
Masami Ichikawa
 
GPGPU deいろんな問題解いてみた
Ryo Sakamoto
 
Reconf 201506
Takefumi MIYOSHI
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
LINE Corporation
 
Synthesijer fpgax 20150201
Takefumi MIYOSHI
 
RHEL on Azure、初めの一歩
Ryo Fujita
 
Aiwolf seminar 2019_ja
Takedaatsushi
 
MeeGo Seminar Winter Porting 20101209
Mitz Amano
 
I2CでRaspberry Piから 複数の周辺機器を制御する
Hirokazu Nishio
 
機械学習 (AI/ML) 勉強会 #2 IoT編
Fujio Kojima
 
HalideでつくるDomain Specific Architectureの世界
Fixstars Corporation
 
【テストレポート】Datrium DVXによるIOmark-VM性能テスト
デイトリウム
 
dm-thin-internal-ja
Akira Hayakawa
 
Hello, DirectCompute
dasyprocta
 
Your hash is.
abend_cve_9999_0001
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
智啓 出川
 
OrigenBoard and PandaBoard
android sola
 
Raspberry pi 2用のi2cアダプターの
Takehiko Tomiyama
 
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
Yasuhiro Ishii
 
x86とコンテキストスイッチ
Masami Ichikawa
 
Ad

Viewers also liked (20)

PDF
20100925 sola-android
android sola
 
PDF
Embedded Master2
android sola
 
PDF
Pf部2012年1月勉強会.androidsola
android sola
 
PDF
Gingerbread
android sola
 
PDF
Yokohama-PF-2014-05-androidsola
android sola
 
PDF
Pf部2011年10月勉強会.1@androidsola
android sola
 
PDF
私の欲しい Android 端末
android sola
 
PDF
SHARPのエコ技を実装してみた
android sola
 
PDF
Firefox OSのカスタムROM開発を始めてみた
android sola
 
PDF
JC(ROM)に俺のKitKatをあげてみた
android sola
 
PDF
Android カスタムROMの作り方
Masahiro Hidaka
 
PDF
JCROM で Android の「真の力」を解き放て
android sola
 
PDF
PF部2012年3月勉強会.androidsola
android sola
 
PDF
JCROMの4.3対応
android sola
 
PDF
カスタムROM開発者の視点から見たAndroid
android sola
 
PDF
FancyFrontier22参戦報告
android sola
 
PDF
KEONとPEAKが無くてもFirefox OS開発出来る
android sola
 
ODP
はじめてのAndroid開発
Katsumi Honda
 
PDF
Android起動周りのノウハウ
chancelab
 
PDF
AndroidとSELinux
android sola
 
20100925 sola-android
android sola
 
Embedded Master2
android sola
 
Pf部2012年1月勉強会.androidsola
android sola
 
Gingerbread
android sola
 
Yokohama-PF-2014-05-androidsola
android sola
 
Pf部2011年10月勉強会.1@androidsola
android sola
 
私の欲しい Android 端末
android sola
 
SHARPのエコ技を実装してみた
android sola
 
Firefox OSのカスタムROM開発を始めてみた
android sola
 
JC(ROM)に俺のKitKatをあげてみた
android sola
 
Android カスタムROMの作り方
Masahiro Hidaka
 
JCROM で Android の「真の力」を解き放て
android sola
 
PF部2012年3月勉強会.androidsola
android sola
 
JCROMの4.3対応
android sola
 
カスタムROM開発者の視点から見たAndroid
android sola
 
FancyFrontier22参戦報告
android sola
 
KEONとPEAKが無くてもFirefox OS開発出来る
android sola
 
はじめてのAndroid開発
Katsumi Honda
 
Android起動周りのノウハウ
chancelab
 
AndroidとSELinux
android sola
 
Ad

Similar to PF部2011年12月勉強会.androidsola (20)

KEY
NVIDIA Japan Seminar 2012
Takuro Iizuka
 
PDF
Android gameprogramming
Masahiro Hidaka
 
PDF
デバドラを書いてみよう!
Masami Ichikawa
 
PDF
Open dronemapハンズオン
Mizutani Takayuki
 
PDF
Apache cloudstack4.0インストール
Yasuhiro Arai
 
PDF
コンピューティングとJava~なにわTECH道
なおき きしだ
 
PDF
C base design methodology with s dx and xilinx ml
ssuser3a4b8c
 
PDF
Fpga online seminar by fixstars (1st)
Fixstars Corporation
 
PDF
Zend Frameworkで始める携帯サイト
清水樹
 
PDF
Mastodonインスタンスをセットアップできるスタートアップスクリプトについて
さくらインターネット株式会社
 
PDF
Apache CloudStack 4.0 インストール(ver0.5)
Yasuhiro Arai
 
PPTX
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
KEY
PyOpenCLによるGPGPU入門
Yosuke Onoue
 
PDF
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
Takeshi Kuramochi
 
PPTX
どこでも動くゲームを作るためのベタープラクティス
5mingame2
 
PDF
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 
PDF
20181212 - PGconf.ASIA - LT
Kohei KaiGai
 
PDF
Hbstudy41 auto scaling
Fujishiro Takuya
 
PDF
Windows azure mobile services による mobile + cloud アプリケーション超高速開発
Shotaro Suzuki
 
NVIDIA Japan Seminar 2012
Takuro Iizuka
 
Android gameprogramming
Masahiro Hidaka
 
デバドラを書いてみよう!
Masami Ichikawa
 
Open dronemapハンズオン
Mizutani Takayuki
 
Apache cloudstack4.0インストール
Yasuhiro Arai
 
コンピューティングとJava~なにわTECH道
なおき きしだ
 
C base design methodology with s dx and xilinx ml
ssuser3a4b8c
 
Fpga online seminar by fixstars (1st)
Fixstars Corporation
 
Zend Frameworkで始める携帯サイト
清水樹
 
Mastodonインスタンスをセットアップできるスタートアップスクリプトについて
さくらインターネット株式会社
 
Apache CloudStack 4.0 インストール(ver0.5)
Yasuhiro Arai
 
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
PyOpenCLによるGPGPU入門
Yosuke Onoue
 
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
Takeshi Kuramochi
 
どこでも動くゲームを作るためのベタープラクティス
5mingame2
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 
20181212 - PGconf.ASIA - LT
Kohei KaiGai
 
Hbstudy41 auto scaling
Fujishiro Takuya
 
Windows azure mobile services による mobile + cloud アプリケーション超高速開発
Shotaro Suzuki
 

Recently uploaded (11)

PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 

PF部2011年12月勉強会.androidsola

  • 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 対応
  • 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 引かれる領域
  • 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 にコミットしたい内容 ...
  • 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 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; }
  • 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