rev-match

An Android overlay for practicing rev matching while driving.

Engine RPM per gear at your current GPS speed, as an overlay.

HobbiesAndroid appKotlin, Android Viewsv0.2.0

What it is

Rev matching means blipping the throttle to the RPM the next gear will need before you let the clutch out. Knowing that number takes practice; RevMatch shows it. The app computes the engine RPM for every gear at your current GPS speed and draws it in a draggable overlay that stays visible over Google Maps or whatever navigation app is in front.

How it works

RPM is calculated from the gearing, not read from the engine:

rpm = speed [m/min] / tire circumference [m] × gear ratio × final drive

Tire circumference comes from the nominal size, such as 205/55 R16. The table is built in 5 km/h steps, stops at the gearing's rev limit and is capped at 400 km/h. Displayed RPM is rounded to 100 rpm and shown in thousands, so 2.7 means 2700.

A foreground service reads the platform LocationManager, filters and snaps the speed, and feeds the overlay. Calculation, speed filtering and formatting are Android-independent and tested on the JVM. The whole thing is one :app module in Kotlin with classic Android Views and SharedPreferences.

What it does

  1. Choose a built-in preset, or enter gear ratios, final drive, tire size and rev limit. Custom setups save as named presets; the last-run setup is remembered, including unsaved edits.
  2. Tap Start overlay and grant location and display-over-other-apps access.
  3. Read the target RPM for each gear alongside your speed. Drag to move, pinch to resize, close button to stop.

The overlay snaps speed to 5 km/h and shows the neighbouring speed rows. Values within 10% of the rev limit turn red; gears already past their limit show a dash. Position and scale are remembered. If GPS fixes stop arriving the readings are marked NO GPS. Built-in presets are read-only; saving a custom preset under an existing custom name replaces it.

Limitations

The number on screen is a model, not a measurement. GPS speed and nominal tire dimensions are not a substitute for the car's instruments. Some built-in rev limits are marked as estimated; split-final-drive gearboxes are represented with scaled ratios. Verify a preset against the car's specifications and tachometer, and configure the app before driving, not while. Lint currently flags that the manifest declares ACCESS_FINE_LOCATION without ACCESS_COARSE_LOCATION.

Build and run

Requires Android 8.0 (API 26) or newer. There is no store listing; the APK is built from source. With the Android SDK (platform API 35) and Gradle 9.8.1:

gradle :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk

On an emulator, inject a fix to test the overlay; the last argument is speed in knots, and 32.4 knots is about 60 km/h:

adb emu geo fix 21.01 52.2 100 8 32.4

Release signing reads a gitignored keystore.properties. Bundled Barlow and B612 fonts are under the SIL Open Font License.