macOS Monterey (12.4)のM1 MacBookでBuildozerを使って、Kivyで作ったアプリをapkにしてandroidエミュレータで表示するの巻

macOS Monterey (12.4)のM1 MacBookでBuildozerを使って、Kivyで作ったアプリをapkにしてandroidエミュレータで表示するの巻

はじめに

Buildozerの公式ページの通りにやってもビルドがconfigureでコケてうまくいかんのです。

どうやらこれはBuildozerで使っているpython-for-androidのbugのせいらしく、現在bugfix中の模様(2022年6月12日現在)。

Current default Python version (3.8.9) is failing to build on latest macOS releases #2568

で、このエラーを迂回してワタシの環境でうまくいった方法を記録しておくことにします。

実施環境

  • MacBook Pro, 2021 Apple M1 Proチップ
  • macOS Monterey バージョン12.4
  • Android Studio; Chipmunk | 2021.2.1 Patch 1 (のandroidエミュレータを使用)
  • Homebrew 3.5.1
  • Pyenv 2.3.1
  • Pipenv; version 2022.6.7
  • pip 22.1.2
  • Python 3.9.12
  • Buildozer 1.4.0.dev0
  • Kivy 2.1.0
  • Cython 0.29.19

*Homebrew以下、全部x86_64環境(ターミナルをRosseta2で開いた状態)で導入しています。

重要だったこと(たぶん)

ええっと、上述のgithubのページによると、

・Python 3.9.12

だったらうまくいく、と書いてありました。(実際うまくいきました。)

で、それに加えてあとは、

・x86_64環境で実施すること

が必要でした。

後者の情報を見つけられなかったので、arm64環境でビルドに失敗しまくって、ものすごい時間とられました。

arm64環境でやってると、Buildozerを走らせた時に

Build failed: Couldn't find executable for CC. This indicates a problem locating the /Users/******/.buildozer/android/platform/android-ndk-r23b/toolchains/llvm/prebuilt/darwin-arm64/bin/clang executable in the Android NDK, not that you don't have a normal compiler installed. Exiting.

のエラーで止まってしまってしまうのです。

この原因はこれくさい(あんまり自信ないけど)

Buildozer Build failed: Couldn’t find executable for CC

たしかにワタシの環境では「darwin-arm64」のディレクトリではなく

cd /Users/******/.buildozer/android/platform/android-ndk-r23b/toolchains/llvm/prebuilt
ls

としてみたら

darwin-x86_64

しかありませんでした。なんで?( ´▽`)

で、このままarm64環境でのBuildozerの実行について解決方法がわからずじまい。

なんか怪しかったので、x86_64で実施してみることにしました。そしたらうまくいきました。ラッキー。どこかに記載があったのを見落としてただけなのかもしれんけど。いやだわぁ。

— 2023.5.10追記 ここから —

さっき試したら、arm64環境でもビルドがうまく行くようになっていました。

なので、現在はx86_64環境にして実施する必要は無いようです。

実施環境はbuildozer 1.5.1.dev0 で、pyenvやpipenvの仮想環境なしでの実行です。

開発者のみなさんありがとう。。。

— 2023.5.10追記 ここまで —

うまくいった方法

方法概略

  1. x86_64環境にしておく
  2. Homebrewのインストール
  3. pyenvのインストール
  4. Python 3.9.12のインストール
  5. pipenvのインストール
  6. Kivyのインストール
  7. Buildozerとそのdependenciesのインストール
  8. Buiidozerの実行
  9. Android Studioのエミュレータを使ってアプリを表示

1. x86_64環境にしておく

— 2023.5.13追記 ここから —

現在(buildozer 1.5.1.dev0 )はarm64環境でもビルドがうまく行くようになっていますのでx86_64環境にするための作業はスルーして大丈夫です(ちなみに確認が取れているのはpyenvやpipenvの仮想環境なしの環境下で、です。pyenvやpipenv導入環境下では試していません)。

— 2023.5.13追記 ここまで —

まずはRosetta2でターミナルを開くことでx86_64環境にしておきます。

Finderから、「アプリケーション」=>「ユーティリティ」の「ターミナル.app」を右クリックして、「情報を見る」にある、「Rosettaを使用して開く」にチェックをいれてからターミナルを起動します。Rosetta2が入っていない場合はインストールが必要です。

ターミナルで

uname -m

してみて、

x86_64

となっていればOK、と。

2〜6.の手順を実行

x86_64環境下で、次のリンク先に記載のある方法に準じて2〜6の手順を実行します。

macOS Monterey (12.3)のM1 MacBookでPyInstallerを使って、Kivyで作ったアプリをappパッケージにするの巻

*仮想環境なしでの実施でもいいと思います。要はx86_64環境下でできればいいと思われますので、状況に合わせて好き好きで。

本記事のケースでは

Pythonのversionは3.9.12を、

Kivyのversionは2.1.0を指定しておきました。

注1;今回、Pythonインストール時に、env PYTHON_CONFIGURE_OPTS=”–enable-framework” の必要性があるかは調べてません。

注2;もし、Pythonのインストール中に

python-build: use zlib from xcode sdk

BUILD FAILED (OS X ….(以下略))

が出て止まっちゃったら

brew install zlib

をやってもう一度試してあげるといいかも(PATHも通してあげてください)。

というわけで、これでM1 macでx86_64環境下においてBuildozerをインストールする準備が整いましたよ、と。

注3;Cythonはこのあとインストールしますのでこの段階でインストールしなくてもいいです。

注4;ここでインストールするPythonのバージョンを.specの中で指定するバージョンと一致させないといけないのかどうか、いまいちわからなかったので、ここでは念の為一致させてます。 — 2023.5.10追記 バージョンを一致させる必要はなかったようです。。。追記ここまで —

7. Buildozerのインストール

pipenv shell

を打って、仮想環境に入っておきます。

Kivy公式サイトの

これ

Create a package for Android

と、それから

Buildozer公式サイトのこれ

Installation

の「Android on macOS」のところに準じて以下を実行します。

git clone https://github.com/kivy/buildozer.git
cd buildozer
sudo python setup.py install

からの

brew install openssl
sudo ln -sfn /usr/local/opt/openssl /usr/local/ssl
brew install pkg-config autoconf automake
python3 -m pip install --upgrade Cython==0.29.19 virtualenv 

~/.zshrcに以下を追加(zshを使っているので)

export PATH=$PATH:~/Library/Python/3.9/bin

8. Buildozerを実行

ディレクトリbuildozerから出て、もとのディレクトリに戻っておきます。

Buildozerを実行するディレクトリにKivyアプリのファイルを放り込んでおきます。

ここではボタンを表示するサンプルアプリを作って、 main.pyとmain.kvとして配置しています。

そしたら、

buildozer init

を実行します。で、生成した

buildozer.spec

において、

requirements = python3==3.9.12,hostpython3==3.9.12,kivy
p4a.branch = develop

としておきます。

*p4a(python-for-android)をdevelopブランチにしておかないとうまくビルドしてくれないっぽいです。

masterブランチのままだと、ここにあるエラーが出ちゃいました。

Buildozer Build failed: Couldn’t find executable for CC

はい、それでは、

buildozer -v android debug

を実行します。(android端末をつなげずに実行するので、「deploy」、 「run」無しで)

ちなみにワタシの場合、

buildozer -v android debug

を走らせると、

  File "/Users/******/********/********/.buildozer/android/platform/python-for-android/pythonforandroid/recipes/hostpython3/__init__.py", line 69, in get_recipe_env
    env["PKG_CONFIG_PATH"] = os.pathsep.join(
TypeError: str.join() takes exactly one argument (2 given)

とか言われてエラーが出たので、

/Users/******/********/********/.buildozer/android/platform/python-for-android/pythonforandroid/recipes/hostpython3/__init__.py

のコードの該当部分を

 65     def get_recipe_env(self, arch=None):
 66     ¦   env = os.environ.copy()
 67     ¦   openssl_prereq = OpenSSLPrerequisite()
 68     ¦   if env.get("PKG_CONFIG_PATH", ""):
 69     ¦   ¦   env["PKG_CONFIG_PATH"] = os.pathsep.join(
 70     ¦   ¦   ¦   [
 71     ¦   ¦   ¦   openssl_prereq.pkg_config_location, env["PKG_CONFIG_PATH"]
 72     ¦   ¦   ¦   ]
 73     ¦   ¦   )   
 74     ¦   else:
 75     ¦   ¦   env["PKG_CONFIG_PATH"] = openssl_prereq.pkg_config_location
 76     ¦   return env

として、

os.pathsep.join()

の内側がリストになるように [ ] を入れて修正しました。

気を取り直して、

buildozer -v android debug

を実行します。

すると、

# Android packaging done!
# APK myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk available in the bin directory

となりました。約20分かかりました。

binフォルダを確認したらapkファイルが鎮座しておりました。やっと出来た。ありがたや。

9. Android Studioのエミュレータを使ってアプリを表示

Android Studioを公式サイトからダウンロードしてインストールしておきます。

で、ここではAndroid Studioの「Virtual Device Manager」からdeviceを適当に、Pixel XLでAPI 33を選択してから起動することにします。

*なんかエミュレータが起動しないわってなった場合は、一旦Deviceを削除してから、また作成すれば起動するかも。

ドラッグアンドドロップでapkファイルをエミュレータに持っていって、インストールします。どきどき。

無事にアプリが起動しました。

めでたしめでたし。

おわりに

そのうち現在進行中のbugfixがなされると思うのですが、待ってられないので今できる方法を調べて実行しました、という話でした。

今回の様な迂回方法が早く過去のものになればいいのになと思います。ハマるから。。。開発してる方々頑張ってー。

おしまい。

・・・・

(2022年6月14日に追記 ここから)

いや、まだ終わりません。

サンプルに使ったアプリが動いたから喜んでいたのも束の間、

pandasとscipyをimportしたアプリを試したところ、Buildozerでのビルドでコケました。

で、いろいろ試した結果、pandasかscipyのどちらかをimportしていたらダメという結論に。

(ちなみにnumpyはOKでした。)

(2022年6月24日追記ここから)

↑numpyはOKというのは違っていました。numpyをrequirementsに記載してもapkへのビルドは通るのですが、アプリを起動してnumpyをimportしたら落ちちゃうことがわかりました。今のところ対処方法がわかりません。)

(2022年6月24日追記ここまで)

これらの解決策が見つからず、これ以上進めなくなりました(2022年6月14日現在)。

UbuntuでBuildozerを試してみるか。。。または気長にこれらのライブラリに対応するのを待つか。。。はたまた自分で対応するrecipeを作るか。。。とほほ。

おしまいのおしまい。

(2022年6月14日に追記 ここまで)


ちょっと広告です
https://business.xserver.ne.jp/

https://www.xdomain.ne.jp/

★LOLIPOP★

.tokyo

MuuMuu Domain!

参考にしたサイト

記事中にリンクを記載しています