The release crash was a native SIGSEGV in libflutter.so caused by an
ABI mismatch. Commit f85309b9 was the last one that produced a working
release APK. All files outside lib/ that changed since then are reverted
to that commit: android/ build config, pubspec, build.sh, sign.sh,
docker, .gitignore, analysis_options.yaml, and the .flutter submodule.
The Dart source code in lib/ is deliberately kept at its current state.
Also adds a minimal proguard-rules.pro (2 lines) with -dontwarn for
androidx.window.extensions/sidecar, which R8 needs to complete the build.
Toolchain-only image matching .github/workflows/release.yml: ubuntu 24.04, Temurin JDK 21, AGP-managed Android SDK (NDK/cmake auto-downloaded on demand). Flutter is NOT installed in the image - it comes from the repo's pinned .flutter submodule at runtime, keeping the Flutter version reproducible and consistent with build.sh.
Dockerfile: ubuntu 24.04, Temurin 21 via Adoptium API, Android SDK base only (platform-tools + build-tools 35 + platform 35), NDK/cmake left to AGP auto-download, ANDROID_HOME writable for runtime installs. Fixed 'git 2.x' typo, dropped desktop/GTK deps + emulator + extra platforms, consolidated apt layers, modern syntax.
builder.sh: mounts just the repo, runs as $(id -u):$(id -g), puts .flutter/bin first on PATH, TTY only when interactive, passes through commands for CI use ($*). No fixed --name or --net host.
mkbuilder.sh: build context is docker/ (not the whole repo - avoids shipping the multi-GB .flutter submodule to the daemon for a Dockerfile that COPYs nothing), tags :latest + timestamp.
Bugs:
- Indonesian locale 'in' → 'id' so translations are found (id.json)
- sign.sh: keystore password via env: (not command line); apksigner
found via find|sort -V instead of fragile ls|tail -1
- font sizes 11/12 now use Theme.of(context).textTheme tokens
- textTheme.labelSmall! null assertion replaced with safe ?.
- download progress indicator wrapped in Semantics for a11y
Architecture / robustness:
- Side effects (_manageServices, _handleFirstRun, checkLaunchByNotif)
moved out of build() into initState + SettingsProvider listener
- createHttpClient sets connectionTimeout: 30s
- Error-swallowing catch blocks in source matching now log to LogsProvider
- HttpClient lifecycle: httpClientResponseStreamToFinalResponse now
closes client in finally block
- JSON migration failure sets compatVersion to prevent re-trigger
- Icon cache cleanup on removeApps
- FG/BG state sync: static timestamp tells foreground to reload when
background task saves to disk
- Concurrent download polling capped at ~5 minutes (43 iterations)
Performance:
- _pipelineSignature: 6 fields/app instead of 17
- .asBroadcastStream() removed from download stream
- DeviceInfoPlugin() cached in apkpure.dart (was called twice per update)
Config / i18n:
- New config_keys.dart: 30 typed AppConfigKey constants replacing
raw string literals in AppSource form item definitions
- easy_localization implementation imports justified with comment
HTTP extraction:
- HttpClientMixin extracted from AppSource for getRequestHeaders
Build / deps:
- Gradle: deprecated allprojects {} replaced with
dependencyResolutionManagement (PREFER_PROJECT mode)
- Android build dirs added to .gitignore
- Dockerfile: removed pre-installed NDK 26.3 (AGP auto-downloads 28.2),
consolidated SDK RUN layers into one
- Third-party git deps pinned to commit SHAs