Debug ビルドの krkrz に、adb 経由で TJS 式を評価できる REPL を用意している。 PC の CLI が無い Android でも、abstract unix socket 経由でエンジンのメインスレッドに TJS 式を投げて結果を受け取れる。デバッグ・状態観測・自動化に使う。
エンジン側の REPL 全体像 (console /
-replfile/ 結果整形 / スレッド構造) はkrkrz_dev/src/core/doc/REPL.mdを参照。本書は Android 固有の socket 経路 の話。
- コア流用: 評価は既存の
ReplMainQueue(トランスポート非依存・メインスレッド実行キュー) がそのまま担う。毎フレームのTVPDrainREPL()は SDL3 共通main.cppが呼ぶので、KRKRZ_REPLを ON にするだけで drain が付く。 - socket フロントエンド:
tTVPReplSocketChannel(common/utils/ReplSocketChannel.*) がtTVPReplFileChannelの socket 版として追加されている。abstract namespace の Unix domain socket を listen し、「1 行受信 →ReplMainQueueで実行 → 1 行 JSON 応答」する。 - 有効化 (2 条件):
- ビルド: Debug ビルドのみ
KRKRZ_REPL=ON(app/src/main/cpp/CMakeLists.txt)。 Release には REPL 自体がコンパイルされない。icline (行編集) は NDK 非対応なのでKRKRZ_REPL_LINE_EDIT=OFFで回避 (Android は console を使わず socket のみ)。 - 起動時:
KrkrzActivityが debuggable ビルドのときsuper.onCreate前にOs.setenv("KRKRZ_REPL_SOCKET", getPackageName() + ".repl")する。engine はtTVPReplSocketChannel::ShouldStart()でこの env (または CLI-replsocket=<name>) を見てチャネルを起動する。
- ビルド: Debug ビルドのみ
socket 名は <applicationId>.repl (例: jp.example.mygame.repl) を自動採用する。
abstract socket 名はシステム全体で共有されるため、複数の krkrz アプリを入れても
衝突しないようパッケージ名から導いている。タイトル側で手を入れる必要は無い (app-config.json
の applicationId を変えれば socket 名も自動で追従する)。make repl も同じ規則で forward する。
いちばん簡単なのは make repl (転送 + 接続を一発):
make run # Debug ビルドを起動 (REPL がこのとき listen を始める)
make repl # tcp:9099 を localabstract:<applicationId>.repl へ forward して nc 接続
# → TJS 式を 1 行入力して Enter、Ctrl+C で終了REPL_PORT=... make repl でポート変更可 (既定 9099)。手動でやる場合:
adb forward tcp:9099 localabstract:<applicationId>.repl
nc 127.0.0.1 9099例 (入力 → 応答):
1+2
{"ok":true,"result":"3","error":""}
System.exePath
{"ok":true,"result":"\"/data/.../\"","error":""}
Debug.message("hi")
{"ok":true,"result":"(void)","error":""}
応答 JSON: { "ok": bool, "result": "<pretty-printed>", "error": "<msg>" }
(結果整形は TVPPrettyPrint = TJS の Debug.prettyPrint)。
nc の代わりに、本家 console REPL に操作を寄せた Python クライアント
scripts/krkrz-repl.py を用意している (行編集・履歴・自動複数行・外部エディタ・
色付き整形・自動 forward・自動再接続)。
make run # Debug 起動
make repl-py # forward してリッチクライアントで接続単体でも使える (forward 済みなら port 指定、未 forward なら --socket で自分で forward):
python scripts/krkrz-repl.py --port 9099
python scripts/krkrz-repl.py --socket <applicationId>.repl # adb forward も行う操作は本家にあわせてある: プロンプト krkrz> / 継続 ...、括弧・クォートが
閉じるまで自動で継続入力(複数行 = 1 コマンド)、exit/quit/Ctrl-D で終了。
engine 側 dot コマンド (nc でも使える。socket チャネルが解釈):
| コマンド | 説明 |
|---|---|
.help |
engine 側ヘルプ |
.depth [N] |
結果表示の展開深さを表示 / 設定 |
.compact [on|off] |
結果表示のコンパクト表示を表示 / 切替 |
クライアント側コマンド:
| コマンド | 説明 |
|---|---|
exit / quit / Ctrl-D |
終了 (アプリは終了しない) |
.clear |
入力中の継続バッファを破棄 |
.reconnect / .rc |
接続を張り直す (アプリ再起動後など) |
.edit / .e |
$EDITOR を開き、内容を 1 コマンドとして送信 |
.load <file> / .l |
ファイルを 1 コマンドとして送信 |
.info |
接続情報 |
.clienthelp |
クライアント側ヘルプ |
依存は標準ライブラリのみ。pip install prompt_toolkit を入れると Windows でも
インライン行編集が快適になる (無くても readline / 素の input にフォールバック)。
本家との差異:
exit/quitは本家ではアプリ終了だが、リモート接続では接続を 閉じるだけ(アプリは動作継続)。.mem/.cap/.dlg等の Agent/メモリ系は console /Elements 依存で socket では非対応。
- Debug ビルド専用。Release には REPL が無い (セキュリティ・サイズ)。
- 複数行入力は括弧・クォートの釣り合いで自動継続 (engine へは行末
\継続で改行を保って 送る)。nc から手打ちする場合も行末\で複数行を 1 コマンドにできる。 - 評価はメインスレッドで直列実行される (TJS のスレッドアフィニティを守るため)。 重い式はゲーム進行を一瞬止める。
Agent.*(入力注入・画面キャプチャ・ダイアログ操作) は Android では未対応。 Agent は Elements 依存で、Android はKRKRZ_USE_ELEMENTS=OFFのため。基本の TJS 式 評価・グローバル/プラグイン API 参照は使える。- 同時接続は 1 クライアント。切断すると次の接続を受け付ける。
- socket 名は
<applicationId>.repl固定規則で自動導出 (タイトル側では意識不要)。make replはapp-config.jsonのapplicationIdから同じ名前を組み立てて forward する。
- エンジン:
krkrz_dev/src/core/common/utils/ReplSocketChannel.{h,cpp}(新規),REPL.cpp(TVPCreateREPL/TVPDestroyREPLへの配線),sources.cmake(KRKRZ_REPL群)。 - Android:
app/src/main/cpp/CMakeLists.txt(Debug でKRKRZ_REPL=ON),KrkrzActivity.java(debuggable 時にKRKRZ_REPL_SOCKETを設定)。