Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
334 commits
Select commit Hold shift + click to select a range
573faf9
build: stage mobile RenPy native inputs
akitaSummer Oct 3, 2026
9d9bb49
build: stage mobile RenPy native inputs
akitaSummer Oct 3, 2026
bcfd987
build: finalize mobile RenPy packaging hooks
akitaSummer Oct 3, 2026
1950795
build: finalize mobile RenPy packaging hooks
akitaSummer Oct 3, 2026
1cbfe48
build: finalize mobile RenPy packaging hooks
akitaSummer Oct 3, 2026
3160157
build: finalize mobile RenPy packaging provenance
akitaSummer Oct 3, 2026
8a690e3
build: finalize mobile RenPy packaging provenance
akitaSummer Oct 3, 2026
bbe193e
build: finalize mobile RenPy packaging provenance
akitaSummer Oct 3, 2026
a0d2657
build: finalize mobile RenPy packaging provenance
akitaSummer Oct 3, 2026
05211e9
build: honor Renios CI root alias
akitaSummer Oct 3, 2026
3537b22
test: document Renios excluded entrypoints
akitaSummer Oct 3, 2026
47132a0
ci: smoke test staged mobile RenPy inputs
akitaSummer Oct 3, 2026
b054158
ci: verify iOS RenPy adapter source
akitaSummer Oct 3, 2026
283bc72
ci: invoke Android RenPy staging through bash
akitaSummer Oct 3, 2026
641373e
ci: invoke Android RenPy staging through bash
akitaSummer Oct 3, 2026
e48a73e
ci: fix Android staging smoke shell invocation
akitaSummer Oct 3, 2026
9e76794
build: honor CI RenPy mobile root alias on Android
akitaSummer Oct 3, 2026
20470f6
ios: keep Renios native link opt-in until adapter is ready
akitaSummer Oct 3, 2026
42896f8
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
ed23b47
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
795260f
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
e2cdecf
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
4b21b16
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
cbb37d2
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
d99da0a
build: expose Renios blocking launcher contract
akitaSummer Oct 3, 2026
b8e42dd
build: add Renios launcher reentry probe
akitaSummer Oct 3, 2026
9c51c68
build: add Android RenPy preflight loader
akitaSummer Oct 3, 2026
1d244ee
build: add Android RenPy preflight loader
akitaSummer Oct 3, 2026
5bcc699
build: add Android RenPy preflight loader
akitaSummer Oct 3, 2026
1f6e195
build: add Android RenPy preflight loader
akitaSummer Oct 3, 2026
a633d5a
build: add Android RenPy preflight loader
akitaSummer Oct 3, 2026
6bd5094
build: extend Android RenPy preflight callbacks
akitaSummer Oct 3, 2026
7b30c48
build: extend Android RenPy preflight callbacks
akitaSummer Oct 3, 2026
a57eab1
build: extend Android RenPy preflight callbacks
akitaSummer Oct 3, 2026
1cbdcd5
build: extend Android RenPy preflight callbacks
akitaSummer Oct 3, 2026
542646b
build: extend Android RenPy preflight callbacks
akitaSummer Oct 3, 2026
2c6a7f4
build: compile host-owned RenPy Android shims
akitaSummer Oct 3, 2026
9e3f591
build: compile host-owned RenPy Android shims
akitaSummer Oct 3, 2026
0661b50
build: compile host-owned RenPy Android shims
akitaSummer Oct 3, 2026
110225b
build: compile host-owned RenPy Android shims
akitaSummer Oct 3, 2026
ceeeed8
build: add host-owned RenPy Android Java shims
akitaSummer Oct 3, 2026
5bdbd0f
build: add host-owned RenPy Android Java shims
akitaSummer Oct 3, 2026
1ff6494
fix: resolve RenPy shim classes via host loader
akitaSummer Oct 3, 2026
2f5e1fc
test: validate Android RenPy shim signatures
akitaSummer Oct 3, 2026
15e98ca
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
4c3051a
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
a36b167
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
f01a779
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
2892c43
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
078fa0f
build: expose host Android surface to RenPy shim
akitaSummer Oct 3, 2026
2013b4b
fix: prefer bound Android host Activity context
akitaSummer Oct 3, 2026
0e27f0b
build: add RenPy mobile lifecycle launcher scaffold
akitaSummer Oct 3, 2026
d112448
build: add RenPy mobile lifecycle launcher scaffold
akitaSummer Oct 3, 2026
68c5143
build: add RenPy mobile lifecycle launcher scaffold
akitaSummer Oct 3, 2026
de5792f
build: add RenPy mobile lifecycle launcher scaffold
akitaSummer Oct 3, 2026
7bc6289
build: add RenPy mobile lifecycle launcher scaffold
akitaSummer Oct 3, 2026
b775e78
test: harden mobile launcher artifact export checks
akitaSummer Oct 3, 2026
404321a
fix: invoke RenPy mobile probes with bash
akitaSummer Oct 3, 2026
fb6179e
fix: invoke RenPy mobile probes with bash
akitaSummer Oct 3, 2026
82a4b36
fix: invoke mobile staging scripts through bash
akitaSummer Oct 3, 2026
0e91fa0
fix: invoke mobile staging scripts through bash
akitaSummer Oct 3, 2026
05c6175
fix: invoke mobile staging scripts through bash
akitaSummer Oct 3, 2026
887c394
fix: invoke mobile smoke helpers through bash
akitaSummer Oct 3, 2026
2fed6e1
fix: invoke mobile smoke helpers through bash
akitaSummer Oct 3, 2026
69ddb91
fix: accept RENPY_MOBILE_ROOT in Android build
akitaSummer Oct 3, 2026
139e601
ci: retry iOS Rust target downloads
akitaSummer Oct 3, 2026
072873b
fix: inspect Renios archive symbols with nm
akitaSummer Oct 3, 2026
d8be4a1
fix: keep Renios native closure linking opt-in
akitaSummer Oct 3, 2026
0c489e6
build: add RenPy mobile lifecycle rebuild contract
akitaSummer Oct 3, 2026
cc3356c
build: add RenPy mobile lifecycle rebuild contract
akitaSummer Oct 3, 2026
5a72db7
build: add RenPy mobile lifecycle rebuild contract
akitaSummer Oct 3, 2026
d9cff05
test: compile RenPy mobile lifecycle contract
akitaSummer Oct 3, 2026
69ece1e
build: add RenPy mobile lifecycle contract templates
akitaSummer Oct 3, 2026
4d50984
build: add RenPy mobile lifecycle contract templates
akitaSummer Oct 3, 2026
13f6474
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
757c14e
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
3af6c43
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
7f8c9d9
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
69e7471
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
01388c6
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
2909849
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
5d65911
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
e29289d
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
d51acc9
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
0ee4cd7
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
bee4680
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
804f0ef
feat: add mobile RenPy lifecycle loader contract
akitaSummer Oct 3, 2026
c583a72
build: add RenPy Python cooperative loop patch skeleton
akitaSummer Oct 3, 2026
ce259ca
build: add RenPy Python cooperative loop patch skeleton
akitaSummer Oct 3, 2026
ded8eb2
build: add RenPy Python cooperative loop patch skeleton
akitaSummer Oct 3, 2026
70ecc04
build: add RenPy Python cooperative loop patch skeleton
akitaSummer Oct 3, 2026
b3998e6
build: add RenPy Python cooperative loop patch skeleton
akitaSummer Oct 3, 2026
34c7363
fix: keep iOS lifecycle loader weak at link time
akitaSummer Oct 3, 2026
397b1b4
build: add opt-in RenPy native source preflight
akitaSummer Oct 3, 2026
30f1f3f
build: add opt-in RenPy native source preflight
akitaSummer Oct 3, 2026
3f676fd
build: add opt-in RenPy native source preflight
akitaSummer Oct 3, 2026
d6d98fb
build: add opt-in RenPy native source preflight
akitaSummer Oct 3, 2026
7ed1b60
ci: invoke RenPy source preflight through bash
akitaSummer Oct 3, 2026
78b01c0
ci: invoke RenPy build preflight through bash
akitaSummer Oct 3, 2026
1487734
ci: run repository scripts through bash
akitaSummer Oct 3, 2026
3fb8c3c
ci: run dependency preparation scripts through bash
akitaSummer Oct 3, 2026
da5f027
fix: tolerate absent RenPy build metadata in preflight
akitaSummer Oct 3, 2026
d155173
ci: invoke RenPy mobile staging through bash
akitaSummer Oct 3, 2026
2c06509
merge main into Ren'Py runtime branch, preserving RFVP and Ren'Py cha…
akitaSummer Oct 3, 2026
1573cdd
ci(renpy): add pinned Windows SDK installer support
akitaSummer Oct 5, 2026
e649ad1
test(renpy): cover Windows SDK installer metadata
akitaSummer Oct 5, 2026
d38e1da
ci(renpy): add Linux and Windows desktop smoke matrix
akitaSummer Oct 5, 2026
cb36386
fix(renpy): allow Windows SDK launcher mode bits
akitaSummer Oct 5, 2026
6263546
ci(renpy): validate mobile lifecycle contract scaffold
akitaSummer Oct 5, 2026
2ee1dee
fix(ci): match mobile guard contract text
akitaSummer Oct 5, 2026
ce4a333
test(renpy): match loader dlsym contract
akitaSummer Oct 5, 2026
f8acfc9
fix(ci): match scaffold guard text across wrapped lines
akitaSummer Oct 5, 2026
bfd7d15
test(renpy): add mobile lifecycle symbol gate fixture
akitaSummer Oct 5, 2026
b05f3e6
fix(test): handle optional lifecycle artifact variables
akitaSummer Oct 5, 2026
c820977
ci(renpy): run lifecycle export gate fixture
akitaSummer Oct 5, 2026
52285df
build(renpy): enforce mobile ABI exports and Android architectures
akitaSummer Oct 5, 2026
c521c3d
fix(renpy): normalize Mach-O nm symbol prefixes
akitaSummer Oct 5, 2026
b2e1560
build(renpy): add opt-in mobile source preflight and build runner
akitaSummer Oct 5, 2026
8976565
test(renpy): cover optional mobile source build runner
akitaSummer Oct 5, 2026
2aebc81
ci(renpy): run optional mobile source preflight
akitaSummer Oct 5, 2026
a3f9cea
docs(renpy): document desktop and mobile acceptance matrix
akitaSummer Oct 5, 2026
4d5a8f3
fix(test): normalize Mach-O lifecycle symbol prefixes
akitaSummer Oct 5, 2026
e5515eb
ci(renpy): skip smoke when SDK platform files are absent
akitaSummer Oct 5, 2026
cba12dd
fix(test): invoke non-executable launcher scaffold via bash
akitaSummer Oct 5, 2026
3760378
fix(test): invoke non-executable source runner via bash
akitaSummer Oct 5, 2026
59b0b10
fix(build): invoke non-executable launcher scaffold via bash
akitaSummer Oct 5, 2026
d2ed173
fix(ci): match mobile non-playability guard text
akitaSummer Oct 5, 2026
4d9a863
ci(renpy): require platform runtime files before smoke
akitaSummer Oct 5, 2026
dc9ee31
ci(renpy): make desktop execution smoke explicitly opt-in
akitaSummer Oct 5, 2026
d82b017
fix: resolve iOS lifecycle symbols from static Renios archives
akitaSummer Oct 5, 2026
e589f9b
guard mobile source builds against blocking upstream launcher
akitaSummer Oct 5, 2026
6cb9ba0
fix: keep lifecycle source guard shell continuations valid
akitaSummer Oct 5, 2026
5a44280
ci: validate cooperative patch against Ren'Py source
akitaSummer Oct 5, 2026
91e0fc8
fix: keep patch validation workflow command valid
akitaSummer Oct 5, 2026
3961008
fix: keep optional iOS lifecycle symbols weak
akitaSummer Oct 5, 2026
6ce579a
fix: keep iOS lifecycle loader fully dynamic
akitaSummer Oct 5, 2026
d8f1df1
test: add Ren'Py demo fixture validation
akitaSummer Oct 6, 2026
a65fc4d
test: add real Ren'Py demo fixture
akitaSummer Oct 6, 2026
b33b6c1
test: add real Ren'Py demo fixture
akitaSummer Oct 6, 2026
8a53141
test: add real Ren'Py demo fixture
akitaSummer Oct 6, 2026
13657d1
test: add real Ren'Py demo fixture
akitaSummer Oct 6, 2026
3bb829e
test: add real Ren'Py demo fixture
akitaSummer Oct 6, 2026
6964e18
build: add cooperative Ren'Py source lifecycle fork
akitaSummer Oct 6, 2026
9662f9a
build: add cooperative Ren'Py source lifecycle fork
akitaSummer Oct 6, 2026
e263fea
build: add cooperative Ren'Py source lifecycle fork
akitaSummer Oct 6, 2026
18c29a3
build: add cooperative Ren'Py source lifecycle fork
akitaSummer Oct 6, 2026
64dffba
build: add native Ren'Py lifecycle fork layer
akitaSummer Oct 6, 2026
4905ce3
build: add native Ren'Py lifecycle fork layer
akitaSummer Oct 6, 2026
eee7144
ci: gate mobile contract with native fork and Ren'Py demo
akitaSummer Oct 6, 2026
d3ce524
ci: validate native lifecycle fork source
akitaSummer Oct 6, 2026
84af840
build: patch renpy-build tasks with lifecycle object
akitaSummer Oct 6, 2026
fbf87fd
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
280fe3c
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
a0afca5
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
719399b
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
918ae2c
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
6e79bbf
build: connect native launcher bootstrap to lifecycle loader
akitaSummer Oct 6, 2026
45877a2
build: add Android and iOS host bootstrap patches
akitaSummer Oct 6, 2026
3bb237c
build: add Android and iOS host bootstrap patches
akitaSummer Oct 6, 2026
34e915e
ci: validate bootstrap patches and source gate
akitaSummer Oct 6, 2026
2ae3516
docs: document complete Ren'Py native payload build flow
akitaSummer Oct 6, 2026
4e06154
ci: gate every Android lifecycle artifact ABI
akitaSummer Oct 6, 2026
82b3b76
fix: preserve mobile key up events in SDL bridge
akitaSummer Oct 6, 2026
844f1bf
ci: assert native launcher patches in source-build plan
akitaSummer Oct 6, 2026
0ea0318
Merge main into renpy-runtime-final
Oct 8, 2026
08114ab
fix(renpy): preserve mobile provider diagnostics
Oct 8, 2026
3f2f892
fix: rebuild embedded Ren'Py runtime and require real mobile validation
Oct 8, 2026
82ce5f6
Merge remote-tracking branch 'origin/main' into renpy-runtime-final
Oct 8, 2026
dc50615
ci: provide LLVM linker for the Ren'Py source rebuild
Oct 8, 2026
b206004
fix: build the Ren'Py demo without optional licensed SDKs
Oct 8, 2026
8217534
fix: use the Windows Ren'Py launcher under Git Bash
Oct 8, 2026
af17571
Build iOS runtime with cloud Xcode and verify Android emulator gameplay
Oct 8, 2026
7384a52
Execute patched SDL renderer and parallel iOS source build in cloud
Oct 8, 2026
3f9493e
Preserve real mobile surface sizes and fix cloud validation gates
Oct 8, 2026
c7c11de
Isolate iOS SDL classes and repair actual Simulator compile failure
Oct 8, 2026
9b1bad4
Repair real iOS link, isolate Android exports and bound source compil…
Oct 8, 2026
74c14f8
feat(renpy): package isolated iOS runtime and exercise real Simulator…
Oct 8, 2026
73282c7
fix(renpy): compile static Cython APIs and support macOS Bash preflight
Oct 8, 2026
8895c27
test(renpy): compile real generated static API consumers in CI
Oct 8, 2026
faf2e7b
fix(renpy): check allocated MetalANGLE pbuffer after the first real draw
Oct 8, 2026
87ac510
fix: isolate iOS host GLES and repair native compiler commands
Oct 8, 2026
173c5f9
fix: restore host SDL environment after RenPy lifecycle calls
Oct 8, 2026
2b3d95e
fix: backport libffi arm64 Mach-O unwind assembly ordering
Oct 8, 2026
e81e7d9
fix: retain RenPy raw assets through Android APK export
Oct 8, 2026
0767f9a
test: report LLVM libffi baseline behavior accurately
Oct 8, 2026
99a85c0
fix: make cached libgdiplus configuration relocatable
Oct 8, 2026
6263c36
fix(renpy): keep MetalANGLE framework flags in target linker settings
Oct 8, 2026
1e2484e
fix(android): export relocated Debug libgdiplus link directories
Oct 8, 2026
4e527e0
test(renpy): select actual Xcode SDKs for MetalANGLE compile regression
Oct 8, 2026
e6f5937
test(renpy): verify host GPU resources survive private SDL teardown
Oct 8, 2026
dfabbe1
fix(android): pin ggml recipe and patches to the registry baseline
Oct 8, 2026
462a957
ci(renpy): queue Swift driver only after the native iOS build
Oct 8, 2026
0b813af
fix(renpy): release healthy mobile sessions and preserve shutdown errors
Oct 8, 2026
5b0d450
test(renpy): reject missing mobile landmarks and retained native errors
Oct 8, 2026
9486a69
ci(renpy): read a sanitized Xcode failure summary without republishin…
akitaSummer Oct 8, 2026
7b1f416
fix(renpy): correct iOS modules and suspended mobile waits
Oct 8, 2026
dbb863a
fix(android): export coinstallable RenPy test apps and audit actual A…
Oct 8, 2026
b330d41
ci(renpy): package the validated current Android runtime
Oct 8, 2026
46fd4b2
ci(renpy): read the latest Xcode failure summary
Oct 8, 2026
1179a33
fix(android): audit current aapt2 minimum SDK metadata
Oct 8, 2026
e72f116
ci(renpy): revalidate the genuine exported Android APKs
Oct 8, 2026
2fe86c0
fix(ios): use real target libffi for static Python ctypes
Oct 8, 2026
69093f2
ci(ios): run genuine target libffi validation independently
Oct 8, 2026
800b7c3
fix(ios): regenerate actual static Python rules before building
Oct 8, 2026
4fd44ea
test(ios): execute the unchanged upstream ctypes compile recipe
Oct 8, 2026
ee65f02
test(ios): diagnose actual make selection without exposing config caches
Oct 8, 2026
8b2db6b
fix(ios): resolve SDKROOT and verify libffi with its own build context
Oct 8, 2026
123fecb
fix(ios): link the owned provider and required Renios support classes
Oct 8, 2026
23e6221
ci: read a sanitized summary of the latest iOS source failure
Oct 8, 2026
f328f24
fix(ios): probe POSIX declarations before enabling target APIs
Oct 8, 2026
03293f7
ci: package the verified iOS runtime for devices and expose scoped fa…
Oct 8, 2026
0461e8a
fix(android): require effective all-files access for native imports
Oct 8, 2026
b2b7a0f
fix(ios): isolate host Python tools from target runtime
Oct 8, 2026
5042472
fix(mobile): repair Assimp ownership and real build preparation
Oct 8, 2026
7c66a92
fix(ios): resolve versioned host Python framework executable
Oct 8, 2026
ed5421e
fix(ios): verify canonical host Python paths across filesystem aliases
Oct 8, 2026
10676a9
fix(renpy): preserve Godot key semantics and committed text
Oct 9, 2026
1967809
fix(ios): build FreeType export tools with the native compiler
Oct 9, 2026
3b5e24e
fix(android): bind the real RenPy host before runtime startup
Oct 9, 2026
69cceb1
fix(ios): validate cached RenPy bytecode with Python 3.12
Oct 9, 2026
0cbc4d7
fix(ios): build a genuine arm64 Simulator export template
Oct 9, 2026
59485eb
fix(ios): build the RenPy device engine without SDL3 conflicts
Oct 9, 2026
f925b68
ci(android): check existing Intel cloud HVF support
Oct 9, 2026
8bad541
fix(ios): force-load each genuine RenPy runtime archive
Oct 9, 2026
1d62139
ci(android): execute the genuine APK on Intel cloud HVF
Oct 9, 2026
3ab7e06
test(ios): link archive regression with the genuine SDK runtime
Oct 9, 2026
2971bfc
fix(android): preserve truthful cloud boot and cleanup diagnostics
Oct 9, 2026
6620994
fix(ios): link genuine RenPy archives through their dependency closure
Oct 9, 2026
2dec457
ci(android): check live coldboot within the existing bounded window
Oct 9, 2026
4b042e2
ci(ios): cache and revalidate the genuine public Simulator engine
Oct 9, 2026
17aa2ee
fix(android): wait for a visible OS screen within the boot deadline
Oct 9, 2026
1ec4ba0
fix(ios): retain memeq in the real libiconv relocation wrapper
Oct 9, 2026
9782589
fix(ios): pass real OpenSSL configure arguments for Simulator
Oct 9, 2026
17d74dd
fix(android): report fresh installation and startup failure evidence
Oct 9, 2026
73be6b4
ci(android): measure actual cloud emulator boot resources
Oct 9, 2026
c3b4163
fix(ios): require the real GLib pipe2 SDK declaration
Oct 9, 2026
dcaa723
fix(android): retain fresh actual activity launch diagnostics
Oct 9, 2026
53efca9
ci(ios): preserve verified public dependency archives after build fai…
Oct 9, 2026
68e7c01
test(android): capture current app state after a failed launch
Oct 9, 2026
63c19f8
ci(android): allow a bounded 900 second cold boot diagnosis
Oct 9, 2026
5617f8e
ci(ios): keep optional cache validation from blocking gameplay
Oct 9, 2026
9d2da0d
test(android): preserve bounded current app startup phases
Oct 9, 2026
9a7d914
test(android): observe real startup briefly after launch timeout
Oct 9, 2026
0ff10e3
fix(android): prefer emulator renderer before platform default
Oct 9, 2026
9c901dd
test(android): run gameplay against the renderer-fixed APK
Oct 9, 2026
bf22bdd
fix(ios): accept the pinned public GLib launch helper cache
Oct 9, 2026
8be1181
fix(ios): select simulator Rust targets from canonical SDK paths
Oct 9, 2026
0bc1af6
fix(ios): select the Minori simulator Rust target in the host
Oct 9, 2026
a8b8cf4
diagnose(ios): record executed startup phases in app acceptance
Oct 9, 2026
25e2782
fix(ios): preserve staged gameplay data during XCTest startup
Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@

# Enforce LF for vcpkg patch files, as patch.exe on Windows fails with CRLF line endings
*.patch text eol=lf
# Empty context lines in unified diffs must retain their leading space.
bridge/renpy_runtime/mobile_launcher/patches/**/*.patch whitespace=-blank-at-eol,-space-before-tab
vcpkg/ports/libiconv/*.patch whitespace=-blank-at-eol,-blank-at-eof,-space-before-tab
vcpkg/ports/openssl/**/*.patch whitespace=-blank-at-eol,-blank-at-eof,-space-before-tab
# Retain the fixed upstream Windows recipe byte-for-byte.
vcpkg/ports/openssl/windows/portfile.cmake whitespace=-blank-at-eol

# Product game archives are binary assets.
*.xp3 -text
Expand Down
299 changes: 290 additions & 9 deletions .github/workflows/build.yml

Large diffs are not rendered by default.

207 changes: 207 additions & 0 deletions .github/workflows/renpy-android-apk-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
name: Audit the actual exported Ren'Py APKs

# These exact APKs were genuinely linked/exported at b330d418. Their first
# audit failed on the aapt2 minSdkVersion format. Recheck the original bytes
# without pretending that this job compiles the host, or republishes raw logs.
on:
pull_request:
paths:
- '.github/workflows/renpy-android-apk-audit.yml'
- 'tools/inspect_renpy_android_apk.py'
- 'tools/validate_renpy_mobile_payload.py'
workflow_dispatch:

permissions:
contents: read
actions: read

jobs:
audit:
name: Audit the actual Debug APK (${{ matrix.abi }})
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- abi: arm64-v8a
preset: Android Debug
artifact: '11569036023'
digest: 'sha256:7364686c88b8c02bd43826469f42014353570ae75f3246b7fc2211015fc56c74'
- abi: x86_64
preset: Android Emulator Debug
artifact: '11570702817'
digest: 'sha256:444ce5528b42fe29ed84a91ea29726ccf83a380dc3d71b6463bba8a12408b211'
env:
SOURCE_RUN: '37817371584'
SOURCE_HOST_HEAD: 'b330d41813cc712328d762e1f7a75f99f1d59882'
NATIVE_RUN: '37812943810'
NATIVE_ARTIFACT: '11567113193'
NATIVE_HEAD: 'dbb863ac101301c8a9d78dea358e2157a0185165'
NATIVE_DIGEST: 'sha256:04a1f247585b8f4647e6dcd8c4102757f558ee542524df1504267b40f0a4239c'
ANDROID_NDK_VERSION: '28.1.13356709'
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/checkout@v6
with:
ref: b330d41813cc712328d762e1f7a75f99f1d59882
path: original-host
persist-credentials: false
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Verify immutable artifact identities and exact prior failure
env:
GH_TOKEN: ${{ github.token }}
APK_ARTIFACT: ${{ matrix.artifact }}
APK_DIGEST: ${{ matrix.digest }}
ABI: ${{ matrix.abi }}
run: |
python3 - <<'PY'
import json, os, urllib.request
def get(path):
request = urllib.request.Request('https://api.github.com/repos/AetherKiri/Aether/' + path,
headers={'Authorization': 'Bearer ' + os.environ['GH_TOKEN'],
'Accept': 'application/vnd.github+json', 'X-GitHub-Api-Version': '2022-11-28'})
with urllib.request.urlopen(request, timeout=60) as response:
return json.load(response)
for run_key, head_key, conclusion in [('SOURCE_RUN', 'SOURCE_HOST_HEAD', 'failure'),
('NATIVE_RUN', 'NATIVE_HEAD', 'success')]:
run = get('actions/runs/' + os.environ[run_key])
assert run['head_sha'] == os.environ[head_key]
assert run['status'] == 'completed' and run['conclusion'] == conclusion
for artifact_key, digest_key, run_key, name in [
('APK_ARTIFACT', 'APK_DIGEST', 'SOURCE_RUN', 'renpy-android-app-evidence-' + os.environ['ABI']),
('NATIVE_ARTIFACT', 'NATIVE_DIGEST', 'NATIVE_RUN', 'renpy-android-runtime')]:
artifact = get('actions/artifacts/' + os.environ[artifact_key])
assert not artifact['expired'] and artifact['name'] == name
assert artifact['workflow_run']['id'] == int(os.environ[run_key])
assert artifact['digest'] == os.environ[digest_key]
PY
- uses: actions/download-artifact@v6
with:
artifact-ids: ${{ matrix.artifact }}
run-id: 37817371584
github-token: ${{ github.token }}
merge-multiple: true
path: ${{ runner.temp }}/original-build-evidence
- uses: actions/download-artifact@v6
with:
artifact-ids: 11567113193
run-id: 37812943810
github-token: ${{ github.token }}
merge-multiple: true
path: ${{ runner.temp }}/original-native-download
- name: Use the normal SDK with its existing license acceptance
run: |
set -euo pipefail
sdk_root="${ANDROID_HOME:-/usr/local/lib/android/sdk}"
test -d "$sdk_root"
ndk_root="$sdk_root/ndk/$ANDROID_NDK_VERSION"
if [[ ! -f "$ndk_root/build/cmake/android.toolchain.cmake" ]]; then
"$sdk_root/cmdline-tools/latest/bin/sdkmanager" --install "ndk;$ANDROID_NDK_VERSION" </dev/null
fi
test -f "$ndk_root/build/cmake/android.toolchain.cmake"
echo "ANDROID_HOME=$sdk_root" >> "$GITHUB_ENV"
echo "ANDROID_NDK_HOME=$ndk_root" >> "$GITHUB_ENV"
- name: Verify the original APK and restage exact compiled native inputs
env:
ABI: ${{ matrix.abi }}
APK_ARTIFACT: ${{ matrix.artifact }}
APK_DIGEST: ${{ matrix.digest }}
AUDIT_PR_HEAD: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
set -euo pipefail
python3 - <<'PY'
import hashlib, json, os, pathlib, shutil, subprocess
root = pathlib.Path(os.environ['RUNNER_TEMP'])
source = root / 'original-build-evidence'
def one(pattern):
matches = list(source.rglob(pattern))
assert len(matches) == 1, (pattern, len(matches))
return matches[0]
previous = json.loads(one('apk-payload-checksums.json').read_text())
assert previous['gameplay'] == 'unverified' and previous['package_bytes'] == 'passed'
assert previous['android_manifest']['status'] == 'failed'
assert previous['errors'] == ['aapt badging lacks package, minimum SDK, or native ABI metadata']
assert previous['files'] and all(file['match'] for file in previous['files'].values())
original = json.loads(one('provenance.json').read_text())
assert original['host_pr_head'] == os.environ['SOURCE_HOST_HEAD']
assert original['native_source_head'] == os.environ['NATIVE_HEAD']
assert original['native_source_run'] == int(os.environ['NATIVE_RUN'])
assert original['native_artifact_id'] == int(os.environ['NATIVE_ARTIFACT'])
assert original['native_artifact_digest'] == os.environ['NATIVE_DIGEST']
assert original['abi'] == previous['abi'] == os.environ['ABI']
apk = one('*.apk')
apk_hash = hashlib.sha256(apk.read_bytes()).hexdigest()
assert apk_hash == previous['apk_sha256']
print('Original exported APK SHA256:', apk_hash)
result = root / 'apk-audit-result'
result.mkdir()
deliverable = root / 'validated-apk'
deliverable.mkdir()
shutil.copyfile(apk, deliverable / apk.name)
provenance = {'original_build': original, 'original_apk_sha256': apk_hash,
'source_app_artifact': int(os.environ['APK_ARTIFACT']), 'source_app_artifact_digest': os.environ['APK_DIGEST'],
'audit_pr_head': os.environ['AUDIT_PR_HEAD'],
'audit_checkout_head': subprocess.check_output(['git', 'rev-parse', 'HEAD'], text=True).strip(),
'new_host_compilation': 'not_run', 'gameplay': 'unverified'}
(result / 'provenance.json').write_text(json.dumps(provenance, indent=2) + '\n')
with open(os.environ['GITHUB_ENV'], 'a') as env:
env.write('AUDIT_APK=' + str(deliverable / apk.name) + '\n')
PY
mkdir -p "$RUNNER_TEMP/original-native" "$RUNNER_TEMP/audit-staging"
tar -xzf "$RUNNER_TEMP/original-native-download/renpy-android-runtime.tar.gz" -C "$RUNNER_TEMP/original-native"
# This is reference staging for byte comparison, never an app build.
# Use the exact original script/Java support and native dependency.
touch "$RUNNER_TEMP/audit-staging/build.gradle"
bash original-host/tools/stage_renpy_android_support.sh \
--mobile-root "$RUNNER_TEMP/original-native/payload" \
--godot-build "$RUNNER_TEMP/audit-staging" --abis '${{ matrix.abi }}'
python3 original-host/tools/prepare_renpy_android_test_export.py \
--source-project original-host/apps/godot_app --destination "$RUNNER_TEMP/audit-project" \
--preset-name '${{ matrix.preset }}' --package-id org.aetherkiri.renpy.debug
- name: Audit real SDK metadata, packaged ELF closure, raw bytes and signature
run: |
set -euo pipefail
python3 tools/inspect_renpy_android_apk.py --apk "$AUDIT_APK" \
--godot-build "$RUNNER_TEMP/audit-staging" --abi '${{ matrix.abi }}' \
--output-dir "$RUNNER_TEMP/apk-audit-result" \
--export-presets "$RUNNER_TEMP/audit-project/export_presets.cfg" --export-preset '${{ matrix.preset }}' \
--build-type debug --android-sdk "$ANDROID_HOME" --android-ndk "$ANDROID_NDK_HOME"
python3 tools/validate_renpy_mobile_payload.py --platform android --abi '${{ matrix.abi }}' --apk "$AUDIT_APK"
apksigner="$(find "$ANDROID_HOME/build-tools" -name apksigner -type f | sort -V | tail -1)"
test -x "$apksigner"
"$apksigner" verify --verbose --print-certs "$AUDIT_APK" | tee "$RUNNER_TEMP/apk-audit-result/apk-signature.txt"
- name: Upload only the revalidated installable APK
uses: actions/upload-artifact@v6
with:
name: renpy-installable-debug-${{ matrix.abi }}
path: ${{ runner.temp }}/validated-apk/*.apk
if-no-files-found: error
retention-days: 7
- name: Upload the original public demo and phone instructions
if: matrix.abi == 'arm64-v8a'
uses: actions/upload-artifact@v6
with:
name: renpy-demo-project
path: |
original-host/demos/aetherkiri-renpy/game
original-host/demos/aetherkiri-renpy/README.md
if-no-files-found: error
retention-days: 7
- name: Preserve only newly generated audit metadata
if: always()
uses: actions/upload-artifact@v6
with:
name: renpy-android-apk-audit-evidence-${{ matrix.abi }}
path: |
${{ runner.temp }}/apk-audit-result/*.json
${{ runner.temp }}/apk-audit-result/*.readelf.txt
${{ runner.temp }}/apk-audit-result/*.exports.txt
${{ runner.temp }}/apk-audit-result/apk-android-badging.txt
${{ runner.temp }}/apk-audit-result/apk-signature.txt
if-no-files-found: warn
retention-days: 7
Loading
Loading