見出し画像

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.8

3.11.8で仮想環境を作るため、一時的にPythonバージョンを変える。

pyenv shell 3.11.8

仮想環境を作成するディレクトリに移動して、仮想環境を作成。
仮想環境名は、自分の場合の例です。

python -m venv android_venv

仮想環境をアクティベイト。

source ~/python/android/android_venv/bin/activate

きっと、pipが古いと言われるので、アップグレードしておく。

pip install --upgrade pip

kivy、buildozer、Cythonをインストールする。

pip install kivy buildozer Cython

buildozerの初期化

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ができた。長かった。

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

Twitterで見つけたひまりの画像が壁紙
スマホでもアプリが起動しました。

アイコンが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()


いいなと思ったら応援しよう!