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追記 ここまで —
うまくいった方法
方法概略
- x86_64環境にしておく
- Homebrewのインストール
- pyenvのインストール
- Python 3.9.12のインストール
- pipenvのインストール
- Kivyのインストール
- Buildozerとそのdependenciesのインストール
- Buiidozerの実行
- 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公式サイトの
これ
と、それから
Buildozer公式サイトのこれ
の「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!
参考にしたサイト
記事中にリンクを記載しています