paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

PayPayの支払いデータを自分で集計したい5 apkビルド編

先月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ですが違いがまだわからない…

docs.gradle.org

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で動かしてないのでまだうまく行くかはわかりません。
まだ長い戦いになりそうです。