UbuntuでAndroid端末を認識させる

UbuntuにAndroidアプリの開発環境を構築するところまでいったので、次は実機の接続に関して書いておきます。

●Windowsの場合
Windows版なら、AndroidSDKの配下のusb_driverの下にドライバがあるので接続してウイザードが起動したら、ここを指定してやれば基本OKです。
Galaxy sは別途kiesというツールを入れないとドライバ入らなかったです。
以下参照
https://coriandre.seesaa.net/article/201010article_11.html

●Ubuntuの場合
Ubuntu(Linux)には、デバイスドライバは特にありません。
ただ、Ubuntuでは外部のデバイスと接続するには、デバイスファイルが必要です。
/dev/xxxxxxxxってのです。
デバイスファイルは手動でも書けなくはないですが、カーネル2.6以降は新しいデバイスの接続、切断がカーネルから通知されるようになりました。
この通知をudevというプロセスがデーモンとして常駐(udevd)していて受け取って、デバイスファイルの作成、削除を良しなにやってくれる仕組みになっています。
試しにPSコマンドで見てみると、4ついますね。

oono@ubuntu:~$ ps -aux | grep udev
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
root 342 0.0 0.0 17032 1116 S 07:08 0:00 upstart-udev-bridge --daemon
root 344 0.0 0.0 17216 1028 S 07:08 0:00 udevd --daemon
root 475 0.0 0.0 17212 956 S 07:08 0:00 udevd --daemon
root 476 0.0 0.0 17212 908 S 07:08 0:00 udevd --daemon

ただ、udevも何も情報がないところからデバイスファイルを作れないので作る際の情報(ルール)を教えてあげる必要があります。
ルールは、「/etc/udev/rules.d」というディレクトリに置きます。
見てみると、あれ?数が少ないですね。
READMEを見てみると、ここにはローカルなルールを置けとありますね。
パッケージなどが見るルールは「/lib/udev/rules.d」にありました。
私が最初に見たのは8.04だったので、それから変わったのでしょうね。間違ってシステムが使うルールを改変したりすることがなくなるので良いことです。

●ルールの書き方
http://developer.android.com/guide/developing/device.html
のDeveloping on a Deviceの欄に手順が書いてあります。

/etc/udev/rules.d/51-android.rules
というファイルを新規で作って、以下の一文を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"

USBデバイスでベンダーIDが0bb4でパーミッションが0666で作成するという意味です。
ベンダーIDは各メーカが個別で重複しないように保持しています。
http://mcn.oops.jp/wiki/index.php?USB/PnP

そのため、接続するAndroid端末のベンダーIDを調べて指定する必要があります。

●ベンダーIDの調べ方
http://developer.android.com/guide/developing/device.html
の下の方にUSB Vendor IDsという欄があり、分かっているものの一覧があります。
このベンダーIDを使えば良いです。




ManufacturerUSB Vendor ID
Acer0502
Dell413c
Foxconn0489
Garmin-Asus091E
HTC0bb4
Huawei12d1
Kyocera0482
LG1004
Motorola22b8
Nvidia0955
Pantech10A9
Samsung04e8
Sharp04dd
Sony Ericsson0fce
ZTE19D2


この一覧に乗っていないベンダーの場合は、「lsusb」というコマンドで調べることが出来ます。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/510showusbdev.html

●実際に接続
手元にあるAndroid端末を使ってやってみました。

★NexusOne
接続してlsusbしても情報が出てきません。どうやらホストOS(Windows7)側に接続を持っていかれてるようです。
なので、VMWareの右下にあるアイコンを右クリックして「接続(ホストから切断)」を選択します。
アイコンが有効になって、点滅すればOKです。

画像


lsusbの実行結果が
Bus 001 Device 002: ID 18d1:4e12

51-android.rulesに以下を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"

NexusOneを抜き差しします。/dev/の下に以下のデバイスファイルが追加されていました。
brw-rw---- 1 root disk 8, 16 2010-11-14 15:39 sdb
crw-rw---- 1 root disk 21, 2 2010-11-14 15:39 sg2

Eclipseを起動してDDMSを起動します。Devicesに名前が表示され、OSも2.2.1になっています。
画像


AndroidSDKのtoolsの下へ移動してadb shellを実行しています。
ubuntu:~/software/android-sdk-linux_x86/tools$ ./adb shell
$ ls
config
cache
sdcard
acct
mnt
d
etc
system
sys
sbin
proc
init.rc
init.mahimahi.rc
init.goldfish.rc
init
default.prop
data
root
dev
$
ということでadbコマンドも実行可能なので問題なく接続しています。

以下同じなので省略しますが
Galaxy s
Bus 001 Device 004: ID 04e8:681c Samsung Electronics Co., Ltd

HT03-A
Bus 001 Device 006: ID 0bb4:0c02 High Tech Computer Corp.
何故かHT-03Aはルールを記述しなくても認識しました。

GDDフォン
Bus 001 Device 007: ID 0bb4:0c02 High Tech Computer Corp.
同じく何もしなくても認識されました。

IS01
Bus 001 Device 008: ID 04dd:9337 Sharp Corp.

ということで最終的に以下の記述を追記することでUbuntu上のEclipseおよびadbからアクセスできるようになりました。

SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04dd", MODE="0666"

この記事へのコメント

この記事へのトラックバック