v1.4.7
FreeFCC v1.4.7 — Critical Fixes + Crash Protection
Critical Fixes
- Fixed update installation broken by scoped storage: the previous version removed
WRITE_EXTERNAL_STORAGEbutinstallUpdatestill tried to copy the APK toEnvironment.getExternalStorageDirectory()/FreeFCC/— which is unwritable on Android 10+ scoped storage. Now uses the cached APK directly viaFileProvider(thefile_paths.xmlcache-path already coverscacheDir/updates/). - Fixed app crash on malformed profile:
autoConnectAndApplyandsend4gActivationFrameshad nocatchblock — a corrupt or missing profile asset would crash the app. Both now catch and report errors gracefully. - Fixed FCC being re-applied after CE restore:
disableFccnow stops the keepalive service first. Previously, keepalive would re-apply FCC ~2 seconds after the user tapped "Stop FCC Mode", undoing the restore. - Fixed crash on Support page links: the Ko-fi and GitHub buttons called
startActivitywith anACTION_VIEWintent, which throwsActivityNotFoundExceptionon the RC2 (no browser installed). Now wrapped in try-catch.
Correctness & Safety
- Keepalive stops if profile fails to load: if
fcc_keepalive.jsonis missing or corrupt, the service nowstopSelf()instead of becoming a silent foreground no-op with a notification but no frame sends. - Fixed keepalive interval drift:
delay(INTERVAL_MS)moved to the start of the loop so the 2s interval is consistent regardless of send duration. Previously the actual interval was send_time + 2s. - Fixed serial probe binary corruption:
listenForSerialnow usesISO-8859-1instead of UTF-8 for decoding binary telemetry. UTF-8 multi-byte sequences could corrupt ASCII serial strings. - Rate-limited update checks: GitHub API is checked at most once per hour (unauthenticated limit is 60/hour). Prevents rate-limiting during development or repeated app restarts.
- Keepalive notification now opens the app when tapped (added
PendingIntent). - Guarded download against double-tap:
downloadUpdatechecksisDownloadingUpdatebefore launching. - Validated hex string parsing:
hexToBytesnow requires even-length input (throws instead of silently truncating).
About the FCC apply mechanism
A user raised concerns about the FCC apply mechanism being "brittle and unsafe" because it replays captured frames without verifying the ACK. This is a valid observation. However, there is no publicly documented DUML command to query the current radio region (FCC vs CE) — the dji-firmware-tools project confirms this. All known FCC unlock tools work the same way: write frames, discard the ACK, and report success based on TCP write completion. Verification is only possible by observing the DJI Fly transmission graph (the app already documents this in "How Do I Know If It Worked?").
The key improvements made in this version that address the safety concerns:
- The profile is now the minimal 21-frame universal set (restored in v1.4.5), not the 31-frame set that included unrelated altitude/distance/NFZ writes
disableFccnow stops keepalive before restoring CE, preventing the "persistent contention" the user described- The keepalive service now respects the user's stop intent (persistent flag + sticky-restart guard)
Compatibility
DJI RC2, RC Pro 2, RC Plus (smart controllers with a screen). 21-frame universal FCC profile. No Google Play Services required.