Skip to content

v1.4.7

Choose a tag to compare

@doesthings doesthings released this 14 Jul 01:54

FreeFCC v1.4.7 — Critical Fixes + Crash Protection

Critical Fixes

  • Fixed update installation broken by scoped storage: the previous version removed WRITE_EXTERNAL_STORAGE but installUpdate still tried to copy the APK to Environment.getExternalStorageDirectory()/FreeFCC/ — which is unwritable on Android 10+ scoped storage. Now uses the cached APK directly via FileProvider (the file_paths.xml cache-path already covers cacheDir/updates/).
  • Fixed app crash on malformed profile: autoConnectAndApply and send4gActivationFrames had no catch block — 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: disableFcc now 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 startActivity with an ACTION_VIEW intent, which throws ActivityNotFoundException on the RC2 (no browser installed). Now wrapped in try-catch.

Correctness & Safety

  • Keepalive stops if profile fails to load: if fcc_keepalive.json is missing or corrupt, the service now stopSelf() 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: listenForSerial now uses ISO-8859-1 instead 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: downloadUpdate checks isDownloadingUpdate before launching.
  • Validated hex string parsing: hexToBytes now 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
  • disableFcc now 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.