Delphi/C++BuilderでビルドしたアプリをRaspberryPiで試験的に動かすためにRTAndroidをRasPiにインストールしてみる

※
この記事は内容が少し古くなっています。
RTAndroid 現在はメンテナンスされておらず、後継は Emteria OS https://emteria.com/ です。

また、Google から公開されている Android Things にも Raspberry Pi3 向けのイメージがあります。
https://developer.android.com/things/index.html


# えっ？ Delphi/C++BuilderのLinuxサポートってRasPiも含まれるんでしたっけ？

Delphi/C++Builderでは2017年3月にリリースした 10.2 Tokyo から Linux 向けのビルドに対応していますが、これは Intel x86_64 が対象です。ARM な RasPi は含まれません。（ただし今後のロードマップの調査研究課題には上がっています）

そんなわけで RasPi 向けに Delphi や C++Builder でアプリを書くことはできないのですが、[Delphiユーザの海外のMVPの方が、RTAndroidでDelphiアプリを動かす記事を書いている](http://fixedbycode.blogspot.jp/2016/12/running-delphi-applications-on.html
)らしいと言う話を耳にしました。

Delphi/C++BuilderはAndroid向けのアプリ開発も行えますが（ただしStarterエディションやMobile AddonナシのProfessionalエディションを除く）、RaspberryPiでAndroidが動くなら、Delphi/C++Builderで作ったアプリがRaspberry Piでも動くことが期待できます。

そこで、RasPiにRTAndroidをインストールしつつ、DelphiやC++Builderからのアプリがデプロイできる状況までをやってみることにします。

# 注意事項
この内容は Delphi/C++Builder で Raspberry Pi 上の RTAndroid 向けにアプリが作れることを保証するものではなく、単にこういうことも一応できる、という例です。

RTAndroidの使用は非商用の評価や個人向けに限定されるようなので、今回の内容もあくまで評価です。
http://qiita.com/mt08/items/2e6c1dcdde68259c0181

なお、Raspberry Pi 向けの Android については「Google、Raspberry Pi 3でAndroidを正式サポートか」という記事が過去に出ていました。
http://itpro.nikkeibp.co.jp/atcl/idg/14/481542/053000234/

この記事を見て以下のリポジトリを調べたのですが、残念ながら現時点(2016/12)でもリポジトリの中身は空っぽのようです。
https://android.googlesource.com/device/pifoundation/rpi3/

なお、Google は Android Things という名前で IoT 向けの Android を発表し、Developer Preview 版が公開されました。これは Intel Edison, NXP Pico, Raspberry Pi 3 向けのイメージが出ています。これに関する確認は別途やってみます。
https://developer.android.com/things/index.html

# 必要なものを準備する
さて、RasPiユーザには既知の話ではありますが、ハードウェアはこういうものが必要です。

- Rasrberry Pi3
- USB電源とUSBケーブル
- microSDHC 2枚
- USB接続のSDリーダー・ライター
- USB接続キーボードやマウス
- HDMI接続のディスプレイ

ここでは Delphi/C++Builder は使ったことがあるけど RasPi は使ったことが無い方向けにこれらをざっくり説明します。

## Raspberry Pi3
なにはなくとも、これが無いと始まらない。初代のRasPiやRasPi2ではだめです。そして電子基板を裸で使うわけにはいかんので、ケースも当然あったほうがよい。ヒートシンクをつけるかどうかは議論の余地があるでしょうけど、私はヒートシンクつけます。

## USB電源とUSBケーブル
RaspberryPi3は最大2.5Aなので、2A以上の給電ができるものを用意します。

また充電用のUSBケーブルも2A以上の電流が流れるものを用意します。

電源やケーブルのスペックが怪しい時はUSB用の電流電圧計を噛ませるか、またはワットチェッカー等にUSB電源をつけて確認すると良いです。どちらも持ってない場合はUSB電流電圧計を買いましょう。今時、Amazonでも数百円で買えますし、コレひとつあればUSBケーブルの生き死にがチェックできるので便利ですよ。

## microSDHC 2枚
8GB程度のものが2枚あると良いです。できるだけ速いやつ。読み書きが両方とも速い方が良いです。Class10とかUHS-Iなどの規格がありますけど、手持ちが複数あるならば、実際にベンチマークして速いやつを選ぶとなお良し。

2枚の使い分けですが、1枚はRaspbianをインストールし、もう一枚にRTAndroidを入れます。

えっ、なぜRaspbianが必要なのか分からない？ そりゃそうですよねー。

実はRTAndroidのインストーラはLinuxのシェル上で実行するスクリプトなのです。このLinuxは仮想環境よりも実環境の方が確実に動きます。その作業環境としてRaspbianを使うわけです。WSL（Windows Subsystem for Linux）の bash で動くかどうかは未検証です。あるいは仮想マシン上のLinuxで書くこともできるかもしれませんが、仮想マシンからUSBデバイスを操作するのは意外に手こずることがあるので、実環境のほうがよいです。

もしもLinuxが動く物理環境があるならば Raspbian は不要ですから microSDHCは1枚でOKです。

## USB接続のSDリーダー・ライター
RaspbianでmicroSDHCを焼く場合に必須です。USB2.0や3.0対応品をふつうに使って頂ければ問題なし。

## USB接続キーボードやマウス
RaspbianやRTAndroidの操作に使います。

## HDMI接続のディスプレイ
RaspberryPiの表示を受けるディスプレイが無いと作業できませんから、これも当然必須。

# 必要なものを準備する（RTAndroidとRaspbian）
まず、RTAndroidのウェブページはこちらです。
https://git.embedded.rwth-aachen.de/rtandroid/

そしてRasPi3向けのダウンロードはこちらから行えます。
https://git.embedded.rwth-aachen.de/rtandroid/downloads/raspberry-pi/

Raspbianのダウンロードはこちらから。初心者な方は "RASPBIAN JESSIE WITH PIXEL" のほうがGUIつきなのでおススメですよね。
https://www.raspberrypi.org/downloads/raspbian/


# 作業１：RTAndroidのインストール準備のためにRaspbianの環境を作る

素のLinux環境がある場合は飛ばして頂いて大丈夫です。

## Raspbian を microSDHCに焼く

焼き方の手順はここらへんに紹介されていますが、知っている方は普通に dd 相当で焼くだけですね。
https://www.raspberrypi.org/documentation/installation/installing-images/README.md

LinuxやmacOSでpvをインストールしている方は以下のように実行すると書き込みの進捗がリアルタイムに見れます。

```
pv 2016-11-25-raspbian-jessie.img | sudo dd of=/dev/[出力先] bs=1m
```

あるいは焼き方を説明しているブログ記事等は多数あるでしょうから、そういったものを参照していただければよろしいかと。

## Raspbianを起動してログインする
microSDHCを装着し、キーボードやマウス、ディスプレイを繋いだらあとはUSB電源と繋げは起動します。電源スイッチなんてものはありません。

インストール後の初期状態では sshd が起動しておらずリモートログインできないので、raspi-config から sshd の起動を有効化しておきます。

またシェルにログインする場合は初期のID/PWDは下記ページで説明されているように id = pi, password = raspberry ですね。
https://www.raspberrypi.org/documentation/linux/usage/users.md

## RTAndroid を Raspbian に転送する
sshdを有効化しているならば scp や sftp で転送すればよいですし、あるいはUSBメモリ等で物理コピーしても良いと思います。

# 作業２： RTAndroidを焼く。

基本的な焼き方はダウンロードページの後半のとおりですね。
https://git.embedded.rwth-aachen.de/rtandroid/downloads/raspberry-pi/

## microSDHCをUSB-SDアダプタ経由でRasPiに接続して、書き込み先デバイス名を確認する

まず最初に、USB-SDアダプタをさす前に "sudo fdisk -l" を実行します。すると、本体に装着したmicroSDHCが次のように見えているはずです。

```
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 31285247 31148032 14.9G 83 Linux
```

ここで USB-SDアダプタを装着して再度 "sudo fdisk -l" すると、上記とは別の microSDHC が見えているはずです。

```
Disk /dev/mmcblk0: 14.9 GiB, 16018046976 bytes, 31285248 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8fa6df17

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 31285247 31148032 14.9G 83 Linux

Disk /dev/sde: 15 GiB, 16088301568 bytes, 31422464 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa006a115

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sde1  *       2048  1050623  1048576  512M  c W95 FAT32 (LBA)
/dev/sde2       1050624  5244927  4194304    2G 83 Linux
/dev/sde3       5244928  6293503  1048576  512M 83 Linux
/dev/sde4       6293504 31422463 25128960   12G 83 Linux
```

この増えたデバイスは、上記の例だと /dev/sde がデバイス自身を表しており、/dev/sde[n] はパーティションを表しています。

RTAndroid の書き込みはデバイス自身を指定せねばならないのでこの場合は /dev/sde が書き込み先となります。

なお、fdisk -l の代わりに dmesg でデバイスの認識状況を見る、という方法もあります。

## RTAndroid のインストールスクリプトを実行する

シェル上から unzip するなりしてアーカイブを展開して、その中に含まれるインストーラを実行します。

```
unzip rtandroid-aosp-7.1-20161224-rpi3.zip
cd rtandroid
./install.sh -p -f /dev/[書き込み先デバイス名]
```

このときに書き込みデバイス名は前述の手順で確認したものを指定します。例示したケースだと ./install.sh -p -f /dev/sde となるわけですね。

なお、書き込みにはそれなりの時間が掛かりますから、しばらく放置しておいてください。

## 書き込み完了後の作業
書き込みが終わったmicroSDHCで起動して、RTAndroidのIPアドレスを確認しておいてください。ネットワーク接続方法はイーサネット接続でもWiFi接続でもかまいませんが、Delphi/C++Builderをインストールした機材からネットワーク的にアクセスできることが必要です。

# Delphi/C++Builderで作ったアプリを RTAndroid にデプロイする

# 作業３：Delphi/C++BuilderでAndroidにデプロイしてみる

## IDEが動く機材から RTAndroid に接続する
接続は "adb.exe connect [RTAndroidのIPアドレスまたはホスト名]" で行います。 

adb のインストールパスは Delphi/C++BuilderのIDEより[ツール]⇒[オプション]⇒[SDKマネージャ]で確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/3f789069-fc6f-fb2e-5761-39e02780aa5a.png)

確認できたら adb connect [RTAndroidのIPアドレスまたはホスト名] を実行します。スクリーンショットはホスト名で接続しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/149350/474ebf91-9689-f3ea-9c01-21b93ce017d8.png)

adb connect が成功した状態で adb shell "コマンド" を実行すると、ネットワーク経由で通信できていることが確認できます。

## IDEでビルドターゲットに "Raspberry Pi 3" が表示されることを確認して、ビルドを実行する。

ビルドターゲットを Android に変更して、"Raspberry Pi 3" を選択します。なお、Delphi/C++BuilderでAndroid向けのビルドを行うには FMX(FireMonkey フレームワーク) を使っている必要があります。従来の VCL は Windows だけの対応であることに注意が必要です。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/a1c35b1e-398b-b9b3-dd0e-59288755b0b8.png)

FMXプロジェクトなのに Raspberry Pi 3 が表示されていない場合は、プルダウンリストボックスの右側の再読み込みのアイコンをクリックしてみるとよいでしょう。

ターゲットをRasPi3に設定したらビルドします。ビルド中の画面はこんなカンジ。左のモニタはDelphi/C++BuilderのIDEの画面、右側はRTAndroidにつないでいます。右画面の「モデル」に Raspberry Pi 3 と表記されていますよね。

![ファイル_002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/149350/9edd95b4-2571-ca04-fff3-1ba478a0efbf.jpeg)


そしてビルドが終わるとご覧の通り。右のモニタではビルドしてデプロイしたアプリが動いています。

![ファイル_003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/149350/9deb102c-f9c8-ad5d-c200-426fe3bf6666.jpeg)

なお、ここでビルドしたアプリは、ウェブセミナー「Delphi/C++Builder Starter チュートリアルシリーズ シーズン１　第５回」向けに作成したサンプルアプリです。
https://github.com/kazinoue/2016_StarterTutorial_S1-5