Fedora に Android Studio をインストールして、Android アプリを開発する最低限の環境を整えましたが[1]、ひとつ問題が残っていました。それは、Android 端末の実機を、USB を通して接続し、開発したアプリを実機で直接実行することを確認できなかったことでした。もしかすると Linux 版では実機の接続はサポートされていないか、もしくは、今回購入した型落ちの Android 端末 URBANO V02 では、Linux へ接続するのは無理なのかもしれないという不安がありました。
しかしその不安は杞憂でした。Fedora 側で メディア転送プロトコル (MTP, Media Transfer Protocol) をサポートするライブラリをインストールすれば接続できるはずだということが判ったためです。参考サイト [2] にぴったりの説明がありましたので、それにもとづき自分の環境 (Fedora 25 x86_64) で確認した結果を備忘録としてまとめました。
開発者向けオプションの設定 [Android]
まずは、Android 側で「開発者向けオプション」の設定が出来るようにします。デフォルトでは「設定」でこのオプションが非表示になっているので参考資料 [3] に従って表示させます。
とりあえず、「開発者向けオプション」では以下のように設定しました。
jmtpfs のインストール [Fedora]
jmtpfs は MTP 対応デバイスへアクセスするためのファイルシステムで、ユーザー空間でファイルシステムを作成する機能を提供する FUSE, Filesystem in Userspace と、MTP を実装したライブラリ libmtp をベースにしています[4]。
root 権限で jmtpfs をインストールします。
$ su パスワード: # dnf install jmtpfs ... ...
Android 端末を、Fedora が稼働している PC へ USB 接続します。念の為、dmesg コマンドで OS が Android 端末を認識しているかどうか確認します。マウントに成功すると、ファイルの中身を確認できます。
$ dmesg | tail
[ 2413.637244] usb 1-2: Product: KYOCERA_Android
[ 2413.637254] usb 1-2: Manufacturer: KYOCERA
[ 2413.637262] usb 1-2: SerialNumber: dce34c3086
[ 2430.772947] usb 1-2: usbfs: process 4908 (jmtpfs) did not claim interface 0 before use
[ 2430.929832] usb 1-2: reset high-speed USB device number 18 using xhci_hcd
[ 2431.101339] usb 1-2: usbfs: process 4908 (jmtpfs) did not claim interface 0 before use
[ 2431.101621] usb 1-2: usbfs: process 4883 (events) did not claim interface 0 before use
[ 2530.095480] perf: interrupt took too long (4011 > 4005), lowering kernel.perf_event_max_sample_rate to 49000
[ 3314.230265] usb 1-2: usbfs: process 4875 (gvfsd-mtp) did not claim interface 0 before use
[ 3316.737372] perf: interrupt took too long (5016 > 5013), lowering kernel.perf_event_max_sample_rate to 39000
$
Android 端末のマウント [Fedora]
root 権限で、マウントポイント(この例では /mnt/android)を作成し、jmtpfs コマンドで Android 端末のファイルシステムをマウントします。
# mkdir /mnt/android # jmtpfs /mnt/android Device 0 (VID=0482 and PID=0a74) is UNKNOWN in libmtp v1.1.11. Please report this VID/PID and the device model to the libmtp development team Android device detected, assigning default bug flags # ls /mnt/android 内部ストレージ # ls /mnt/android/内部ストレージ Alarms Download Movies Podcasts com.facebook.orca Android Effectplus Music Ringtones kindle Books IrDA Notifications amazonmp3 media DCIM LISMO Pictures com.facebook.katana #
Android Studio でアプリの実行 [Fedora/Android]
Android 端末のファイルシステムをマウントした状態で、Android Studio でプロジェクトのアプリをコンパイル・実行すると、接続するデバイス、USB 接続した Android 端末とシミュレーター (AVD, Android Virtual Device) のリストが表示されます。
同時に、Android 端末上では下記のメッセージが表示されますので、OK ボタンをタップします。
すると、Fedora の Android Studio 側では認証されたデバイスとして表示されますので、選択して OK ボタンをクリックします。
プロジェクトのアプリがビルドされると、Android 端末へ転送されて起動されます。なお、転送されたアプリ (My Application) は「その他のアプリ」にありました。
Android 端末のアンマウント [Fedora]
Fedora にマウントした Android 端末のファイルシステムをアンマウントするには、以下のように fusermount コマンドを使います。
# fusermount -u /mnt/android # exit
追記 [2017/03/31]
本記事を書いている時に PC と Android を接続するマイクロ USB ケーブルに悩まされていました。それは充電用に使うマイクロ USB コードと、データ通信用のものとを区別せずにごちゃごちゃに使っていためです。結局、データ通信用のケーブルを購入して専用に使うことにしたのですが、この USB ケーブルで Android を接続すれば自動的に Linux 側にマウントされることがわかりました。そもそも既に持っていた(デジカメのデータ通信用)USB ケーブルでも同じ結果になることも確認できました。
当初なぜそれに気が付かなかったのか謎だったので、カーネルのバージョン(現バージョンは kernel-4.10.6-200)を下げるなどして確認したのですが、バージョンを下げても自動的にマウントされることが確認できました。結局、Android の実機でアプリを動かしてみたい一心で、USB ケーブルの混用に悩まされる中で基本的なことをしっかり確認していなかった可能性があります。
ちなみに自動的にマウントされる場所は以下の場所でした。
$ mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=1962756k,nr_inodes=490689,mode=755) ... ... ... nfsd on /proc/fs/nfsd type nfsd (rw,relatime) tmpfs on /tmp type tmpfs (rw,nosuid,nodev,seclabel) /dev/mmcblk0p2 on /boot type ext4 (rw,relatime,seclabel,data=ordered) /dev/mmcblk0p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro) /dev/mapper/fedora-home on /home type ext4 (rw,relatime,seclabel,data=ordered) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime) tmpfs on /run/user/42 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=394956k,mode=700,uid=42,gid=42) tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=394956k,mode=700,uid=1000,gid=1000) gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) $ ls /run/user/1000/gvfs 'mtp:host=%5Busb%3A001%2C003%5D' $ ls /run/user/1000/gvfs/'mtp:host=%5Busb%3A001%2C003%5D' 'Internal storage' $ ls /run/user/1000/gvfs/'mtp:host=%5Busb%3A001%2C003%5D'/'Internal storage' Alarms Download Movies Podcasts com.facebook.orca Android Effectplus Music Ringtones kindle Books IrDA Notifications amazonmp3 media DCIM LISMO Pictures com.facebook.katana $
参考サイト
- bitWalk's: Android Studio と Fedora [2017-03-12]
- Linux でAndroid スマートフォンをストレージデバイスとしてマウントする - Qiita [2016-08-22]
- アプリを実行する | Android Developers
- jmtpfs: Exchanging files between Android devices and Linux | Jacquette Engineering
私の Java プログラマ歴は 20 年もありませんが、ぴったりな入門書が発売されましたので早速購入して教科書にしています。
にほんブログ村