Open4
PythonのKivyでAndroidアプリを作る
あらかじめ必要なもの
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で接続が必要な場合がある
その他
- 初回ビルドではめっちゃ時間が必要(0.5h〜1.5hくらい)
- 意外ときめ細かい機能が揃っていた(一般にGLバックエンドなGUIフレームワークって穴が多い)
- バンドルされるアセットファイルは拡張子とパスパターンの設定がbuildozer.specにあり、上手くロードできない時はその辺りを要確認
Kivyすごいなぁ、標準の実装を呼び出さずに、標準っぽい挙動を作り込んでるー。
コード署名方法
以下のコマンドでユーザーホーム/.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