SlideShare a Scribd company logo
1 of 99
Download to read offline
Android を移植して遊ぶ
自分専用端末を作る第一歩
自己紹介
●   名前
         –   sola
●   仕事
         –   大学卒業後、 7 年間は携帯の開発
         –   今年転職して、新しいことに挑戦中
●   ブログと twitter
         –   ブログ
                 ●   http://blog.sola-dolphin-1.net/
         –   twitter
                 ●   http://twitter.com/sola_dolphin_1
参加しているグループ
●   日本 Android の会
●   横浜 Android プラットフォーム部( PF への興味で参加)
    http://www.yokohama.android-pf.org/
    横浜支部の人でなくても参加可能
●   日本 Android の会 町田支部(近所なので参加)
Android 歴
●   2008 春頃
        –    社内の人に言ってみたが、感心無し(携帯作ってるとこなのに ... )
●   2008 秋頃
        –    ソース公開をきっかけに、まじめにソースとか読み始めた
●   2008 冬頃~ 2009 春頃
        –    AndroidDevPhone1 、 Armadillo-500FX 、 BeagleBoard を入手
●   2009 ~
        –    ブログ書き始めた& twitter を始めた
        –    仕事でも Android に関われるようになった
●   2010 春頃~
        –    新しいことを求めて転職
        –    アプリ作りに手を出し始めた。 A3 に出すのが目標
普通に使ってる Android 端末
●   Xperia (電話として使ってます)
●   dynabook AZ
自分でいじった Android 環境を
   動かした実機たち
●   Armadillo-500FX   ●   BeagleBoard
●   Armadillo-440     ●   BeagleBoard-xM
●   Armadillo-9       ●   IGEPv2
●   Armadillo-240     ●   TOUCHBOOK
●   mini2440          ●   Dev Phone 1
●   SmartQ5           ●   Dev Phone 2
                      ●   Nexus One

※ 赤字はブログとかでネタにしたもの
本日の話の概要
●   移植する時にやること
●   これまでハマったこと
●   その他
扱う範囲
移植するときにやること
移植手順
1.Android 用の Linux Kernel を作成する
2.動作確認
3.ユーザランドを作成する
4.動作確認
5.デバイスを追加したり、チューニングしたりする
Android 用の Linux Kernel を作る
2 通りの方法
●   Google が公開している Android の Linux Kernel に、
    ターゲット固有のドライバ等を移植する
●   ターゲットで既に動いている Linux Kernel に Android
    のドライバ(変更点)を移植する
Android の Linux Kernel に
ターゲット固有の部分を移植する
移植手順
     ●   ターゲット固有の部分は、 vanilla kernel と差分を取って抽出する
         Linux Kernel の配布場所は、 http://www.kernel.org/
         ターゲットのカーネルは、
         linux-2.6.32 ベースの sola-kernel があると仮定
     ●
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz
$ tar zxvf linux-2.6.32.tar.gz
    ●
$ diff -crdN linux-2.6.32/ sola-kernel/ > sola-kernel.patch
     ●


     ●   差分を Android の Linux Kernel に適用する
     ●
$   git clone git://android.git.kernel.org/kernel/common.git
$   cd● common/
$   git checkout -b android-2.6.32-work origin/android-2.6.32
$   patch -p1 -E < ../sola-kernel.patch
既に動いている Linux Kernel に
 Android のドライバを移植する
移植手順
     ●   Android のドライバは、 vanilla kernel と差分を取って抽出す
         Linux Kernel の配布場所は、 http://www.kernel.org/
         Android の Linux Kernel の配布場所は、
         git://android.git.kernel.org/kernel/common.git
     ●
$   git clone git://android.git.kernel.org/kernel/common.git
$   cd● common/
$   git checkout -b android-2.6.32-work origin/android-2.6.32
$   cd● ../
$   wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz
$   tar zxvf linux-2.6.32.tar.gz
      ●
$   diff -crdN linux-2.6.32/ common/ > android-2.6.32.patch
     ●


     ●   差分を既に動いている Linux Kernel に適用する
$ cd● sola-kernel
$ patch -p1 -E < ../android-2.6.32.patch
     ●
オススメしない例
Armadillo-500FX でやったこと
     ●   Linux Kernel のバージョンを 2.6.27 に上げつつ、ドライバを
         Android の Linux Kernel へ移植
     ●
$   wget http://armadillo.atmark-techno.com/files/downloads/armadillo-500-fx/source/kerne
$   wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.gz
      ●
$   tar zxvf linux-2.6.26-at6.tar.gz
$   tar zxvf linux-2.6.26.tar.gz
      ●
$   diff -crdN linux-2.6.26/ linux-2.6.26-at6/ > at6.patch
     ●


     ●   差分を取って、 Android の Linux Kernel に適用する
     ●
$ git clone git://android.git.kernel.org/kernel/common.git
$ cd common
$ patch -p1 -E < ../at6.patch

※master ブランチは android-2.6.27 なので、
使用する Linux Kernel のバージョンは 2.6.27 となります
Armadillo-500FX でやったこと
●   ハマるところ
      –   Armadillo-500FX の Linux Kernel は 2.6.26 なので、
          これと一致するバージョンの Android の Linux Kernel
          がない(今回の例では、 2.6.27 を使用)
      –   そのため、前のスライドでのパッチ適用は失敗する箇所が
          多く、手動で適用する必要のある箇所が多くなる
      –   Linux Kernel のバージョンが異なることで、構造体や関数
          の型が変更になり、コンパイルエラーとか ...
      –   コンパイルエラーが出なくても、動かすと kernel panic に
          なったりするなど ...
Armadillo-500FX でやったこと
●   解決策
      –   頑張るしかないです ...
      –   私はひたすらソースコードと睨めっこでした。
      –   経験上、動かない原因はほぼ arch/arm/*** であること
          が多い
      –   JTAG-ICE があると原因を追いかけ易いが、個人では手が
          出せない ...
      –   調べても原因不明な場合は、 Android-Embedded-
          Japan へメールを投げてみる
      –   英語が分かる人は android-porting も良いと思います
実機を使用せずに試す例
Android Emulator ( Goldfish )
●   Emulator の Linux Kernel が 2.6.29 までしかないので、 2.6.31
    へバージョンを上げました
    http://blog.sola-dolphin-1.net/archives/1858666.html
    http://blog.sola-dolphin-1.net/archives/1862864.html
●   Linux Kernel 2.6.31 に、 Goldfish 向けの変更と Android 用の
    ドライバを一気に移植
●   Goldfish は規模が小く、 Armadillo-500FX よりは楽
●   ただし、一気に移植すると問題発生時に Goldfish 向けの変更が悪
    いのか、 Android 向けの変更が悪いのか切り分ける必要が出てき
    ます
Emulator の便利なところ
●   Emulator を使うと、実機無しで移植の試しが出来る
●   デバッグも出来ます
    この記事が分かり易くて良いと思います
    Android エミュレータで Linux カーネルをデバッグ !!
    http://monoist.atmarkit.co.jp/fembedded/articles/filesys/06/filesys_06a.h
●   センサー等のデバイスを繋ぐことは出来ないけど、 Linux Kernel の
    中身を追うことが出来る。
役に立つドキュメント
●   Android Platform Developer's Guide
    http://source.android.com/porting/index.html
    (こういうの、去年欲しかった ... )
Android のユーザランドを作成する
その前に、
Emulator のイメージで動作させる

ソースからビルドしなくても動きます
Emulator のイメージで起動させる手順
1.busybox をクロスコンパイルする
2.Emulator に busybox を入れる
3.busybox を使用してイメージを吸い出す
4.吸い出したイメージの中を変更する(設定ファイルのみ)
5.変更したイメージを実機にのせて動かす
手順 1 と 2
     ●   busybox のクロスコンパイル
     ●

$   wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-lin
$   tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt/
      ●

$   wget http://busybox.net/downloads/busybox-1.17.2.tar.bz2
$   tar jxvf busybox-1.17.2.tar.bz2
      ●
$   cd busybox-1.17.2
$   export ARCH=arm
      ●
$   export CROSS_COMPILE=/opt/arm-2010q1/bin/arm-none-linux-gnueabi-
$   make menuconfig
      ●
$   make CFLAGS=--static LDFLAGS=--static
     ●


     ●   busybox のインストール

$ adb push busybox /data/
手順 3
     ●   busybox を使用して必要なデータを取り出す

$   adb shell
/   # export PATH=$PATH:/data
/   # busybox tar zcvf /cache/system.tar.gz system
/   # busybox tar zcvf /cache/sbin.tar.gz sbin
/   # busybox cp init /cache/
/   # busybox cp init.rc /cache/
/   # busybox cp default.prop /cache/
/   # exit
#   exit
$   mkdir emulator-image
$   adb pull /cache/ ./emulator-image/
手順 4
●   設定ファイルの変更
          –   init.rc のみ
              変更点は以下 mount のところのみ

mount rootfs rootfs / ro remount

mount yaffs2 mtd@system /system
mount yaffs2 mtd@system /system ro remount

mount yaffs2 mtd@userdata /data nosuid nodev

mount yaffs2 mtd@cache /cache nosuid nodev
手順 5
●   実機にのせるファイルを用意する
       data           空フォルダ作成
       dev            空フォルダ作成
       proc           空フォルダ作成
       sys            空フォルダ作成
       default.prop   吸い出したファイル
       init           吸い出したファイル
       init.rc        吸い出したファイル
       sbin           吸い出したファイル
       system         吸い出したファイル
これだけで動作します
Android のユーザランドを作成する
●   ターゲット毎に必要な変更箇所を簡単に紹介します
      –   BeagleBoard
      –   BeagleBoard-xM
      –   IGEPv2
      –   Armadillo-500FX
      –   Armadillo-440
まずは Android のビルド
   ●   ソースを取得して make を実行
   ●
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2_r1.1
$ repo sync
    ●
$ make -j8
   ●


   ●   make 完了後、実機にのせるファイルをまとめる

$ mkdir android-fs
$ cp -a out/target/product/generic/root/* android-fs/
$ cp -a out/target/product/generic/system/* android-fs/system/
BeagleBoard 編
●   BeagleBoard 向けに変更する箇所
       –   init.rc
BeagleBoard-xM 編
●   BeagleBoard-xM 向けに変更する箇所
       –   init.rc
IGEPv2 編
●   IGEPv2 向けに変更する箇所
       –   init.rc
Armadillo-500FX 編
●   Armadillo-500FX 向けに変更する箇所
       –   init.rc
Armadillo-440 編
●   Armadillo-440 向けに変更する箇所
       –   init.rc
まとめ
●   複数例紹介したけど、必要な変更点はほとんど同じ
●   他のターゲット向けにも、基本的には同じところを変更して
    あげれば動くと思います
●   Android をのせてみるのは、本当に簡単
●   初めての場合、難しいのは Linux Kernel の部分ですの
    で、既に Linux が動作している実機を用意した方が良いと
    思います。
●   カメラとか GPS とかセンサーとか無線 LAN を動かしたい
    時はそれなりに手間です。
    (いずれどこかに整理したいと思っています)
BeagleBoard の環境を変更してみる
変更するところ
●   以下の環境変数を設定してみる( Froyo での例)
       –   TARGET_ARCH_VARIANT
       –   WITH_JIT
●   SD カードを認識させる
       –   vold.fstab の設定( eclair までは vold.conf )
●   複数のターゲット向けに環境を設定する
       –   BeagleBoard や Armadillo 向けに、別々に環境を用意す
           るのはもったいないので、切り替えられるようにする
環境変数の設定
   ●   設定例
   ●
TARGET_ARCH_VARIANT := armv7-a-neon
WITH_JIT := true
   ●


   ●   TARGET_ARCH_VARIANT に設定可能な値は、
       build/core/combo/arch/arm/ に存在するものであれば可能
   ●   WITH_JIT は、 JIT コンパイラを有効にするかの設定で、
       true にすると有効になる


   ●   ビルド例

make TARGET_ARCH_VARIANT=armv7-a-neon WITH_JIT=true
SD カードを認識させる
   ●   vold.fstab の設定( Froyo )
   ●
# Mounts the first usable partition of the specified device
dev_mount sdcard /mnt/sdcard auto /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
   ●


   ●   vold.conf の設定( Eclair まで)
   ●
## This is the direct uevent device path to the SD slot on the device
media_path     /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
   ●


   ●   設定すべき値を知る方法
   ●
# ls -l /sys/devices/platform/mmci-omap-hs.0/mmc_host/mmc0
-rw-r--r-- root     root         4096 2000-01-01 00:00 uevent
    ●
lrwxrwxrwx root     root              2000-01-01 00:04 subsystem -> ../../../../../clas
lrwxrwxrwx root     root              2000-01-01 00:04 device -> ../../../mmci-omap-hs.
drwxr-xr-x root     root              2000-01-01 00:00 power
-r--r--r-- root     root         4096 2000-01-01 00:04 slot_name
drwxr-xr-x root     root              2000-01-01 00:00 mmc0:aaaa
ターゲット向けの設定ファイルを作る
●   device/ に設定ファイルを格納する
       –   devices/sola/beagleboard/***
       –   devices/sola/armadillo500fx/***
           ※eclair までは devices ではなく、 vendor でした


●   格納するファイルの例( BeagleBoard の場合)
       –   AndroidBoard.mk
       –   AndroidProducts.mk
       –   BoardConfig.mk
       –   beagleboard.mk
       –   vendorsetup.sh
AndroidBoard.mk
   ●   記述例
   ●
LOCAL_PATH := $(call my-dir)
    ●
# board specific init.rc
#
PRODUCT_COPY_FILES += 
    ●
    $(LOCAL_PATH)/init.rc:root/init.rc
   ●
# vold
#
    ●
PRODUCT_COPY_FILES += 
    $(LOCAL_PATH)/vold.fstab:system/etc/vold.fstab
   ●



       オリジナルの init.rc は system/core/rootdir にあります
AndroidProducts.mk
   ●   記述例

PRODUCT_MAKEFILES := 
    $(LOCAL_DIR)/beagleboard.mk
BoardConfig.mk
   ●   記述例

# config.mk
#
# Product-specific compile-time definitions.
#
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_CPU_ABI := armeabi
BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := true
TARGET_ARCH_VARIANT := armv7-a-neon
WITH_JIT := true
beagleboard.mk
   ●   記述例

# Superclass
$(call inherit-product, build/target/product/generic.mk)

PRODUCT_PACKAGES += 
    LiveWallpapersPicker 
    LiveWallpapers 
    MagicSmokeWallpapers 
    VisualizationWallpapers

# Overrides
PRODUCT_NAME := beagleboard
PRODUCT_DEVICE := beagleboard
PRODUCT_MODEL := beagleboard
PRODUCT_BRAND := beagleboard
PRODUCT_MANUFACTURER := beagleboard

PRODUCT_LOCALES := ldpi hdpi mdpi ja_JP en_US
vendorsetup.sh
   ●   記述例

add_lunch_combo beagleboard-eng
ビルド方法
●   トップディレクトリで以下を実行する
         $ source build/envsetup.sh
         $ lunch beagleboard-eng


●   ビルドした結果は generic ではなく、 beagleboard フォ
    ルダの下に格納されます
         out/target/product/beagleboard


●   他のターゲット(例えば armadillo440 )の場
    合、 beagleboard のところを読み替えてください
これまでにハマったところ
Android 起動直後に終了する
Android 起動直後に終了する
●   capcake ( Android1.5 )でよく目撃した例
解決方法 1
●   BatteryService で状態をごまかす
    詳細は、ブリリアントサービスさんのブログを参照。
    バッテリードライバを見にいかず、
    BatteryService でバッテリー FULL を返しています。
    http://d.hatena.ne.jp/bs-android/20090603/1244043649
解決方法 2
●   バッテリードライバを組み込む
    考え方は、方法 1 と同じ。方法 2 では、ドライバで常にバッテ
    リー FULL を返すようにする。
    数十行で書けます。

    実際に使うには、(株)パイロンさんの公開しているドライバ
    を使用するのが良いかと思います。
    http://pylone.jp/blog/virtual_battery


    この方法の良いところは、 Android に手を入れる必要が無い
    こと。
Android が起動しない
Android のロゴ点滅で無限ループ
●   cupcake ( Android1.5 )から donut ( Android1.6 )
    へのバージョンアップ時に目撃した例




                                  ここから進まない
原因
●   センサーのライブラリ( system/lib/hw/sensors.xxx.so )
    元々は Android Dev Phone1 で donut を動かそうとした時、
    起動しなくて調べました。
    センサーのライブラリを外すと起動したため、センサーが原因
    だと判断。

    しかし、当時は Android Dev Phone1 向けのセンサーのソー
    スコードが公開されていなかったため、 cupcake 向けに自分
    で実装したソフトで確認。

    結果、センサーのライブラリに原因があると判明。
解決方法
    ●   センサーライブラリの修正例
#include <cutils/native_handle.h> /* donut */

/* <donut> static int control_open_data_source( struct sensors_control_device_t *dev ) */
static native_handle_t* control_open_data_source( struct sensors_control_device_t *dev ) /* <donut> */
{
    native_handle_t* handle;               /* <donut> */
    handle = native_handle_create( 1, 0 ); /* <donut> */
    sensor_fd = open_sensors_phy( dev );
    handle->data[ 0 ] = sensor_fd;         /* <donut> */
/* return sensor_fd;                     *//* <donut> */
    return handle;                         /* <donut> */
}

/* <donut> int sensors_open( struct sensors_data_device_t *dev, int fd ) */
int sensors_open( struct sensors_data_device_t *dev, native_handle_t* handle ) /* <donut> */
{
    int i;
    sPendingSensors = 0;
/* event_fd = dup( fd );                 *//* <donut> */
    event_fd = dup( handle->data[ 0 ] );   /* <donut> */
    native_handle_close( handle );         /* <donut> */
    native_handle_delete( handle );        /* <donut> */
    for( i = 0 ; i < MAX_NUM_SENSORS ; i++ )
        sensors[ i ].vector.status = SENSOR_STATUS_ACCURACY_HIGH;
    return 0;
}
Android が起動しない(2)
Android のロゴ点滅で無限ループ(2)
    ●   eclair ( Android2.1 )以降の目撃例
    ●
I/SystemServer( 123): Battery Service
W/dalvikvm( 123): No implementation found for native Lcom/android/server/BatteryService;.native_
W/dalvikvm( 123): threadid=15: thread exiting with uncaught exception (group=0x4001b160)
    ●
E/AndroidRuntime( 123): Uncaught handler: thread android.server.ServerThread exiting due to unca
E/AndroidRuntime( 123): *** EXCEPTION IN SYSTEM PROCESS. System will crash.
E/AndroidRuntime( 123): java.lang.UnsatisfiedLinkError: native_update
    ●
E/AndroidRuntime( 123):         at com.android.server.BatteryService.native_update(Native Method)
E/AndroidRuntime( 123):
    ●
                                at com.android.server.BatteryService.update(BatteryService.java:2
E/AndroidRuntime( 123):         at com.android.server.BatteryService.<iniinit: untracked pid 117
t>(BatteryService.java:138)
E/AndroidRuntime( 123):
    ●                           at com.android.server.ServerThread.run(SystemServer.java:140)
E/AndroidRuntime( 123): Crash logging skipped, no checkin service
I/Process ( 123): Sending signal. PID: 123 SIG: 9
    ●
D/BootAnimation( 133): SurfaceFlinger died, exiting...
I/ServiceManager(   25): service 'package' died
(省略)●
I/ServiceManager(   25): service 'content' died
E/installd(   32): eof
E/installd(
    ●         32): failed to read size
I/installd(   32): closing connection
I/Zygote ( 118): Exit zygote because system server (123) has terminated
解決方法 1
●   Power supply class support を有効にする
    バッテリーのドライバは用意しなくてよい。
    kernel config で、 CONFIG_POWER_SUPPLY を y にする。
解決方法 2
   ●   BatteryService で状態をごまかす
       cupcake の頃とは BatteryService.java の作りが違うので、
       別の対応を行う。やることは同じ。バッテリー FULL を返す。

frameworks/base/services/java/com/android/server/BatteryService.java

197c197
<         private native void native_update();
---
> //      private native void native_update();
200c200,204
<         native_update();
---
>         mAcOnline = true;
>         mBatteryPresent = true;
>         mBatteryLevel = 100;
>         mBatteryStatus = BatteryManager.BATTERY_STATUS_FULL;
> //      native_update();
解決方法 3
●   バッテリードライバを組み込む
    Android 起動直後に終了するで書いた通り。ドライバで常に
    バッテリー FULL を返すようにする。
    数十行で書けます。

    実際に使うには、(株)パイロンさんの公開しているドライバ
    を使用するのが良いかと思います。
    http://pylone.jp/blog/virtual_battery


    この方法の良いところは、 Android に手を入れる必要が無い
    こと。
Android が起動しない(3)
Android のロゴ点滅で無限ループ(3)
   ●   froyo ( Android2.2 )での目撃例
   ●
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
    ●
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(
    ●             53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(
    ●             53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
    ●
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(
    ●             53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(
    ●             53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
    ●
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
W/MountService(   53):   Waiting   too   long   for   mReady!
解決方法 1
     ●   Mount サービス無効化
         SD カード使えなくなるのでおすすめしませんが、一応
         frameworks/base/services/java/com/android/server/Mou
         ntService.java

//   if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
         mReady = true;
         mUmsEnabling = true;
         return;
//   }

//   mConnector = new NativeDaemonConnector(this, "vold", 10, "VoldConnector");
//   mReady = false;
//   Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName());
//   thread.start();
解決方法 2
    ●   NativeDaemonConnector.java の修正
        android-porting で同じ現象に関する投稿があり、既に解決済
        みだった。
        froyo weird timeouts?
        http://groups.google.co.jp/group/android-porting/browse_thr
@@ -97,11 +97,12 @@ final class NativeDaemonConnector implements Runnable {
                     LocalSocketAddress.Namespace.RESERVED);

            socket.connect(address);
-           mCallbacks.onDaemonConnected();

            InputStream inputStream = socket.getInputStream();
            mOutputStream = socket.getOutputStream();

+           mCallbacks.onDaemonConnected();
+
            byte[] buffer = new byte[BUFFER_SIZE];
            int start = 0;
Android が起動しない(4)
Android のロゴまで進まない
   ●   init で kernel panic が発生して停止
   ●

kjournald starting. Commit interval 5 seconds
EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
    ●
EXT3 FS on mmcblk0p3, internal journal
EXT3-fs: mounted filesystem with writeback data mode.
    ●
VFS: Mounted root (ext3 filesystem) on device 179:3.
Freeing init memory: 132K
Warning: unable to open an initial console.
Kernel panic - not syncing: Attempted to kill init!
原因と解決方法
●   原因は TLS
    Android で TLS を使うようになっていたため、発生した。
    ARCH_ARM_HAVE_TLS_REGISTER が true


    しかし Linux Kernel では CONFIG_HAS_TLS_REG が無効。
    そのため、現象が発生した。


    Linux Kernel 側で有効であれば、問題無し。
    または、 Android 側で使わないようにする。
追加したデバイスが使えない
加速度センサーを繋いだとき
●   TDS01V (加速度、地磁気、気圧のセンサー)
    USB シリアル( FTDI のドライバ)で接続します
Web カメラを繋いだとき
●   USB 接続するタイプのもの
発生した現象
   ●   Linux では認識してるのに、 Android で触れない
       Linux 起動直後( Android 起動前)に確認した結果
加速度センサー
    ●

[root@armadillo500 (ttymxc0) /]# ls -l /dev/ttyUSB*
crw-rw-rw-
    ●         1 root     root     188,   0 Jan 9 20:34 /dev/ttyUSB0

Web カメラ
    ●
[root@armadillo500 (ttymxc0) ~]# ls -l /dev/video0
crw-rw----
    ●         1 root     root      81,   0 Jan 9 20:56 /dev/video0

       Android 起動後に確認した結果
加速度センサー
# ls -l /dev/ttyUSB*
crw------- root      root   188,   0 2000-01-09 11:39 ttyUSB0

Web カメラ
# ls -l /dev/video0
crw------- root     root     81,   0 2000-01-09 11:52 video0
解決方法
   ●   Android の init を変更する
       デバイスファイルのパーミッション設定に関しては、
       system/core/init/devices.c に記載します。
static struct perms_ devperms[] = {
    { "/dev/null",          0666,   AID_ROOT,   AID_ROOT,     0 },
    { "/dev/zero",          0666,   AID_ROOT,   AID_ROOT,     0 },
    { "/dev/full",          0666,   AID_ROOT,   AID_ROOT,     0 },
(省略)
    { "/dev/ttyUSB0",       0666,   AID_ROOT,   AID_ROOT,     0 },
    { "/dev/video0",        0660,   AID_ROOT,   AID_CAMERA,   1 },
    { NULL, 0, 0, 0, 0 },
};
ネットワークに繋がらない
有線 LAN 使用時の問題
●   Linux では認識してるのに、ブラウザで Web ページを表
    示できない
対処方法 1
   ●   init.rc で dns の設定を書いてあげる
       on boot のブロックに、
       setprop net.dns1 8.8.8.8 を書く

init.rc の抜粋

on boot
...
    setprop net.dns1 8.8.8.8
...
有線 LAN 使用時の問題
●   Linux は認識してるのに Android で認識していない?
対処方法 2
●   ethernet support を移植
    Android-x86 に実装されているので、必要な処理を持っ
    てきて動かしてみた


    変更箇所についてはブログを参照
    ethernet support
    http://blog.sola-dolphin-1.net/archives/2974043.htm
有線 LAN 使用時の問題解決?
●   Android にネットワーク接続を認識させた結果
ライブ壁紙が使えない
ライブ壁紙を動かすのに必要なもの
●   アプリケーションをインストールしても動作しない
●   必要なライブラリがインストールされていないのが原因
    Android Zaurus の日記
    NetWalker で Nexus One の Live Wallpaper
    http://d.hatena.ne.jp/androidzaurus/20100121/1264065376


    ビルドは実行されており、以下にライブラリが出来ている。
    out/target/product/<target>/obj/lib/librs_jni.so
    out/target/product/<target>/obj/lib/libRS.so
    ※<target> は環境によって異なる
    これらを、ターゲット環境の /system/lib/ へコピーする
何故インストールされない?
●   Android.mk に
    LOCAL_MODULE_TAGS := optional
    があると、インストールされない


    今回の場合、以下の 2 ファイル
    frameworks/base/libs/rs/Android.mk
    frameworks/base/graphics/jni/Android.mk
(おそらく)正解な解決方法
●   以下のように設定してビルドを行う
    device/sola/beagleboard/beagleboard.mk に、


    PRODUCT_PACKAGES += 
      libRS 
      librs_jni


    を追記してビルドする。
Ubuntu10.04 で
cupcake 、 donut のビルドができない
ビルドエラーの原因
●   gcc と g++ が 4.4 になったせい
    色々とチェックが厳しいらしい
●   解決策としては、 gcc-4.3 と g++-4.3 をインストール。
    ビルド時にこれらを使うようにする

    gcc-4.3 と g++-4.3 のインストール
    $ sudo apt-get install gcc-4.3 g++-4.3

    gcc-4.3 と g++-4.3 を使用してビルドする
    $ CC=gcc-4.3 CXX=g++-4.3 make
Android のビルドができない
ビルドエラーの原因
   ●   master 、 froyo などのブランチは頻繁に修正が入りま
       す。運が悪いと、ビルド出来ない状態なことがあります。
       ( cupcake の頃はとても酷かったです ... )
   ●   使用するなら、 android-2.2_r1.1 や android-2.1_r2
       のように、タグが付いているものの方が良いと思います。
       ビルドエラーは出ない(はずです)
   ●   最近( 9/23 に取得)の master ではこんなのが ...

Checking build tools versions...
build/core/main.mk:72: ************************************************************
build/core/main.mk:73: You are attempting to build on a 32-bit system.
build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2.
build/core/main.mk:75: ************************************************************
build/core/main.mk:76: *** stop. 中止 .
その他
起動画面を変更する
   ●   動画にする方法
           –   png 形式の画像を用意して、アニメーションを作れます
               以下の順にデータを探しに行くようになっています。
               /data/local/bootanimation.zip
               /system/media/bootanimation.zip
zip 形式でアニメーションデータをまとめます
$ ls
desc.txt part0 part1
$ zip -r -0 bootanimation ./*

dest.txt の中身
320 180 30
p 1 0 part0
p 0 0 part1

part0/part1 の中身は、 png 形式の画像データ
ソース読みを楽にするために
●   GNU GLOBAL
       –   普段よく使用しているソフト
           http://www.tamacom.com/global-j.html
           サンプル( VMware の仮想環境)
           http://sola-dolphin-1.net/data/android/image/gnuglob
           ユーザ名やパスワードは android
           Firefox のブックマークに参照先のリンクがあります
●   OpenGrok
       –   OESF のサーバで Android-2.2_r1.1 が公開されてます
           http://tools.oesf.biz/android-2.2_r1.1/
A81-E
●   BeagleBoard と同じ、 OMAP3 搭載
●   カスタム ROM を動かせるので、専用端末化するのに向い
    てる。
●   独自イメージの起動方法
    知りたい or やりたい?
今後やろうとしてること
●   個人&(横浜) PF 部等で情報を出していく
    まだ情報が少ない?らしいので
●   冬のコミケに申し込み中
●   そろそろ Android 以外のネタを
終了

More Related Content

Viewers also liked

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

Viewers also liked (14)

Pf部2011年10月勉強会.1@androidsola
Pf部2011年10月勉強会.1@androidsolaPf部2011年10月勉強会.1@androidsola
Pf部2011年10月勉強会.1@androidsola
 
SHARPのエコ技を実装してみた
SHARPのエコ技を実装してみたSHARPのエコ技を実装してみた
SHARPのエコ技を実装してみた
 
Firefox OSのカスタムROM開発を始めてみた
Firefox OSのカスタムROM開発を始めてみたFirefox OSのカスタムROM開発を始めてみた
Firefox OSのカスタムROM開発を始めてみた
 
JC(ROM)に俺のKitKatをあげてみた
JC(ROM)に俺のKitKatをあげてみたJC(ROM)に俺のKitKatをあげてみた
JC(ROM)に俺のKitKatをあげてみた
 
Android カスタムROMの作り方
Android カスタムROMの作り方Android カスタムROMの作り方
Android カスタムROMの作り方
 
PF部2012年3月勉強会.androidsola
PF部2012年3月勉強会.androidsolaPF部2012年3月勉強会.androidsola
PF部2012年3月勉強会.androidsola
 
JCROM で Android の「真の力」を解き放て
JCROM で Android の「真の力」を解き放てJCROM で Android の「真の力」を解き放て
JCROM で Android の「真の力」を解き放て
 
JCROMの4.3対応
JCROMの4.3対応JCROMの4.3対応
JCROMの4.3対応
 
カスタムROM開発者の視点から見たAndroid
カスタムROM開発者の視点から見たAndroidカスタムROM開発者の視点から見たAndroid
カスタムROM開発者の視点から見たAndroid
 
FancyFrontier22参戦報告
FancyFrontier22参戦報告FancyFrontier22参戦報告
FancyFrontier22参戦報告
 
はじめてのAndroid開発
はじめてのAndroid開発はじめてのAndroid開発
はじめてのAndroid開発
 
KEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来るKEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来る
 
Android起動周りのノウハウ
Android起動周りのノウハウAndroid起動周りのノウハウ
Android起動周りのノウハウ
 
AndroidとSELinux
AndroidとSELinuxAndroidとSELinux
AndroidとSELinux
 

Similar to 20100925 sola-android

Nodejs on android
Nodejs on androidNodejs on android
Nodejs on android俊夫 森
 
Android 2.2 手機應用程式設計:第二章 開發環境安裝
Android 2.2 手機應用程式設計:第二章 開發環境安裝Android 2.2 手機應用程式設計:第二章 開發環境安裝
Android 2.2 手機應用程式設計:第二章 開發環境安裝Robert Chi
 
whatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minuteswhatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minutesidsecconf
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶 wensheng wei
 
Android 2.2 手機應用程式設計:第一章 Android 系統介紹
Android 2.2 手機應用程式設計:第一章 Android 系統介紹Android 2.2 手機應用程式設計:第一章 Android 系統介紹
Android 2.2 手機應用程式設計:第一章 Android 系統介紹Robert Chi
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuvePhilippe Gamache
 
Fundamental know-how of Linux tech
Fundamental know-how of Linux techFundamental know-how of Linux tech
Fundamental know-how of Linux techMichael Huai
 
programming camp 2008, introduction of git
programming camp 2008, introduction of gitprogramming camp 2008, introduction of git
programming camp 2008, introduction of gitHiro Yoshioka
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍thinkinlamp
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NETBruno Capuano
 
Gelecex - Maven ile Akilli Projeler
Gelecex - Maven ile Akilli ProjelerGelecex - Maven ile Akilli Projeler
Gelecex - Maven ile Akilli ProjelerMert Çalışkan
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSergio Alonso
 
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)Pedro Valera
 
Comparaciones oracle y sql
Comparaciones oracle y sqlComparaciones oracle y sql
Comparaciones oracle y sqlJUAN ENRIQUE
 
Lecture1
Lecture1Lecture1
Lecture1orgil
 

Similar to 20100925 sola-android (20)

Nodejs on android
Nodejs on androidNodejs on android
Nodejs on android
 
Android 2.2 手機應用程式設計:第二章 開發環境安裝
Android 2.2 手機應用程式設計:第二章 開發環境安裝Android 2.2 手機應用程式設計:第二章 開發環境安裝
Android 2.2 手機應用程式設計:第二章 開發環境安裝
 
whatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minuteswhatsoever, hardening linux webserver in 60 minutes
whatsoever, hardening linux webserver in 60 minutes
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
Android 2.2 手機應用程式設計:第一章 Android 系統介紹
Android 2.2 手機應用程式設計:第一章 Android 系統介紹Android 2.2 手機應用程式設計:第一章 Android 系統介紹
Android 2.2 手機應用程式設計:第一章 Android 系統介紹
 
Symm basics
Symm basicsSymm basics
Symm basics
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de Mainsonneuve
 
Fundamental know-how of Linux tech
Fundamental know-how of Linux techFundamental know-how of Linux tech
Fundamental know-how of Linux tech
 
张宴NGINX
张宴NGINX张宴NGINX
张宴NGINX
 
programming camp 2008, introduction of git
programming camp 2008, introduction of gitprogramming camp 2008, introduction of git
programming camp 2008, introduction of git
 
Primeiro Projeto Ew430 Ti
Primeiro Projeto Ew430   TiPrimeiro Projeto Ew430   Ti
Primeiro Projeto Ew430 Ti
 
Programació de sockets amb C++
Programació de sockets amb C++Programació de sockets amb C++
Programació de sockets amb C++
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET
 
Gelecex - Maven ile Akilli Projeler
Gelecex - Maven ile Akilli ProjelerGelecex - Maven ile Akilli Projeler
Gelecex - Maven ile Akilli Projeler
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
 
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
 
Comparaciones oracle y sql
Comparaciones oracle y sqlComparaciones oracle y sql
Comparaciones oracle y sql
 
Lecture1
Lecture1Lecture1
Lecture1
 

20100925 sola-android

  • 2. 自己紹介 ● 名前 – sola ● 仕事 – 大学卒業後、 7 年間は携帯の開発 – 今年転職して、新しいことに挑戦中 ● ブログと twitter – ブログ ● http://blog.sola-dolphin-1.net/ – twitter ● http://twitter.com/sola_dolphin_1
  • 3. 参加しているグループ ● 日本 Android の会 ● 横浜 Android プラットフォーム部( PF への興味で参加) http://www.yokohama.android-pf.org/ 横浜支部の人でなくても参加可能 ● 日本 Android の会 町田支部(近所なので参加)
  • 4. Android 歴 ● 2008 春頃 – 社内の人に言ってみたが、感心無し(携帯作ってるとこなのに ... ) ● 2008 秋頃 – ソース公開をきっかけに、まじめにソースとか読み始めた ● 2008 冬頃~ 2009 春頃 – AndroidDevPhone1 、 Armadillo-500FX 、 BeagleBoard を入手 ● 2009 ~ – ブログ書き始めた& twitter を始めた – 仕事でも Android に関われるようになった ● 2010 春頃~ – 新しいことを求めて転職 – アプリ作りに手を出し始めた。 A3 に出すのが目標
  • 6. Xperia (電話として使ってます) ● dynabook AZ
  • 7. 自分でいじった Android 環境を 動かした実機たち
  • 8. Armadillo-500FX ● BeagleBoard ● Armadillo-440 ● BeagleBoard-xM ● Armadillo-9 ● IGEPv2 ● Armadillo-240 ● TOUCHBOOK ● mini2440 ● Dev Phone 1 ● SmartQ5 ● Dev Phone 2 ● Nexus One ※ 赤字はブログとかでネタにしたもの
  • 9. 本日の話の概要 ● 移植する時にやること ● これまでハマったこと ● その他
  • 12. 移植手順 1.Android 用の Linux Kernel を作成する 2.動作確認 3.ユーザランドを作成する 4.動作確認 5.デバイスを追加したり、チューニングしたりする
  • 13. Android 用の Linux Kernel を作る
  • 14. 2 通りの方法 ● Google が公開している Android の Linux Kernel に、 ターゲット固有のドライバ等を移植する ● ターゲットで既に動いている Linux Kernel に Android のドライバ(変更点)を移植する
  • 15. Android の Linux Kernel に ターゲット固有の部分を移植する
  • 16. 移植手順 ● ターゲット固有の部分は、 vanilla kernel と差分を取って抽出する Linux Kernel の配布場所は、 http://www.kernel.org/ ターゲットのカーネルは、 linux-2.6.32 ベースの sola-kernel があると仮定 ● $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz $ tar zxvf linux-2.6.32.tar.gz ● $ diff -crdN linux-2.6.32/ sola-kernel/ > sola-kernel.patch ● ● 差分を Android の Linux Kernel に適用する ● $ git clone git://android.git.kernel.org/kernel/common.git $ cd● common/ $ git checkout -b android-2.6.32-work origin/android-2.6.32 $ patch -p1 -E < ../sola-kernel.patch
  • 17. 既に動いている Linux Kernel に Android のドライバを移植する
  • 18. 移植手順 ● Android のドライバは、 vanilla kernel と差分を取って抽出す Linux Kernel の配布場所は、 http://www.kernel.org/ Android の Linux Kernel の配布場所は、 git://android.git.kernel.org/kernel/common.git ● $ git clone git://android.git.kernel.org/kernel/common.git $ cd● common/ $ git checkout -b android-2.6.32-work origin/android-2.6.32 $ cd● ../ $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz $ tar zxvf linux-2.6.32.tar.gz ● $ diff -crdN linux-2.6.32/ common/ > android-2.6.32.patch ● ● 差分を既に動いている Linux Kernel に適用する $ cd● sola-kernel $ patch -p1 -E < ../android-2.6.32.patch ●
  • 20. Armadillo-500FX でやったこと ● Linux Kernel のバージョンを 2.6.27 に上げつつ、ドライバを Android の Linux Kernel へ移植 ● $ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-500-fx/source/kerne $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.gz ● $ tar zxvf linux-2.6.26-at6.tar.gz $ tar zxvf linux-2.6.26.tar.gz ● $ diff -crdN linux-2.6.26/ linux-2.6.26-at6/ > at6.patch ● ● 差分を取って、 Android の Linux Kernel に適用する ● $ git clone git://android.git.kernel.org/kernel/common.git $ cd common $ patch -p1 -E < ../at6.patch ※master ブランチは android-2.6.27 なので、 使用する Linux Kernel のバージョンは 2.6.27 となります
  • 21. Armadillo-500FX でやったこと ● ハマるところ – Armadillo-500FX の Linux Kernel は 2.6.26 なので、 これと一致するバージョンの Android の Linux Kernel がない(今回の例では、 2.6.27 を使用) – そのため、前のスライドでのパッチ適用は失敗する箇所が 多く、手動で適用する必要のある箇所が多くなる – Linux Kernel のバージョンが異なることで、構造体や関数 の型が変更になり、コンパイルエラーとか ... – コンパイルエラーが出なくても、動かすと kernel panic に なったりするなど ...
  • 22. Armadillo-500FX でやったこと ● 解決策 – 頑張るしかないです ... – 私はひたすらソースコードと睨めっこでした。 – 経験上、動かない原因はほぼ arch/arm/*** であること が多い – JTAG-ICE があると原因を追いかけ易いが、個人では手が 出せない ... – 調べても原因不明な場合は、 Android-Embedded- Japan へメールを投げてみる – 英語が分かる人は android-porting も良いと思います
  • 24. Android Emulator ( Goldfish ) ● Emulator の Linux Kernel が 2.6.29 までしかないので、 2.6.31 へバージョンを上げました http://blog.sola-dolphin-1.net/archives/1858666.html http://blog.sola-dolphin-1.net/archives/1862864.html ● Linux Kernel 2.6.31 に、 Goldfish 向けの変更と Android 用の ドライバを一気に移植 ● Goldfish は規模が小く、 Armadillo-500FX よりは楽 ● ただし、一気に移植すると問題発生時に Goldfish 向けの変更が悪 いのか、 Android 向けの変更が悪いのか切り分ける必要が出てき ます
  • 25. Emulator の便利なところ ● Emulator を使うと、実機無しで移植の試しが出来る ● デバッグも出来ます この記事が分かり易くて良いと思います Android エミュレータで Linux カーネルをデバッグ !! http://monoist.atmarkit.co.jp/fembedded/articles/filesys/06/filesys_06a.h ● センサー等のデバイスを繋ぐことは出来ないけど、 Linux Kernel の 中身を追うことが出来る。
  • 26. 役に立つドキュメント ● Android Platform Developer's Guide http://source.android.com/porting/index.html (こういうの、去年欲しかった ... )
  • 29. Emulator のイメージで起動させる手順 1.busybox をクロスコンパイルする 2.Emulator に busybox を入れる 3.busybox を使用してイメージを吸い出す 4.吸い出したイメージの中を変更する(設定ファイルのみ) 5.変更したイメージを実機にのせて動かす
  • 30. 手順 1 と 2 ● busybox のクロスコンパイル ● $ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-lin $ tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt/ ● $ wget http://busybox.net/downloads/busybox-1.17.2.tar.bz2 $ tar jxvf busybox-1.17.2.tar.bz2 ● $ cd busybox-1.17.2 $ export ARCH=arm ● $ export CROSS_COMPILE=/opt/arm-2010q1/bin/arm-none-linux-gnueabi- $ make menuconfig ● $ make CFLAGS=--static LDFLAGS=--static ● ● busybox のインストール $ adb push busybox /data/
  • 31. 手順 3 ● busybox を使用して必要なデータを取り出す $ adb shell / # export PATH=$PATH:/data / # busybox tar zcvf /cache/system.tar.gz system / # busybox tar zcvf /cache/sbin.tar.gz sbin / # busybox cp init /cache/ / # busybox cp init.rc /cache/ / # busybox cp default.prop /cache/ / # exit # exit $ mkdir emulator-image $ adb pull /cache/ ./emulator-image/
  • 32. 手順 4 ● 設定ファイルの変更 – init.rc のみ 変更点は以下 mount のところのみ mount rootfs rootfs / ro remount mount yaffs2 mtd@system /system mount yaffs2 mtd@system /system ro remount mount yaffs2 mtd@userdata /data nosuid nodev mount yaffs2 mtd@cache /cache nosuid nodev
  • 33. 手順 5 ● 実機にのせるファイルを用意する data 空フォルダ作成 dev 空フォルダ作成 proc 空フォルダ作成 sys 空フォルダ作成 default.prop 吸い出したファイル init 吸い出したファイル init.rc 吸い出したファイル sbin 吸い出したファイル system 吸い出したファイル
  • 35. Android のユーザランドを作成する ● ターゲット毎に必要な変更箇所を簡単に紹介します – BeagleBoard – BeagleBoard-xM – IGEPv2 – Armadillo-500FX – Armadillo-440
  • 36. まずは Android のビルド ● ソースを取得して make を実行 ● $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2_r1.1 $ repo sync ● $ make -j8 ● ● make 完了後、実機にのせるファイルをまとめる $ mkdir android-fs $ cp -a out/target/product/generic/root/* android-fs/ $ cp -a out/target/product/generic/system/* android-fs/system/
  • 37. BeagleBoard 編 ● BeagleBoard 向けに変更する箇所 – init.rc
  • 38. BeagleBoard-xM 編 ● BeagleBoard-xM 向けに変更する箇所 – init.rc
  • 39. IGEPv2 編 ● IGEPv2 向けに変更する箇所 – init.rc
  • 40. Armadillo-500FX 編 ● Armadillo-500FX 向けに変更する箇所 – init.rc
  • 41. Armadillo-440 編 ● Armadillo-440 向けに変更する箇所 – init.rc
  • 42. まとめ ● 複数例紹介したけど、必要な変更点はほとんど同じ ● 他のターゲット向けにも、基本的には同じところを変更して あげれば動くと思います ● Android をのせてみるのは、本当に簡単 ● 初めての場合、難しいのは Linux Kernel の部分ですの で、既に Linux が動作している実機を用意した方が良いと 思います。 ● カメラとか GPS とかセンサーとか無線 LAN を動かしたい 時はそれなりに手間です。 (いずれどこかに整理したいと思っています)
  • 44. 変更するところ ● 以下の環境変数を設定してみる( Froyo での例) – TARGET_ARCH_VARIANT – WITH_JIT ● SD カードを認識させる – vold.fstab の設定( eclair までは vold.conf ) ● 複数のターゲット向けに環境を設定する – BeagleBoard や Armadillo 向けに、別々に環境を用意す るのはもったいないので、切り替えられるようにする
  • 45. 環境変数の設定 ● 設定例 ● TARGET_ARCH_VARIANT := armv7-a-neon WITH_JIT := true ● ● TARGET_ARCH_VARIANT に設定可能な値は、 build/core/combo/arch/arm/ に存在するものであれば可能 ● WITH_JIT は、 JIT コンパイラを有効にするかの設定で、 true にすると有効になる ● ビルド例 make TARGET_ARCH_VARIANT=armv7-a-neon WITH_JIT=true
  • 46. SD カードを認識させる ● vold.fstab の設定( Froyo ) ● # Mounts the first usable partition of the specified device dev_mount sdcard /mnt/sdcard auto /devices/platform/mmci-omap-hs.0/mmc_host/mmc0 ● ● vold.conf の設定( Eclair まで) ● ## This is the direct uevent device path to the SD slot on the device media_path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0 ● ● 設定すべき値を知る方法 ● # ls -l /sys/devices/platform/mmci-omap-hs.0/mmc_host/mmc0 -rw-r--r-- root root 4096 2000-01-01 00:00 uevent ● lrwxrwxrwx root root 2000-01-01 00:04 subsystem -> ../../../../../clas lrwxrwxrwx root root 2000-01-01 00:04 device -> ../../../mmci-omap-hs. drwxr-xr-x root root 2000-01-01 00:00 power -r--r--r-- root root 4096 2000-01-01 00:04 slot_name drwxr-xr-x root root 2000-01-01 00:00 mmc0:aaaa
  • 47. ターゲット向けの設定ファイルを作る ● device/ に設定ファイルを格納する – devices/sola/beagleboard/*** – devices/sola/armadillo500fx/*** ※eclair までは devices ではなく、 vendor でした ● 格納するファイルの例( BeagleBoard の場合) – AndroidBoard.mk – AndroidProducts.mk – BoardConfig.mk – beagleboard.mk – vendorsetup.sh
  • 48. AndroidBoard.mk ● 記述例 ● LOCAL_PATH := $(call my-dir) ● # board specific init.rc # PRODUCT_COPY_FILES += ● $(LOCAL_PATH)/init.rc:root/init.rc ● # vold # ● PRODUCT_COPY_FILES += $(LOCAL_PATH)/vold.fstab:system/etc/vold.fstab ● オリジナルの init.rc は system/core/rootdir にあります
  • 49. AndroidProducts.mk ● 記述例 PRODUCT_MAKEFILES := $(LOCAL_DIR)/beagleboard.mk
  • 50. BoardConfig.mk ● 記述例 # config.mk # # Product-specific compile-time definitions. # TARGET_NO_BOOTLOADER := true TARGET_NO_KERNEL := true TARGET_CPU_ABI := armeabi BOARD_USES_GENERIC_AUDIO := true USE_CAMERA_STUB := true TARGET_ARCH_VARIANT := armv7-a-neon WITH_JIT := true
  • 51. beagleboard.mk ● 記述例 # Superclass $(call inherit-product, build/target/product/generic.mk) PRODUCT_PACKAGES += LiveWallpapersPicker LiveWallpapers MagicSmokeWallpapers VisualizationWallpapers # Overrides PRODUCT_NAME := beagleboard PRODUCT_DEVICE := beagleboard PRODUCT_MODEL := beagleboard PRODUCT_BRAND := beagleboard PRODUCT_MANUFACTURER := beagleboard PRODUCT_LOCALES := ldpi hdpi mdpi ja_JP en_US
  • 52. vendorsetup.sh ● 記述例 add_lunch_combo beagleboard-eng
  • 53. ビルド方法 ● トップディレクトリで以下を実行する $ source build/envsetup.sh $ lunch beagleboard-eng ● ビルドした結果は generic ではなく、 beagleboard フォ ルダの下に格納されます out/target/product/beagleboard ● 他のターゲット(例えば armadillo440 )の場 合、 beagleboard のところを読み替えてください
  • 56. Android 起動直後に終了する ● capcake ( Android1.5 )でよく目撃した例
  • 57. 解決方法 1 ● BatteryService で状態をごまかす 詳細は、ブリリアントサービスさんのブログを参照。 バッテリードライバを見にいかず、 BatteryService でバッテリー FULL を返しています。 http://d.hatena.ne.jp/bs-android/20090603/1244043649
  • 58. 解決方法 2 ● バッテリードライバを組み込む 考え方は、方法 1 と同じ。方法 2 では、ドライバで常にバッテ リー FULL を返すようにする。 数十行で書けます。 実際に使うには、(株)パイロンさんの公開しているドライバ を使用するのが良いかと思います。 http://pylone.jp/blog/virtual_battery この方法の良いところは、 Android に手を入れる必要が無い こと。
  • 60. Android のロゴ点滅で無限ループ ● cupcake ( Android1.5 )から donut ( Android1.6 ) へのバージョンアップ時に目撃した例 ここから進まない
  • 61. 原因 ● センサーのライブラリ( system/lib/hw/sensors.xxx.so ) 元々は Android Dev Phone1 で donut を動かそうとした時、 起動しなくて調べました。 センサーのライブラリを外すと起動したため、センサーが原因 だと判断。 しかし、当時は Android Dev Phone1 向けのセンサーのソー スコードが公開されていなかったため、 cupcake 向けに自分 で実装したソフトで確認。 結果、センサーのライブラリに原因があると判明。
  • 62. 解決方法 ● センサーライブラリの修正例 #include <cutils/native_handle.h> /* donut */ /* <donut> static int control_open_data_source( struct sensors_control_device_t *dev ) */ static native_handle_t* control_open_data_source( struct sensors_control_device_t *dev ) /* <donut> */ { native_handle_t* handle; /* <donut> */ handle = native_handle_create( 1, 0 ); /* <donut> */ sensor_fd = open_sensors_phy( dev ); handle->data[ 0 ] = sensor_fd; /* <donut> */ /* return sensor_fd; *//* <donut> */ return handle; /* <donut> */ } /* <donut> int sensors_open( struct sensors_data_device_t *dev, int fd ) */ int sensors_open( struct sensors_data_device_t *dev, native_handle_t* handle ) /* <donut> */ { int i; sPendingSensors = 0; /* event_fd = dup( fd ); *//* <donut> */ event_fd = dup( handle->data[ 0 ] ); /* <donut> */ native_handle_close( handle ); /* <donut> */ native_handle_delete( handle ); /* <donut> */ for( i = 0 ; i < MAX_NUM_SENSORS ; i++ ) sensors[ i ].vector.status = SENSOR_STATUS_ACCURACY_HIGH; return 0; }
  • 64. Android のロゴ点滅で無限ループ(2) ● eclair ( Android2.1 )以降の目撃例 ● I/SystemServer( 123): Battery Service W/dalvikvm( 123): No implementation found for native Lcom/android/server/BatteryService;.native_ W/dalvikvm( 123): threadid=15: thread exiting with uncaught exception (group=0x4001b160) ● E/AndroidRuntime( 123): Uncaught handler: thread android.server.ServerThread exiting due to unca E/AndroidRuntime( 123): *** EXCEPTION IN SYSTEM PROCESS. System will crash. E/AndroidRuntime( 123): java.lang.UnsatisfiedLinkError: native_update ● E/AndroidRuntime( 123): at com.android.server.BatteryService.native_update(Native Method) E/AndroidRuntime( 123): ● at com.android.server.BatteryService.update(BatteryService.java:2 E/AndroidRuntime( 123): at com.android.server.BatteryService.<iniinit: untracked pid 117 t>(BatteryService.java:138) E/AndroidRuntime( 123): ● at com.android.server.ServerThread.run(SystemServer.java:140) E/AndroidRuntime( 123): Crash logging skipped, no checkin service I/Process ( 123): Sending signal. PID: 123 SIG: 9 ● D/BootAnimation( 133): SurfaceFlinger died, exiting... I/ServiceManager( 25): service 'package' died (省略)● I/ServiceManager( 25): service 'content' died E/installd( 32): eof E/installd( ● 32): failed to read size I/installd( 32): closing connection I/Zygote ( 118): Exit zygote because system server (123) has terminated
  • 65. 解決方法 1 ● Power supply class support を有効にする バッテリーのドライバは用意しなくてよい。 kernel config で、 CONFIG_POWER_SUPPLY を y にする。
  • 66. 解決方法 2 ● BatteryService で状態をごまかす cupcake の頃とは BatteryService.java の作りが違うので、 別の対応を行う。やることは同じ。バッテリー FULL を返す。 frameworks/base/services/java/com/android/server/BatteryService.java 197c197 < private native void native_update(); --- > // private native void native_update(); 200c200,204 < native_update(); --- > mAcOnline = true; > mBatteryPresent = true; > mBatteryLevel = 100; > mBatteryStatus = BatteryManager.BATTERY_STATUS_FULL; > // native_update();
  • 67. 解決方法 3 ● バッテリードライバを組み込む Android 起動直後に終了するで書いた通り。ドライバで常に バッテリー FULL を返すようにする。 数十行で書けます。 実際に使うには、(株)パイロンさんの公開しているドライバ を使用するのが良いかと思います。 http://pylone.jp/blog/virtual_battery この方法の良いところは、 Android に手を入れる必要が無い こと。
  • 69. Android のロゴ点滅で無限ループ(3) ● froyo ( Android2.2 )での目撃例 ● W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! ● W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( ● 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( ● 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! ● W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( ● 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( ● 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! ● W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady! W/MountService( 53): Waiting too long for mReady!
  • 70. 解決方法 1 ● Mount サービス無効化 SD カード使えなくなるのでおすすめしませんが、一応 frameworks/base/services/java/com/android/server/Mou ntService.java // if ("simulator".equals(SystemProperties.get("ro.product.device"))) { mReady = true; mUmsEnabling = true; return; // } // mConnector = new NativeDaemonConnector(this, "vold", 10, "VoldConnector"); // mReady = false; // Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName()); // thread.start();
  • 71. 解決方法 2 ● NativeDaemonConnector.java の修正 android-porting で同じ現象に関する投稿があり、既に解決済 みだった。 froyo weird timeouts? http://groups.google.co.jp/group/android-porting/browse_thr @@ -97,11 +97,12 @@ final class NativeDaemonConnector implements Runnable { LocalSocketAddress.Namespace.RESERVED); socket.connect(address); - mCallbacks.onDaemonConnected(); InputStream inputStream = socket.getInputStream(); mOutputStream = socket.getOutputStream(); + mCallbacks.onDaemonConnected(); + byte[] buffer = new byte[BUFFER_SIZE]; int start = 0;
  • 73. Android のロゴまで進まない ● init で kernel panic が発生して停止 ● kjournald starting. Commit interval 5 seconds EXT3-fs warning: maximal mount count reached, running e2fsck is recommended ● EXT3 FS on mmcblk0p3, internal journal EXT3-fs: mounted filesystem with writeback data mode. ● VFS: Mounted root (ext3 filesystem) on device 179:3. Freeing init memory: 132K Warning: unable to open an initial console. Kernel panic - not syncing: Attempted to kill init!
  • 74. 原因と解決方法 ● 原因は TLS Android で TLS を使うようになっていたため、発生した。 ARCH_ARM_HAVE_TLS_REGISTER が true しかし Linux Kernel では CONFIG_HAS_TLS_REG が無効。 そのため、現象が発生した。 Linux Kernel 側で有効であれば、問題無し。 または、 Android 側で使わないようにする。
  • 76. 加速度センサーを繋いだとき ● TDS01V (加速度、地磁気、気圧のセンサー) USB シリアル( FTDI のドライバ)で接続します
  • 77. Web カメラを繋いだとき ● USB 接続するタイプのもの
  • 78. 発生した現象 ● Linux では認識してるのに、 Android で触れない Linux 起動直後( Android 起動前)に確認した結果 加速度センサー ● [root@armadillo500 (ttymxc0) /]# ls -l /dev/ttyUSB* crw-rw-rw- ● 1 root root 188, 0 Jan 9 20:34 /dev/ttyUSB0 Web カメラ ● [root@armadillo500 (ttymxc0) ~]# ls -l /dev/video0 crw-rw---- ● 1 root root 81, 0 Jan 9 20:56 /dev/video0 Android 起動後に確認した結果 加速度センサー # ls -l /dev/ttyUSB* crw------- root root 188, 0 2000-01-09 11:39 ttyUSB0 Web カメラ # ls -l /dev/video0 crw------- root root 81, 0 2000-01-09 11:52 video0
  • 79. 解決方法 ● Android の init を変更する デバイスファイルのパーミッション設定に関しては、 system/core/init/devices.c に記載します。 static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 }, (省略) { "/dev/ttyUSB0", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/video0", 0660, AID_ROOT, AID_CAMERA, 1 }, { NULL, 0, 0, 0, 0 }, };
  • 81. 有線 LAN 使用時の問題 ● Linux では認識してるのに、ブラウザで Web ページを表 示できない
  • 82. 対処方法 1 ● init.rc で dns の設定を書いてあげる on boot のブロックに、 setprop net.dns1 8.8.8.8 を書く init.rc の抜粋 on boot ... setprop net.dns1 8.8.8.8 ...
  • 83. 有線 LAN 使用時の問題 ● Linux は認識してるのに Android で認識していない?
  • 84. 対処方法 2 ● ethernet support を移植 Android-x86 に実装されているので、必要な処理を持っ てきて動かしてみた 変更箇所についてはブログを参照 ethernet support http://blog.sola-dolphin-1.net/archives/2974043.htm
  • 85. 有線 LAN 使用時の問題解決? ● Android にネットワーク接続を認識させた結果
  • 87. ライブ壁紙を動かすのに必要なもの ● アプリケーションをインストールしても動作しない ● 必要なライブラリがインストールされていないのが原因 Android Zaurus の日記 NetWalker で Nexus One の Live Wallpaper http://d.hatena.ne.jp/androidzaurus/20100121/1264065376 ビルドは実行されており、以下にライブラリが出来ている。 out/target/product/<target>/obj/lib/librs_jni.so out/target/product/<target>/obj/lib/libRS.so ※<target> は環境によって異なる これらを、ターゲット環境の /system/lib/ へコピーする
  • 88. 何故インストールされない? ● Android.mk に LOCAL_MODULE_TAGS := optional があると、インストールされない 今回の場合、以下の 2 ファイル frameworks/base/libs/rs/Android.mk frameworks/base/graphics/jni/Android.mk
  • 89. (おそらく)正解な解決方法 ● 以下のように設定してビルドを行う device/sola/beagleboard/beagleboard.mk に、 PRODUCT_PACKAGES += libRS librs_jni を追記してビルドする。
  • 90. Ubuntu10.04 で cupcake 、 donut のビルドができない
  • 91. ビルドエラーの原因 ● gcc と g++ が 4.4 になったせい 色々とチェックが厳しいらしい ● 解決策としては、 gcc-4.3 と g++-4.3 をインストール。 ビルド時にこれらを使うようにする gcc-4.3 と g++-4.3 のインストール $ sudo apt-get install gcc-4.3 g++-4.3 gcc-4.3 と g++-4.3 を使用してビルドする $ CC=gcc-4.3 CXX=g++-4.3 make
  • 93. ビルドエラーの原因 ● master 、 froyo などのブランチは頻繁に修正が入りま す。運が悪いと、ビルド出来ない状態なことがあります。 ( cupcake の頃はとても酷かったです ... ) ● 使用するなら、 android-2.2_r1.1 や android-2.1_r2 のように、タグが付いているものの方が良いと思います。 ビルドエラーは出ない(はずです) ● 最近( 9/23 に取得)の master ではこんなのが ... Checking build tools versions... build/core/main.mk:72: ************************************************************ build/core/main.mk:73: You are attempting to build on a 32-bit system. build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2. build/core/main.mk:75: ************************************************************ build/core/main.mk:76: *** stop. 中止 .
  • 95. 起動画面を変更する ● 動画にする方法 – png 形式の画像を用意して、アニメーションを作れます 以下の順にデータを探しに行くようになっています。 /data/local/bootanimation.zip /system/media/bootanimation.zip zip 形式でアニメーションデータをまとめます $ ls desc.txt part0 part1 $ zip -r -0 bootanimation ./* dest.txt の中身 320 180 30 p 1 0 part0 p 0 0 part1 part0/part1 の中身は、 png 形式の画像データ
  • 96. ソース読みを楽にするために ● GNU GLOBAL – 普段よく使用しているソフト http://www.tamacom.com/global-j.html サンプル( VMware の仮想環境) http://sola-dolphin-1.net/data/android/image/gnuglob ユーザ名やパスワードは android Firefox のブックマークに参照先のリンクがあります ● OpenGrok – OESF のサーバで Android-2.2_r1.1 が公開されてます http://tools.oesf.biz/android-2.2_r1.1/
  • 97. A81-E ● BeagleBoard と同じ、 OMAP3 搭載 ● カスタム ROM を動かせるので、専用端末化するのに向い てる。 ● 独自イメージの起動方法 知りたい or やりたい?
  • 98. 今後やろうとしてること ● 個人&(横浜) PF 部等で情報を出していく まだ情報が少ない?らしいので ● 冬のコミケに申し込み中 ● そろそろ Android 以外のネタを