先月kivyで動いたアプリをビルドしようと思ったのですがコンパイルエラーで止まってしまいました。
何度かリトライしたのですがどうしても出来ず放置してしまっていたのですが、この度再チャレンジしてやっと成功しました。
ビルド環境
サブ機のUbuntu desktopで作業してます。
❯ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy
❯ uname -a Linux ubuntu-nuc6cays 6.5.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Mar 12 10:22:43 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
❯ python3 -V Python 3.10.12
アプリは仮想環境で作成。
❯ source kivyapp/bin/activate ❯ pip list | grep -i kivy japanize-kivy 0.1.1 Kivy 2.2.1 Kivy-Garden 0.1.5 kivy-garden.matplotlib 0.1.1.dev0
- buikdozer.spec
最終形ですがコメントは除いて設定してあるのはこうです。
[app] title = PayPay analize tool package.name = PayPayAnalize package.domain = szkhome.lab source.dir = . source.include_exts = py,png,jpg,kv,atlas source.exclude_dirs = tests, bin, venv version = 0.1 requirements = python3==3.10.12, Cython==0.29.33, kivy, sqlite3, japanize-kivy, japanize-matplotlib, matplotlib, datetime garden_requirements = matplotlib orientation = portrait p4a.branch = release-2022.12.20 osx.python_version = 3 osx.kivy_version = 2.2.1 fullscreen = 0 android.permissions = INTERNET,CHANGE_WIFI_MULTICAST_STATE,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE,READ_EXTERNAL_STORAGE android.api = 30 android.minapi = 26 android.archs = arm64-v8a android.allow_backup = True ios.kivy_ios_url = https://github.com/kivy/kivy-ios ios.kivy_ios_branch = master ios.ios_deploy_url = https://github.com/phonegap/ios-deploy ios.ios_deploy_branch = 1.10.0 ios.codesign.allowed = false [buildozer] log_level = 2 warn_on_root = 1
エラー内容とリトライ記録
初回ビルドエラーはコンパイル出来ないよというものでした。
configure:3031: error: in `/home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/build/other_builds/freetype/arm64-v8a__ndk_target_21/freetype/builds/unix': configure:3033: error: C compiler cannot create executables
コンテナで実施
UbuntuデスクトップでビルドしたのですがXウィンドウの変数とかが障害になっているかも。
昔別のアプリを作ったときはコンテナ内ですんなり成功したので今回の環境が悪いのかもと思ってLXDをインストール。
事象変わらず。
過去に別アプリで実績があった環境ですがねぇ。
buildozer.specファイル見直し
公式から持ってきたサンプルファイルを編集していたのですがなるべくデフォルトのものが良いと思いbuildozer initで作成されたものを修正。
エラー同じ。
環境クリア
何回もリビルドして失敗しているのでゴミが残っているかもなのでbuildozer appcleanを実施。
エラー同じ。
アプリ名変更
エラー内容を良くみたらアプリ名にスペースがあるからビルド時のアプリディレクトリ名が途切れてる!?
libs_collections/'PayPay analize'/arm64-v8a -L/home/masashi/.buildozer/android/platform/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/21 conftest.c >&5 clang-14: error: no such file or directory: 'analize'/arm64-v8a/include/python3.1' clang-14: error: no such file or directory: 'analize'/arm64-v8a'
怪しすぎるのでスペースをハイフンに変更。
PayPay analize → PayPay-analize
パッケージ適切化
issueをいろいろ覗くとopen-jdkを17にしろとかcythonのバージョンをこれにしろとか出てきました。
おま環では困るので一応合わせてみます。
❯ python3 -V Python 3.10.12 ❯ cython -V Cython version 0.29.33 ❯ java --version openjdk 17.0.10 2024-01-16 OpenJDK Runtime Environment (build 17.0.10+7-Ubuntu-122.04.1) OpenJDK 64-Bit Server VM (build 17.0.10+7-Ubuntu-122.04.1, mixed mode, sharing)
仮想環境から脱出
kivy作成時は仮想環境で作っていたのですがbuildozerのドキュメントではnot recommendと書いてあります。
余計はことはせず仮想環境から抜けよう。
gradlewエラー
ここでエラー内容が変わってgradlew failed!というエラーに当たりました。
[INFO]: COMMAND: cd /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPay_analize && /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPay_analize/gradlew clean assembleDebug [WARNING]: ERROR: /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPay_analize/gradlew failed!
gradlewって何?と調べたらビルドを自動化するツールの様です。
正確にはgradleですが違いがまだわからない…
buildozerはこれにラップして動いているのかな?
ドキュメントを読みましたが単体では良くわからないのでエラー内容に戻ります。
するとこんなメッセージが。
[DEBUG]: > Task :mergeDebugResources FAILED [DEBUG]: /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPay_analize/src/main/res/values/strings.xml:4:4: Failed to flatten XML for resource 'app_name' with error: Invalid unicode escape sequence in string [DEBUG]: "{str}"
またアプリ名のエラーです。文字列が判別できてない? ハイフンもいれちゃダメなのか。
ということでPaypay-analize → PaypayAnalizeに修正して再〃チャレンジ。
ビルド成功
[INFO]: # Copying android package to current directory [INFO]: # Android package filename not found in build output. Guessing... [INFO]: # Found android package file: /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPayAnalize/build/outputs/apk/debug/PayPayAnalize-debug.apk [INFO]: # Add version number to android package [INFO]: # Android package renamed to PayPayAnalize-debug-0.1.apk [DEBUG]: -> running cp /home/masashi/buildozer/.buildozer/android/platform/build-arm64-v8a/dists/PayPayAnalize/build/outputs/apk/debug/PayPayAnalize-debug.apk PayPayAnalize-debug-0.1.apk WARNING: Received a --sdk argument, but this argument is deprecated and does nothing. No setup.py/pyproject.toml used, copying full private data into .apk. Applying Java source code patches... Applying patch: src/patches/SDLActivity.java.patch # Android packaging done! # APK PayPayAnalize-0.1-arm64-v8a-debug.apk available in the bin directory
やっと通りました。無事ビルド成功です。
ログが標準出力でバーッと流れるので追っかけて読むの大変ですがちゃんと読めばなんとかなりますね。
リダイレクトでもさせといたら早く気付けたかもな。
成功したもののandroidで動かしてないのでまだうまく行くかはわかりません。
まだ長い戦いになりそうです。