Open4

PythonのKivyでAndroidアプリを作る

NoboNoboNoboNobo

あらかじめ必要なもの

Pythonはvirtualenv環境推奨かな。

pip install kivy buildozer setuptools Cython
brew install autoconf automake libtool openssl pkg-config
brew tap homebrew/cask-versions
brew install --cask homebrew/cask-versions/adoptopenjdk8

新規プロジェクト

mkdir project1
cd project1
buildozer init

「buildozer.spec」の設定をいじる形でターゲットアーキテクチャを指定したり、OSのバージョン指定などを行う。
iOSビルドもできるようだけど、今回はAndroid向けにまとめてみる。

usbserial4aを使いたい場合、アプリの起動ごとにパーミッションを求める挙動を諌めるには。

2つのファイルとbuildozer.specに2値指定することで、
AndroidManifest.xmlの出力にUSBデバイスのアタッチパーミッションがつく。
それでも初回起動では確認がある

buildozer.spec
...
android.manifest.intent_filters = intent_filter.xml
android.res_xml = device_filter.xml
...
intent_filter.xml
<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
device_filter.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x2e8a / 0x0003: RP2040 zero -->
    <usb-device vendor-id="11914" product-id="3" />

    <!-- 0x2e8a / 0x1039: RP2040 Lcd -->
    <usb-device vendor-id="11914" product-id="4153" />
</resources>

ビルド

buildozer -v android debug

インストール

ネットワーク接続経由の場合

adb connect <IP-ADDRESS>
adb install -r bin/myapp-0.1-arm64-v8a_armeabi-v7a-debug.apk

ロギング

adb logcat | grep python

はまりどころ

  • 端末の開発者モードを有効にする必要あり
  • IP接続がIPv6の場合IPv6で接続が必要な場合がある
NoboNoboNoboNobo

その他

  • 初回ビルドではめっちゃ時間が必要(0.5h〜1.5hくらい)
  • 意外ときめ細かい機能が揃っていた(一般にGLバックエンドなGUIフレームワークって穴が多い)
  • バンドルされるアセットファイルは拡張子とパスパターンの設定がbuildozer.specにあり、上手くロードできない時はその辺りを要確認
NoboNoboNoboNobo

Kivyすごいなぁ、標準の実装を呼び出さずに、標準っぽい挙動を作り込んでるー。

NoboNoboNoboNobo

コード署名方法

以下のコマンドでユーザーホーム/.keystoreにキーストアが作られる。
初回はキーストアのパスワードの設定・確認入力がある

keytool -genkey -dname "cn=localhost, ou=Personal, o=Personal, l=Sample, st=Osaka, c=JP" -alias CodeSign -keyalg RSA -keysize 2048

bundletool-all-1.15.6.jarをダウンロードしておき、以下のコマンドでapp.aabファイルにコード署名してapp.apksを出力する。

./keystore.passwordに上記のファイル作成で設定したパスワードを書いておくかオプション省略で都度入力する

java -jar bundletool-all-1.15.6.jar build-apks --bundle=app.aab --output=app.apks --ks=$(HOME)\.keystore --ks-pass=file:./keystore.password --ks-key-alias=CodeSign

インストール

java -jar bundletool-all-1.15.6.jar install-apks --apks=app.apks