v1.4.6
FreeFCC v1.4.6 — Hardening + Bug Fixes
New Features
- BootReceiver: if auto-FCC is enabled, the keepalive service restarts automatically after a controller reboot — no need to reopen FreeFCC manually
- Sticky restart respects user intent: if the system kills and restarts the keepalive service, it checks the persistent flag so it won't silently re-enable after you stopped it
- UI keepalive toggle synced: the toggle reflects the actual service state after a process restart
Security
- APK SHA-256 verification: downloaded updates are verified against the GitHub asset digest before offering install — a tampered or corrupted download is refused
- FileProvider scope narrowed: the cache path is now restricted to
updates/instead of the entire cache directory - Removed deprecated storage permissions:
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGEare no-ops on API 30+ and have been removed allowBackup=false: the auto-FCC flag is device-local and no longer backed up / restored across devices- Android 14 foreground service fix: added
CHANGE_WIFI_STATEso theconnectedDeviceforeground service type has the required underlying permission on API 34+
Bug Fixes
- Keepalive no longer swallows CancellationException — coroutine cancellation now takes effect promptly instead of waiting for the next blocking call
installUpdatenow runs on a background thread — the APK copy was blocking the UI thread (ANR risk)- FileOutputStream leak fixed in the update downloader (now uses
.use {}) - Crash protection:
enableFcc,disableFcc,setLed, andqueryDeviceInfonow catch parse/load errors instead of crashing the app on a malformed profile asset queryDeviceInfoempty-frames guard: no moreNoSuchElementExceptionifdevice_info.jsonis emptysendAndReceiveshort-read guard: a truncated response no longer throwsArrayIndexOutOfBoundsException- Keepalive interval drift fixed: the 2s interval now starts at the beginning of each loop, so the actual interval is consistent regardless of send duration
- Keepalive state desync fixed: the persistent flag is checked on process restart so the UI toggle matches reality
- Duplicate install intents removed: the file manager intent that competed with the system installer has been removed
- HardwareLock.end() is now safe to call without ownership — no more
IllegalMonitorStateExceptionfrom a stray release
Performance
- Keepalive profile cached at service creation instead of re-parsing JSON and rebuilding frames with CRC every 2 seconds
- ACK read buffer reused instead of allocating a new 2KB buffer per frame
- Named constants for connect timeout, settle delay, and alternate ports (8901–8904)
Code Quality
- Hardcoded version strings in the UI now use
APP_VERSION(no more stale "1.4.4" after a bump) - Build version bumped to 1.4.6 (versionCode 14)
Compatibility
Same as before: DJI RC2, RC Pro 2, RC Plus (smart controllers with a screen). 21-frame universal FCC profile, 2 rounds, 150ms between frames.