kivyLauncherアプリケーションのprintf「的」デバッグ

数日困ってた。

kivyLauncherアプリケーションのprintf「的」デバッグ

前置き

  • あたりまえだがほんとに printf を使うわけではない。
  • 本格式な「デバッグ環境をバッチシ整え」ることなくカジュアルにデバッグしたいのだ、ってオハナシ
  • kivyLauncherアプリケーションとは、kivyアプリケーションと nearly equal である
  • ので、ここで書くことは通常の kivy アプリケーションに通ずるかもしれないぜベイベー

kivyLauncher を初めて使うと、何かコトが起こった場合に「何もいわずに黙って終了する」だけなので、ほんとうに困る。android 実機以外(Windows とか)でも動作する状態、つまり android 固有機能に依存してないうちはいいんだけど、GPS だとかコンパスのような実機でしか動作しないものを作ってると、原因解析手段がなんにもない。と思って探っていました、つー話。

たぶんどうしようもないパターン

これが解決するといいんだけどね…。どうも、スクリプトファイルの文法エラー系は、kivyLauncher はなんにも情報を残さないように思える。何か見つけたら追記しようと思うけど、今のところ何も見つけれていない。

となれば、実機に持っていく前に静的解析ツールをかけるとかするしかないだろうな、ひとまずは。

トーストを使う(1)

正規の android API、つまり java では toast を気軽に使えるから、開発中の実機デバッグではよく使うのであろう、きっと。

kivy に toast がないかなぁと思ったら、「こっそり」あった。ちとわかりにくい:

1 from plyer.platforms.android import activity
2 # ...
3 def func():
4     activity.toastError("message")

トーストを使う(2)

ほんの少しだけ activity.toastError より柔軟な。jnius を使って本物の toast API にアクセスする。

androidtoast.py:

androidtoast.py
 1 # -*- coding: utf-8 -*-
 2 from jnius import autoclass, PythonJavaClass, java_method, cast
 3 from android.runnable import run_on_ui_thread
 4 
 5 Toast = autoclass('android.widget.Toast')
 6 context = autoclass('org.renpy.android.PythonActivity').mActivity    
 7 
 8 @run_on_ui_thread
 9 def toast(text, length_long=False):
10     duration = Toast.LENGTH_LONG if length_long else Toast.LENGTH_SHORT
11     String = autoclass('java.lang.String')
12     c = cast('java.lang.CharSequence', String(text))
13     t = Toast.makeText(context, c, duration)
14     t.show()

kivy.loggerを使う

の前に…、ログファイル、どこ?

ファイルシステムブラウザとしてES ファイルエクスプローラーを使っている、ワタシは。ので、その絵で説明。

アプリケーションフォルダの下に .kivy フォルダが「ある」:

ただし、この手のブラウザは隠しファイル・フォルダをデフォルトで表示しないので、設定で見えるようにしとくこと。

.kivy フォルダの中:

をっと、logs フォルダがあるねぇ。その中:

中身を覗いて見る:

よしよし。

気を取り直して、kivy.loggerを使う

標準 Python のロガーだと設定をごにょごにょせねばならんが?

さっき見つけたログに混ざりこんでいいなら、結論から言えばこれだけ:

1 from kivy.logger import Logger
2 from kivy.config import Config
3 Config.set('kivy', 'log_level', 'debug')  # デフォルトで debug になってないので
4 Config.set('kivy', 'log_enable', 1) 
5 #Config.set('kivy', 'log_dir', 'logs')  # 変更しなければ上でみた通り
6 #Config.set('kivy', 'log_name', 'kivy_%y-%m-%d_%_.txt')  # 変更しなければ上でみた通り
7 
8 #...
9 Logger.debug("hoge!")

上の Config は設定ファイルにも書ける。公式ドキュメントのここここ参照。説明は通常の kivy アプリケーション向けみたい。kivyLauncher の場合は先のスクリーンキャプチャで見えていた config.ini。

config.ini ファイルは、最初に起動する際に自動で作成される、のね。これ、予め作っとくのはキツイ気がするなぁ。中身はこんななの:

config.ini
 1 [kivy]
 2 keyboard_repeat_delay = 300
 3 keyboard_repeat_rate = 30
 4 log_dir = logs
 5 log_enable = 1
 6 log_level = info
 7 log_name = kivy_%y-%m-%d_%_.txt
 8 window_icon = 
 9 keyboard_mode = 
10 keyboard_layout = qwerty
11 desktop = 0
12 exit_on_escape = 1
13 pause_on_minimize = 0
14 config_version = 14
15 
16 [graphics]
17 display = -1
18 fullscreen = 0
19 height = 600
20 left = 0
21 maxfps = 60
22 multisamples = 2
23 position = auto
24 rotation = 0
25 show_cursor = 1
26 top = 0
27 width = 800
28 resizable = 1
29 borderless = 0
30 window_state = visible
31 minimum_width = 0
32 minimum_height = 0
33 
34 [input]
35 mouse = mouse
36 
37 [postproc]
38 double_tap_distance = 20
39 double_tap_time = 250
40 ignore = []
41 jitter_distance = 0
42 jitter_ignore_devices = mouse,mactouch,
43 retain_distance = 50
44 retain_time = 0
45 triple_tap_distance = 20
46 triple_tap_time = 375
47 
48 [widgets]
49 scroll_timeout = 250
50 scroll_distance = 20
51 scroll_friction = 1.
52 scroll_stoptime = 300
53 scroll_moves = 5
54 
55 [modules]

kivy.logger 自体は使い方はたぶん標準 Python ロガーと一緒なんじゃないかと思う。まだ使いこなせてないし調べ切れてもいないけれど。