PythonでAndroidアプリを作る
デスクトップアプリは、割と作りたいものを作ったのでスマホアプリを作る。
OSはLinuxです。
Pythonコードをパッケージ化するbuildozerが、Windowsには対応していないらしい。
まずは、Javaを入れておく。
→あとで17を入れ直します。
sudo pacman -S jdk-openjdk
buildozerは、Python3.12や3.13には対応していないみたいなので、3.11.8をいれる必要がある。
ということで、Python3.11.8をインストール。
pyenv install 3.11.83.11.8で仮想環境を作るため、一時的にPythonバージョンを変える。
pyenv shell 3.11.8仮想環境を作成するディレクトリに移動して、仮想環境を作成。
仮想環境名は、自分の場合の例です。
python -m venv android_venv仮想環境をアクティベイト。
source ~/python/android/android_venv/bin/activateきっと、pipが古いと言われるので、アップグレードしておく。
pip install --upgrade pipkivy、buildozer、Cythonをインストールする。
pip install kivy buildozer Cythonbuildozerの初期化
buildozer init簡単なコードを用意する。
上記.pyのあるディレクトリに移動して、ビルドする。
buildozer -v android debug初回はいろんなダウンロードがあるので時間がかかる。
30分くらいかかったかも。
そして失敗。
たぶん、自分の環境がArch Linuxだからだと思いますが、zipがなくて失敗したっぽい。
たしかにunzip は入れてあるけど、zipは入れてない。
なので、zipをいれる。
sudo pacman -S zip再度、ビルド。
またエラー。
AIに聞いてみると、Gradleを使うには、Javaが新しすぎるのが原因、と。
11をいれないとダメだというので、11をいれる。
sudo pacman -S jdk11-openjdkんで、切り替える。
sudo archlinux-java set java-11-openjdk再度、ビルド。
エラー。
ログをみると、Javaは17じゃないとダメ、みたいなことが書いてある。
なので17をいれる。
sudo pacman -S jdk17-openjdkんで、切り替える。
再度、ビルド。
できたっぽい!

apkをUSBでスマホに転送してインストール。
公式じゃないので、ウイルスが〜とか言われるけど、自分で作ったやつなので、無視してインストール。
無事にスマホでも表示されました。


アイコンがPythonなのと、起動するときにPython〜とかって出るのと、起動がけっこう遅いのが気になるけど…
Unityよりはましかな?
アイコンと起動するときのロゴは変えれるっぽいので、最後の仕上げで変えやんとな…
今日はもうちょっとだけ頑張って背景画像の表示とボタンの移動をしました。

まだ、コードも短いので全文投下。
main.py
#!/home/shu/python/android/android_venv/bin/python
"""
機能:ボタンを押すだけのアプリ
"""
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.config import Config
# デバッグ用にPC上でもスマホみたいな縦長表示にする。
Config.set('graphics', 'width', '360')
Config.set('graphics', 'height', '640')
class MyRoot(FloatLayout):
def say_hello(self):
print("Hello! Himari!!")
class Basic(App):
def build(self):
return MyRoot()
"""
機能:メイン関数
注意:コールする関数名と.kvのファイル名を一致させる(大文字小文字は無視)
"""
if name == 'main':
Basic().run()basic.kv
<MyRoot>:
orientation: 'vertical'
Image:
allow_stretch: True
keep_ratio: True
source: "image/komari.png"
size: self.parent.size
pos: self.parent.pos
Button:
text: "Push!!"
size_hint: 0.3, 0.05
pos_hint: {"center_x": 0.5, "center_y": 0.06}
on_press: root.say_hello()