LinuxでAndroidアプリケーションを開発したい!!
Android OS上のアプリケーションにTensorflow LiteのAIモデルを挿入することなどを考えると、Ubuntu上でAndroidアプリケーションを開発できるようにしておいたほうが楽なのかなぁと思い立ち、Ubuntu22.04上にAndroid Studioをインストールしてみました。 思いの外、Linux上でAndroid Studioを実行する手順が見当たらなかったり、セットアップに手間取ったり しましたのでQiitaの記事としてまとめました。
MacBook Pro上に開発環境を構築する方法は以下にまとめました
今回、開発にあたって選択した機材は下記の通りです。
- Ubuntu Desktop 22.04
- Intel Core i7-6700
- RAM 32GB
- 1TBのNVMeストレージ
- NVIDIA GeForce RTX3060Ti
- NVIDIA GeForce GT710 でも動作確認済
- Blackview BV5200
今回の開発環境を選定した理由
今回のスペックに至った理由をいくつか説明しておきます。
物理デバイスにはBlackview社のBV5200を選択
今回は、以前にAndroidアプリを開発しようと考えて購入したAndroid12ベースのOSを搭載した 「BV5200」 を開発の物理デバイスに選択しました。スペックはCortex-A53 2.0GHz Quad で4GB RAMを搭載している無難な構成です。本当に開発したいのはミッドレンジのAIも実行可能で4.0TOPSの性能を誇る VIA Technologies社のシングルボードコンピュータ「VAB-5000」 なのですが、届くまでAndroid開発を体験するつなぎとして採用しました。
Androidのエミュレータが起動しない問題の対策にGPUを搭載
GPU(グラフィックボード)無しで開発環境を構築した際、Android Studioで仮想デバイス(エミュレータ)を実行しようとすると、下記のエラーメッセージが出てしまいました。海外のフォーラムやQiitaの各種記事を参照したのですが、解決策として提示してあった下記の対策では回復できなかったため、今回の開発環境には グラフィックボード「GTX3060Ti」 を搭載してグラフィクスに関するコンピューティングリソースを追加することにより回避しました。 なお、インストールするドライバは異なりますが、安価なグラフィックボードのGeForce GT710でも動作することを確認 しています。目的にあわせてご選択ください。
「The emulator process for AVD * has terminated.」
問題解決のために下記の記事を参照しましたが、問題の解決には至りませんでした。
Yocto ProjectでLinuxを開発する予定がある
本来ならUbuntuには最新の安定化バージョンである 「Ubuntu24.04」 を選択すべきなのですが(実際、本手順はUbuntu24.04でも有効です)、今回は 「Ubuntu22.04」 を選択しました。理由は、開発したいボードVIA Technologies社のシングルボードコンピュータ「VAB-5000」 がAndroid OSに加えて 「Yocto 4.0」 もサポートしており、Yocto Project 4.0.23のLinuxビルド環境のRequirementがUbuntu22.04だったためです。他の開発を想定していない、Androidのみを開発されたい方は 「Ubuntu24.04」 を選択したほうが良いと思います。
Tensorflow LiteのAIモデルをビルドする予定がある
今回は開発後期で、Android OSの提供するAIモデル実行機能である 「Neural Network API」 や 「Tensorflow Lite」 を利用したいと考えています。そのため、ディープラーニングの学習をはじめとする高負荷なワークロードも実行できるためには Android開発であってもコンピューティングリソースとしてのGPUは欠かせない と考えました。そのため、CUDAを利用できるNVIDIA製のGPUを搭載しています。
それでは、早速構築手順について解説させていただきます。
インストール手順
Intel Virtualization Technologyを有効化する
Ubuntu上のAndroid Studioで仮想デバイスを利用するには 「Intel VT-x」 が必要です。そこで、まず開発環境をインストールするPCのBIOS/UEFIを開き、CPU設定から 「Intel Virtualization Technology」を有効化 します。この有効化によりUbuntu上に 「/dev/kvm」 というデバイスファイルを作成できるようになります。
Ubuntu22.04をインストールする
Ubuntu22.04のインストーラをUSBフラッシュに書き込んで、起動します。このとき、 私の環境の構成の問題かと思いますが、RTX3060TiのHDMI出力が映らない という不具合が生じたため、オンボードHDMIにディスプレイを接続してインストール作業を行いました。GPUのドライバをインストールするまでオンボードHDMIを利用します。
インストールオプションには、定番の設定を使います。
- Normal Install
- Erase disk and install Ubuntu
ホームディレクトリから日本語ディレクトリを除外する
日本語ディレクトリは何かと問題を引き起こすため、英語名のディレクトリにします。ディレクトリ変更後はすぐに再起動してください。再起動が行われるまで、各種アプリケーションは日本語ディレクトリを操作しようとします。
# 英語(LANG=C)でホームに含まれるディレクトリを再構築する
$ LANG=C xdg-user-dirs-gtk-update
# 再起動後から利用されるようになる
$ reboot
最新のパッケージに更新し、開発ツールをインストールする
Ubuntuインストール後は、オーソドックスな手順で環境を整えます。
# すべてのパッケージを最新に更新する
$ sudo apt update
$ sudo apt upgrade
# 開発に利用するツール類をインストールする
## 日本語対応のibus-mozcはSettingsから別途設定する
$ sudo apt install vim git curl wget openssh-server ibus-mozc
$ im-config -n ibus
# SSH-deamonの有効化
$ sudo systemctl start ssh
$ sudo systemctl enable ssh
# 再起動
$ sudo reboot
日本語入力の設定は 再起動後に「Settings」の「Keyboard」 から変更できます。
GPUのドライバをインストールする
GeForceドライバのインストール
汎用グラフィックドライバ「nouveau」が勝手にロードされて、GeForceドライバと衝突しないようにGeForceドライバをインストールする前にnouveauを無効化しておきます。
# 新しくモジュールのロードに関する設定ファイルを作成する
## ファイルの中身は以下
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
# 保存したら次のコマンドを実行し、起動構成を変更
$ sudo update-initramfs -u
# 再起動
$ sudo reboot
またNVIDIAのドライバは セキュアブートとも衝突するため、BIOS/UEFIで無効化 しておきます。以下はPRIME H-270 Proの場合の設定方法です。セキュアブート有効と表示されていますが、 非UEFIモードにすることにより衝突を避ける ことができるようでした。
Ubuntuを起動し、NVIDIAのGPUが搭載されていることをlspci
コマンドで確認し、ubuntu-drivers
コマンドでドライバを検索、適当なドライバをインストールします。
# デバイスが接続されていることを確認します
$ lspci | grep -i vga
# 00:02.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06)
# 01:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060 Ti Lite Hash Rate] (rev a1)
# 古いドライバが入っていないか確認し、削除します。
$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
$ sudo apt update
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
# 対応ドライバを検索します
$ ubuntu-drivers devices
# == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
# modalias : pci:v000010DEd00002489sv00001462sd00008D9Bbc03sc00i00
# vendor : NVIDIA Corporation
# model : GA104 [GeForce RTX 3060 Ti Lite Hash Rate]
# driver : nvidia-driver-545-open - distro non-free
# driver : nvidia-driver-560 - third-party non-free recommended
# driver : nvidia-driver-550-open - third-party non-free
# driver : nvidia-driver-535 - distro non-free
# driver : nvidia-driver-550 - third-party non-free
# driver : nvidia-driver-545 - distro non-free
# driver : nvidia-driver-470-server - distro non-free
# driver : nvidia-driver-565-open - third-party non-free
# driver : nvidia-driver-535-server - distro non-free
# driver : nvidia-driver-535-open - distro non-free
# driver : nvidia-driver-470 - distro non-free
# driver : nvidia-driver-535-server-open - distro non-free
# driver : nvidia-driver-565 - third-party non-free
# driver : nvidia-driver-560-open - third-party non-free
# driver : xserver-xorg-video-nouveau - distro free builtin
# ディスプレイドライバが格納されているリポジトリを登録します
$ sudo add-apt-repository ppa:graphics-drivers/ppa
# ドライバをインストールします(※ここでは550を選択しました)
### GeForce GT710を選択する場合は nvidia-driver-470 を指定
$ sudo apt install nvidia-driver-550
# ドライバを反映させるために再起動します
$ sudo reboot
再起動後に nvidia-smi
を実行し、GPUを認識できていることを確認しましょう。HDMIケーブルもRTX3060Tiグラフィックボード側に接続して問題ありません。
# GPUデバイスが見えることを確認する
$ nvidia-smi
# Tue Dec 24 11:03:17 2024
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 550.142 Driver Version: 550.142 CUDA Version: 12.4 |
# |-----------------------------------------+------------------------+----------------------+
# | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
# | | | MIG M. |
# |=========================================+========================+======================|
# | 0 NVIDIA GeForce RTX 3060 Ti Off | 00000000:01:00.0 On | N/A |
# | 37% 30C P8 13W / 200W | 535MiB / 8192MiB | 0% Default |
# | | | N/A |
# +-----------------------------------------+------------------------+----------------------+
#
# +-----------------------------------------------------------------------------------------+
# | Processes: |
# | GPU GI CI PID Type Process name GPU Memory |
# | ID ID Usage |
# |=========================================================================================|
# | 0 N/A N/A 978 G /usr/lib/xorg/Xorg 201MiB |
# | 0 N/A N/A 1189 G /usr/bin/gnome-shell 125MiB |
# | 0 N/A N/A 1845 G ...irefox/4848/usr/lib/firefox/firefox 196MiB |
# +-----------------------------------------------------------------------------------------+
GT710の場合は以下のように表示されます。
$ nvidia-smi
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 470.256.02 Driver Version: 470.256.02 CUDA Version: 11.4 |
# |-------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
# | | | MIG M. |
# |===============================+======================+======================|
# | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 N/A | N/A |
# | 50% 41C P0 N/A / N/A | 330MiB / 1999MiB | N/A Default |
# | | | N/A |
# +-------------------------------+----------------------+----------------------+
#
# +-----------------------------------------------------------------------------+
# | Processes: |
# | GPU GI CI PID Type Process name GPU Memory |
# | ID ID Usage |
# |=============================================================================|
# | No running processes found |
# +-----------------------------------------------------------------------------+
CUDAとcuDNNのインストール
コンピューティングリソースを活用できるCUDAとcuDNNをインストールします。 なお、本手順はAndroidアプリケーションの開発に直接関係ありません。CUDAを使う予定のない方や、CUDA向けリソースが十分でないGT710等のデバイスを利用されている方は読み飛ばしてください。
CUDAのインストール
上記のサイトにて構成を選択するとインストールに利用するコマンドを入手できます。以降はこれに従ってインストールします。
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
$ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo cp /var/cuda-repo-ubuntu2204-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-6
cuDNNのインストール
cuDNNも同様にサイトの指示に従えばインストールすることができます。
$ wget https://developer.download.nvidia.com/compute/cudnn/9.6.0/local_installers/cudnn-local-repo-ubuntu2204-9.6.0_1.0-1_amd64.deb
$ sudo dpkg -i cudnn-local-repo-ubuntu2204-9.6.0_1.0-1_amd64.deb
$ sudo cp /var/cudnn-local-repo-ubuntu2204-9.6.0/cudnn-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cudnn
$ sudo apt-get -y install cudnn-cuda-12
以降、Android開発環境のセットアップに戻ります。
Androidアプリケーション開発環境を構築する
以上でAndroid Studioを実行するための準備が整いましたので、Android Studioをインストールし、Androidアプリケーションの実行に必要な仮想デバイスと物理デバイスを含んだ開発環境をセットアップしていきましょう。
Android Studioをインストールする
まず、下記のサイトへアクセスしAndroid Studioをダウンロードします。
ダウンロード後、Android Studioの実行に必要なパッケージをインストールし、Android Studioが格納されているアーカイブファイルを展開、今回は /opt/android-studio
にインストールしました。
# Android Studioの実行に必要なパッケージをインストール
$ sudo apt update
$ sudo apt install libc6:i386 libncurses6:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
# Android Studioのアーカイブを展開
$ tar -zxvf ~/Downloads/android-studio-2024.2.1.12-linux.tar.gz
# Android Studioを/opt以下に格納
$ sudo mkdir -p /opt
$ sudo mv android-studio/ /opt/
# Android Studioにパスを通す
$ vi ~/.bashrc
# 下記の一文を .bashrc の末尾へ追記
export PATH=/opt/android-studio/bin:$PATH
# .bashrc を読み込みなおす
$ source ~/.bashrc
# Android Studioの初期設定を開始する
$ studio.sh
studio.sh
を実行するとAndroid Studioの初期設定が開始されます。
インストールタイプは 「Standard」 で大丈夫です。
ライセンスの確認画面が出ますので、問題なければ 「Accept」 を選択します。
最後に 「Finish」 を押すとWebから必要なファイルを収集しながら、Android Studioの環境構築が行われます。この環境構築を実施した後は studio.sh
でなく studio
でAndroid Studioを起動しましょう。
すべてのダウンロードが終わると下記の画面になります。Finishを押した後、開発画面が表示されますが、 Android Studioから利用する仮想デバイスと物理デバイスを利用するための設定が必要なため、ここではAndroid Studioを終了してください。
Android Studioから仮想デバイスと物理デバイスを制御するための設定を行う
Androidから仮想デバイス、物理デバイスへアクセスするための制御は 「Android Debug Bridge(ADB)」 が担当しますので、ADBをインストールして、ADBをへユーザーから操作できるように設定を行う必要があります。このあたりはWindows版/macOS版のAndroid Studioのほうが楽ですね。
物理デバイスを制御するための設定を行う
まず、Android Debug Bridge(ADB)をインストールします。
# Androidの物理デバイスを接続した際に制御できるよう
# 現在のユーザーを plugdev グループへ追加する
$ sudo usermod -aG plugdev $LOGNAME
# ADB関連パッケージをインストールする
$ sudo apt update
$ sudo apt install android-sdk-platform-tools-common
$ sudo apt install android-tools-adb
# インストール内容を反映させるために再起動する
$ sudo reboot
# adbコマンドが実行できることを確認する
$ adb version
# Android Debug Bridge version 1.0.41
# Version 28.0.2-debian
# Installed as /usr/lib/android-sdk/platform-tools/adb
続いて、PCから物理デバイスを制御する設定をします。まず、 PCに物理デバイスをUSBで接続し、USBのベンダーIDを確認した後、これを設定ファイルへ追記し、PCを再起動 します。接続する物理デバイスは、Android Studioから操作できるように開発者モードに切り替えてください。Androidの物理デバイスを開発者モードに切り替える手順は下記のサイトをご参照ください。
物理デバイスの接続手順を以下に示します。
# PCにデバイス(MediaTek SoC)が接続されていることを確認します
# 以下の例では 0e8d:201c が対象のデバイスとなります
$ lsusb
# ...
# Bus 001 Device 006: ID 0e8d:201c MediaTek Inc. BV5200
# ...
# 特に設定していない状態ではAndroidデバイスは見えません
$ adb devices
# List of devices attached
# * daemon not running; starting now at tcp:5037
# * daemon started successfully
# Androidデバイスを認識するためのルールを追加します
$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"
# 上記の内容を記入します。ATTRの0e8dはlsusbの値と合わせてください
# ルールに実行権限を与えます
$ sudo chmod a+r /etc/udev/rules.d/51-android.rules
$ ls -l /etc/udev/rules.d/51-android.rules
# -rw-r--r-- 1 root root 71 12月 23 20:33 /etc/udev/rules.d/51-android.rules
# 再起動します
$ sudo reboot
# 再起動後、開発者モードに切り替えUSBデバッグを有効にしたAndroidを接続すると
# 下記のようにadb devicesからデバイスを参照できるようになります
$ adb devices
List of devices attached
BV5200NEU0003164 device
仮想デバイスを制御するための設定を行う
仮想デバイスの実行にはCPUの仮想化機能である「Intel VT-x」が必要です。先の手順でBIOS/UEFIにて 「Intel Virtualization Technologie」を有効 にしていますので、ここでは関連するアプリケーションのインストールと、パーミッションの設定を行います。
# 仮想デバイスを制御するための
# /dev/kvm の利用に必要なパッケージをインストールする
$ sudo apt install cpu-checker
$ sudo apt install qemu-system-x86 libvirt-daemon-system libvirt-clients bridge-utils
$ sudo reboot
# Intel VT-xをOSから認識できているか確認する
$ kvm-ok
# INFO: /dev/kvm exists
# KVM acceleration can be used
# kvmを操作できるグループが生成されているか確認する
$ grep kvm /etc/group
# kvm:x:127:
# kvmのパーミッションを確認する
$ ls -al /dev/kvm
# crw-rw---- 1 root kvm 10, 232 12月 23 21:30 /dev/kvm
# 現在のユーザーをkvmグループへ追加し /dev/kvm を操作可能にする
$ sudo adduser $USER kvm
# 再起動して変更内容を反映する
$ sudo reboot
以上でAndroid StudioによりAndroidアプリを開発する準備は完了です。
Androidのサンプルアプリケーションを実行する
Androidアプリケーションの開発準備が整いましたので、 早速テンプレートのソースコードを使って、仮想デバイスと物理デバイスでアプリケーションを実行できることを確認していきましょう。
ソースコードを準備する
まず studio
コマンドを実行し、Android Studioを起動します。起動後、下記の画面になりますので、まず 「New Project」 を選択してください。
アプリケーションの種類は、今はサンプルですので 「Empty Activity」 を選択します。このアプリケーションは画面に"Hello, Android!"とのみ表示するものです。
Activityの設定を行います。今回利用する物理デバイスはAndroid 12ベースのOSを搭載しているため 「API31 ("S"; Android 12.0)」 を選択しました。このあたりは皆様がお手元で実際に利用されるデバイスに合わせてください。開発言語には推奨されている 「Kotlin DSL」 を選択しました。
「Finish」 を押下すると、ソースコードが自動生成されます。
ソースコードをコンパイルするには 画面左下の「ハンマー」のマーク(Build)をクリック します。ビルドに必要なリソースが自動的にWebからダウンロードされ、アプリケーションが完成します(初回のビルドは必要なリソースをダウンロードするため、やや時間がかかります)。ビルド完了後 「BUILD SUCCESSFUL」 の表示がでていることを確認してください。
ビルドしたアプリケーションは 画面上部の再生ボタン(RUN)で実行 できます。RUNをクリックすると、アプリケーションを実行するためのAndroid仮想デバイスが起動します。Android仮想デバイスは自身で定義することもできますが、まずはデフォルトの仮想デバイスで動作することを確認しましょう。
仮想デバイス上にアプリが起動し "Hello, Android!"と表示されます。 画面上部の赤い四角印をクリックすることでデバッグ実行を停止 することができます。
物理デバイスで実行したい場合は画面上部の 「Medium Phone API 35」 をクリックし、デバイスリストを表示し 「Blackview BV5200」 を選択した後に、RUNをクリックします。仮想デバイスと同様に、デバッグに利用することができます。
仮想デバイスと物理デバイスは画面右端にある「Device Manager」で管理されています。adb devices
コマンドで確認できるデバイスがここに表示されます。デフォルトの仮想デバイスでない仮想デバイスを利用したい場合は、 Device Managerの「+」をクリックし「Create Virtual Device」 をクリックし、以降はウィザードに従って利用したいデバイスを選択してください。 プリセットにないカスタムサイズのディスプレイを備えたデバイスなども定義可能です。
以上がLinux上でAndroidアプリケーションを開発するために必要な、Android Studioのセットアップと、それを実行するために必要な仮想デバイスと物理デバイスのセットアップ方法です。
是非みなさまの開発にお役立てください!