Skip to content

Termux:API bridge for RedTerm - #34

Closed
GlobalTechInfo wants to merge 5 commits into
mainfrom
feature/termux-api
Closed

GlobalTechInfo wants to merge 5 commits into
mainfrom
feature/termux-api

Conversation

@GlobalTechInfo

Copy link
Copy Markdown
Owner

Adds termux:API command surface, fixes CodeRabbit findings, ensures clean compile/lint.

…ile, and the user startup hook

The Termux:API command surface runs entirely in-app: a per-ABI C helper
spoke the abstract-UDS wire protocol with a listener in the app process,
and the guest scripts reach Android features without a second SSH, camera or
SMS stack. The manifest is trimmed to a defensible core so the app stops
reading as a trojan profile to Play Protect, and the dispatch gate
distinguishes a missing grant from an undeclared permission so affected
commands answer honestly instead of dying in a pipe.

/root/.startup.local is the user-managed, once-per-interactive-session
startup hook (issue 32); it is in the shared tail of the generated startup
for all twenty distros, and redterm-startup-local prints a safe starter
body that is a no-op wherever run-parts or /etc/update-motd.d is absent.

versionCode 8 / versionName 2.4.0.
…erence

The gate is reading the w: lines of compileDebugKotlin, not the exit
code, and 13 compiler warnings had slipped through being reported as a
clean build. None is fixed by a suppression:

- The five unchecked as? List<T> casts on reflective results
  (CellInfoApi, NetworkApis, SsidApi) become a star-projection cast plus
  per-element concrete casts, which the compiler can check.
- The eight deprecated references stop being references:
  ScanResult.SSID is read by name (withdrawn on 33); setVisibleInDownloadsUi
  is invoked reflectively on the levels where it still has effect (<29, a
  documented no-op since); the no-arg MediaRecorder is reached by name with
  the Context constructor on 34+; the withdrawn CDMA/EHRPD/1xRTT constants
  stand as their stable documented values; the three-argument Locale
  constructor becomes Locale.forLanguageTag (non-deprecated on every level
  the app runs); and setWifiEnabled is reached by name on the declared
  type.
…unded reads, and close the review's gaps

Guest paths are named on the distro side, but the bridge opens them in the
app process. The launcher now exports REDTERM_ROOTFS_HOST, the guest helper
attaches it to every request, and ApiPaths is the one place that projects a
guest path to the host path it actually lives at (or refuses it). Share,
storage-get, media-play and media-scan all go through it.

Also, per the review:
- ApiSocket reads run on a bounded pool with a deadline; LocalSocket has no
  read-timeout API, so a stuck peer is bounded by the pool cap and closed,
  not pinned. Response bodies over the uint16 field are refused, not sent.
- A read/write size cap on saf readDocument; a counter-range guard; a
  bounded callback read; a non-cyclic media scan; a bound on concurrent
  requests.
- A single JSON string encoder (ApiJson) so an SSID with control bytes is
  valid JSON; TtsApi keeps the exact language/region/variant; the wifi
  toggle checks its grant and a present boolean flag; NFC rejects a disabled
  radio, re-enables reader mode on resume, and posts a cancel on destroy.
- installOne only replaces scripts it owns (the marker); ensureInstalled
  clears just the binary and stamp, keeping feature output.
- the startup-hook sourcing test now runs the block the generator emits,
  not a hand copy.

Helper binaries rebuilt for all four ABIs; GUEST_SCRIPT_VERSION is 7.
@coderabbitai

coderabbitai Bot commented Nov 4, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 10 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9bb59f93-f3af-4ce7-a9e1-719740d1d6bb
Commits

Reviewing files that changed from the base of the PR and between 8cefccb and 73182a3.

Files selected for processing: 82
  • AGENTS.md
  • CHANGELOG.md
  • app/build.gradle.kts
  • app/src/main/AndroidManifest.xml
  • app/src/main/assets/redterm-api/aarch64/redterm-api
  • app/src/main/assets/redterm-api/armv7a/redterm-api
  • app/src/main/assets/redterm-api/i686/redterm-api
  • app/src/main/assets/redterm-api/x86_64/redterm-api
  • app/src/main/java/com/redtermapp/RedTermApp.kt
  • app/src/main/java/com/redtermapp/distro/DistroRunner.kt
  • app/src/main/java/com/redtermapp/distro/DistroSetup.kt
  • app/src/main/java/com/redtermapp/distro/ProotLaunch.kt
  • app/src/main/java/com/redtermapp/ui/SettingsActivity.kt
  • app/src/main/java/com/redtermapp/ui/TerminalActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ApiActions.kt
  • app/src/main/java/com/redtermapp/util/api/ApiFeature.kt
  • app/src/main/java/com/redtermapp/util/api/ApiHelper.kt
  • app/src/main/java/com/redtermapp/util/api/ApiJson.kt
  • app/src/main/java/com/redtermapp/util/api/ApiLifecycleApi.kt
  • app/src/main/java/com/redtermapp/util/api/ApiPaths.kt
  • app/src/main/java/com/redtermapp/util/api/ApiPermissions.kt
  • app/src/main/java/com/redtermapp/util/api/ApiRequestParser.kt
  • app/src/main/java/com/redtermapp/util/api/ApiSocket.kt
  • app/src/main/java/com/redtermapp/util/api/BatteryApi.kt
  • app/src/main/java/com/redtermapp/util/api/CallLogApi.kt
  • app/src/main/java/com/redtermapp/util/api/CallbackApi.kt
  • app/src/main/java/com/redtermapp/util/api/CameraInfoApi.kt
  • app/src/main/java/com/redtermapp/util/api/CameraPhotoApi.kt
  • app/src/main/java/com/redtermapp/util/api/CellInfoApi.kt
  • app/src/main/java/com/redtermapp/util/api/ClipboardApi.kt
  • app/src/main/java/com/redtermapp/util/api/DangerousApis.kt
  • app/src/main/java/com/redtermapp/util/api/DialogApi.kt
  • app/src/main/java/com/redtermapp/util/api/DisplayApis.kt
  • app/src/main/java/com/redtermapp/util/api/DownloadApi.kt
  • app/src/main/java/com/redtermapp/util/api/Extras.kt
  • app/src/main/java/com/redtermapp/util/api/FingerprintApi.kt
  • app/src/main/java/com/redtermapp/util/api/InfraredApi.kt
  • app/src/main/java/com/redtermapp/util/api/JobRunWorker.kt
  • app/src/main/java/com/redtermapp/util/api/JobScheduleApi.kt
  • app/src/main/java/com/redtermapp/util/api/KeystoreApi.kt
  • app/src/main/java/com/redtermapp/util/api/MediaApis.kt
  • app/src/main/java/com/redtermapp/util/api/MediaPlaybackApi.kt
  • app/src/main/java/com/redtermapp/util/api/MediaScannerApi.kt
  • app/src/main/java/com/redtermapp/util/api/MicRecordApi.kt
  • app/src/main/java/com/redtermapp/util/api/NetworkApis.kt
  • app/src/main/java/com/redtermapp/util/api/NfcApi.kt
  • app/src/main/java/com/redtermapp/util/api/NotificationApi.kt
  • app/src/main/java/com/redtermapp/util/api/NotificationChannelApi.kt
  • app/src/main/java/com/redtermapp/util/api/SafApi.kt
  • app/src/main/java/com/redtermapp/util/api/SensorApi.kt
  • app/src/main/java/com/redtermapp/util/api/ShareApi.kt
  • app/src/main/java/com/redtermapp/util/api/SpeechToTextApi.kt
  • app/src/main/java/com/redtermapp/util/api/SsidApi.kt
  • app/src/main/java/com/redtermapp/util/api/StorageGetApi.kt
  • app/src/main/java/com/redtermapp/util/api/TelephonyInfoApi.kt
  • app/src/main/java/com/redtermapp/util/api/TtsApi.kt
  • app/src/main/java/com/redtermapp/util/api/UsbApi.kt
  • app/src/main/java/com/redtermapp/util/api/WallpaperApi.kt
  • app/src/main/java/com/redtermapp/util/api/WifiEnableApi.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiBiometricActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiCameraActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiDialogActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiNfcActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiSafGrantActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiSpeechActivity.kt
  • app/src/main/java/com/redtermapp/util/api/ui/ApiUiBridge.kt
  • app/src/main/res/layout/activity_settings.xml
  • app/src/main/res/layout/settings_section_api_permissions.xml
  • app/src/main/res/values/strings.xml
  • app/src/main/res/values/themes.xml
  • app/src/main/res/values/themes_api.xml
  • app/src/test/java/com/redtermapp/distro/DistroSetupTest.kt
  • app/src/test/java/com/redtermapp/distro/ProotLaunchTest.kt
  • app/src/test/java/com/redtermapp/distro/StartupHookSourcingTest.kt
  • app/src/test/java/com/redtermapp/util/api/ApiHelperShellTest.kt
  • app/src/test/java/com/redtermapp/util/api/ApiHelperTest.kt
  • app/src/test/java/com/redtermapp/util/api/ApiPathsJsonTest.kt
  • app/src/test/java/com/redtermapp/util/api/ApiRequestParserTest.kt
  • app/src/test/java/com/redtermapp/util/api/BatteryApiTest.kt
  • app/src/test/java/com/redtermapp/util/api/SystemApisTest.kt
  • native/build-redterm-api.sh
  • native/redterm-api/redterm-api.c
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant