Raspberry Pi 4BにAndroid OSをセットアップする手順まとめ
はじめに
この記事では、Raspberry Pi 4BにAndroid OSをセットアップし、開発環境として活用する手順を解説します。Raspberry Pi 4BにはRaspberry Pi OSやUbuntuなど、複数のOSを導入できますが、本記事ではAndroid OSを対象とします。その背景は組み込み用途を見据えたAndroid OSの導入・アプリケーション開発を可能にすることです。これは、スマートフォンやタブレットで使用するAndroid OSとの明確な差別化点です。組み込みアプリケーションを導入したオリジナルなAndroid OSを自前で作ることも可能になります。
AOSPを使ったセットアップ
AOSPとは、Android Open Source Projectの略で、オープンソースのAndroidのOS開発のプロジェクトです。また、Raspberry PiでAndroidを実行するためのドライバサポートなどのプロジェクトとしてRaspberryVanillaというものがあり、そちらのmanifestファイルを使うことでRaspberry Pi 4B用のAndroid OSをビルドすることができます。今回の記事ではそちらを使ってビルドします。
今回の記事について
今回の記事では、下記記事を大いに参考にさせていただいています。よろしければこちらもあわせてご覧ください。
使用機材
- PC
スペックはビルド環境のセクションで記載しています。 - ディスプレイ
私はタッチ機能付きモニターを所有していないため、普段PCに使用している一般的なモニターを流用しました。タッチ操作できるものでもよいと思います。 - Raspberry Pi 4B
- MicroSDカード
32GBのものを使用しました。OSのイメージファイルは7GB程度なので、16GBあれば十分かと思います。また、私はUSB Type-Aポート搭載のMicroSDカードリーダーを使ってPCにつないだので、そちらもご用意あるとよいかもしれません。 - MicroHDMI-HDMIケーブル
Raspberry Piの画面描画に必要です。 - USB-TTLシリアルアダプタ(デバッグ用)
- ジャンパ線メスーメス3本(デバッグ用)
上記デバッグ用に使用した機材2つは、Android OSのセットアップ自体には必須ではありませんが、のちにアプリのデプロイなどで必要になるので用意しましょう。使い方は記事後半で解説します。
ビルド環境
- OS: Windows 11 64-bitの中にWSL2のUbuntu22.04を入れてそちらで実行しています。ネイティブのUbuntuでも同様の手順かと思います
- CPU: Intel® Core™ i7-13700K
- RAM: 32GB(うち24GBをWSL2のUbuntuに割り当て。後述ですが16GB以上割り当て必須です)
- ストレージ: 2TB(1TB程度空きがあります)
後にお話ししますが、ビルド手順の中に、環境によって注意が必要な箇所がありますのでお気を付けください。また、私の環境ではOSビルド時にRAMの使用量が100%になったりしたので、余裕がある人はもう少し容量の大きいRAMを使用することをおすすめします。
ビルド手順
- repoのインストール
repoはGoogleが提供する複数Gitリポジトリ管理ツールで、AOSPのソースコードを取得する際に使用します。cd mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
- repoの初期化
以下のコマンドは、使用するAndroidバージョンの構成情報(xml形式のmanifestファイル)を取得し、ビルド対象となるリポジトリ群のセットアップを行う手順です。ここでは AOSP のAndroid 13.0.0_r83
を指定しています。下記コマンドを実行することで、.repo/manifest.xml
に、指定したAndroidバージョンの構成情報(取得対象のリポジトリ一覧)が保存されます。この段階ではRaspberry Pi固有の構成は含まれていません。repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r83
- manifestファイルの上書き
Raspberry Pi 4Bに対応させるため RaspberryVanilla のmanifestファイルを.repo/local_manifests/
に追加します。これにより、次回のrepo sync
で必要なリポジトリが取得されます。curl -o .repo/local_manifests/manifest_brcm_rpi4.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_local_manifest/android-13.0/manifest_brcm_rpi4.xml --create-dirs
- ビルドに必要なリポジトリファイルの同期
repo sync
コマンドで、AOSPのビルドに必要なGitリポジトリをクローンします。このクローンするリポジトリには、Raspberry Pi 4BでAOSPをセットアップするのに必要な、RaspberryVanillaプロジェクトのリポジトリを含みます。ここで、repo sync -j4
-j4
と少なめに設定していますが、これは要求されるマシンスペックを考慮してのものとなります。sync
はリポジトリをクローンするだけなのでそこまで神経質にならなくてよいかもしれません。後述のビルドの際はスペックによってはjob数の指定はほぼ必須になるかと思います。 - ビルド対象の決定とビルド、イメージファイルの作成
以下のコマンドでビルド対象を決定します。ちなみに、ビルド対象をlunch aosp_rpi4_car-userdebug
とすると自動車用OSのAAOS(Android Automotive OS)をビルドすることになりますビルド対象を決定した後、以下のコマンドでビルドを行います. build/envsetup.sh lunch aosp_rpi4-userdebug
先ほど少し書きましたが、makeの際のjob数をmake bootimage systemimage vendorimage -j4
-j4
と少なめに設定しているのはビルド時に要求されるマシンスペックのシビアさが原因です。当初はjob数を明記せずビルドしていたのですが、CPU使用率が100%に張り付き、ビルドに何度も失敗しました。-j8
でもダメだったので、-j4
でビルドしています。一応それなりに新しい、intelの13世代Core i7を使用しているのですが・・・また、ここでRAMに関する制約もあります。使用できるRAMが16GBより少ないと、ビルドコマンド実行時に"RAMの容量が小さすぎる"といった警告メッセージが出力されビルドが行われません。RAMも16GB以上の十分な容量を確保しましょう。
ビルドが完了したら、以下のコマンドでRaspberry Pi 4B用のOSイメージを作成します。ここまで完了すると、./rpi4-mkimg.sh
out/target/product/rpi4
ディレクトリに、イメージファイル(.img)がビルドされます。こちらを、Raspberry Pi Imagerで焼きます。 - Raspberry Pi ImagerでイメージファイルをMicroSDカードに焼く。
Raspberry Pi ImagerでMicroSDカードに先ほど作成したイメージファイルを焼きます。Raspberry Pi Imagerのインストールはこちらから可能です。
https://www.raspberrypi.com/software/ - 起動する
イメージファイルの焼き込みが完了したら、SDカードをPCから抜き、Raspberry Pi 4Bに差し込みます。そして電源を入れてしばらく待つとAndroidのロゴが出現し、さらにしばらく待つとAndroidの画面が立ち上がります。
立ち上がった時のデスクトップ画像。この画像は、Raspberry Pi 4B上のAndroidでスクリーンショットを撮った後に後述のADBでPCに画像データを送って保存しました。
以上がRaspberry Pi 4BへのAndroid OSのセットアップ手順となります。
シリアル通信とADB(Android Debug Bridge)
ここまでのセクションの内容で、本記事の表題にあるセットアップの手順としては終了ですが、今後の開発やデバッグで必要となる開発用PCとAndroid OS入りRaspberry Pi 4B間のシリアル通信・ADB通信の手順を解説します。
シリアル通信を行う
- デバッグ用モジュールを作成しPCとRaspberry Pi 4Bを接続する
シリアル通信では、USB-TTLシリアルアダプタとジャンパ線(メスーメス3本)を使用し、アダプタのTTL側をジャンパ線でRaspberry Pi 4Bのピンに接続します。接続後、USB端子をPCに挿すことで通信が可能になります。まず、ジャンパ線でTTL側のRXをRaspberry Pi 4BのTX側に、TTL側のTXをRaspberry Pi 4BのRX側に接続し、GNDも接続します。
Raspberry Pi 4BとUSB-TTLシリアルアダプタの接続
そして、PCのUSBポートにUSB-TTLシリアルアダプタのUSB端子を接続します。 - gtktermでシリアル通信を行う
Windowsのteratermでもシリアル通信可能だとは思いますが、今回はWSL2 Ubuntu内のgtktermを使用して通信します。gtktermを立ち上げます(なければsudo apt install gtkterm
でインストールしましょう)。そしてConfiguration->Portを選択し、Baud Rateを115,200
に設定し、Portは/dev/ttyUSB0
に設定します(環境によってデバイスのポート名は異なるかもしれません)。そしてOKを押すとシリアル通信ができているはずです。たとえば、Raspberry Pi 4Bの起動前にRaspberry Pi 4BとPCをUSB接続し、gtktermでシリアル接続した状態でRaspberry Pi 4Bを起動すると、Raspberry Pi 4Bのブートシーケンスのカーネルログを取得することができます。以上でシリアル通信の手順は完了です。
ADB接続を有効化する
シリアル通信よりも複雑な通信を可能にするため、ADBを有効化します。ADBを有効化することで、ファイルデータのやり取りをしたり、開発したアプリをデプロイして実行することができるようになります。ADBを有効化するにはシリアル通信が必要なので、シリアル通信の接続を確認してからやってみましょう。
-
Android OSを、ADB接続したいPCと同じネットワークに接続する
Raspberry Pi 4BにはWi-Fiモジュールが内蔵されているので、Wi-Fi接続で大丈夫です。 -
シリアル通信でADBを有効化する
まず、シリアル接続をした状態でgtktermのコンソール内でEnterを押すと、以下の画像のように改行の後console:/ $
の記載が出てくるかと思います。
gtktermのコンソール画面
この状態のgtktermのコンソール(つまり、Raspberry Pi 4Bに接続しているコンソール)で以下のコマンドを実行します。su setprop service.adb.tcp.port 5555 stop adbd start adbd
ここまで終わると、Raspberry Pi側がADB接続を5555番ポートで受け付けるようになります。その後、下記コマンドでIPアドレスを確認します。
ifconfig wlan0
ここまでがgtktermでの操作で、再びUbuntu側のターミナル操作に戻ります。下記コマンドで、ADB接続を行います。
adb connect ipアドレス:5555
connected to ipアドレス
と出れば接続完了です。あとはadb
コマンドを使って画像の通信やアプリのデプロイが可能になります。ちなみに、ADB接続を切るときは以下のコマンドを実行しましょう。adb disconnect ipアドレス:5555
-
(おまけ) Android Studioで作成したHelloWorldKotlinアプリをデプロイする
Android StudioでHelloWorldKotlinアプリを作成し、apk
ファイルとしてビルドしたので、Raspberry Pi 4Bにデプロイしたいと思います。adb connect ipアドレス:5555
まで完了しているとします。以下のコマンドでアプリをインストールします# ***.apkはアプリのファイル名 adb install ***.apk
するとAndroidにアプリがインストールされており、実行するとアプリが実際に立ち上がります。
立ち上がったアプリ画面。HelloWorldが画面に表示されている
これでアプリのデプロイ環境まで確認することができました。ちなみに、アンインストールするときはファイル名ではなく、パッケージ名を選択する必要があります。コマンドは以下です。# ***はパッケージ名 adb uninstall ***
なお、パッケージ名は、プロジェクト内の
build.gradle
ファイル内に以下の場所に記述されていますandroid { defaultConfig { applicationId "com.example.app" // ← comなどもすべて含めてパッケージ名 } }
おわりに
本記事ではRaspberry Pi 4BにAndroid OSをセットアップするための使用機材やビルドの手順をまとめました。また、そのAndroid実機とPC間でシリアル通信やADB通信をするための手順を解説しました。
Discussion