ShizuStore

Flywheel

Benjamin-Wiegand

1.1.1 · GitHub

Download APK
Android Auto Android 8.0+ 1 month ago GPL-3.0
120 ShizuStore
502 GitHub
66 Stars
6 MB Size

More about this app

Free and open source alternative to Android Auto aimed at de-googled phones, compatible with existing headunits; Shizuku is used for app embedding and call-audio capture.

Flywheel

Caution

  • Flywheel is experimental software.
  • Use it at your own risk.
  • I am not responsible for bricked headunits.

Flywheel is a free and open source alternative to Android Auto intended for users of de-googled phones, aiming to be compatible with existing headunits.

picture of it running

Documentation

For user documentation, visit the wiki tab.

Quick links

Bug reporting

If you encounter any issues, please visit the troubleshooting wiki page first. If you can't resolve the issue, please submit a bug report.

Contributing

Feel free to look for or open a new issue for something you want to work on, and say that you'll work on it. Other contributors may provide helpful information or warn you of upcoming churn, so please pay attention to new comments on the issue.

Please note that contributions may not always be accepted, but are always appreciated!

Thanks

Non-code contributions:

  • Nick for helping test on his car during early development
  • Zelemar Electronics for helping me diagnose an OEM headunit for bench testing

Other projects of great help during development:

Close

How Shizuku is used

Can show phone apps on a car headunit and forward touch and call audio via `Shizuku` privileged daemon

This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.

How this app uses Shizuku

Shizuku is used to start a privileged helper that lets the phone project its apps to a car headunit like Android Auto.

  • Show projection display: creates a dedicated virtual display for the car screen so phone content can be rendered for the headunit and resized or reattached when the video output changes.
  • Open phone apps on car: launches the phone app the user picks onto the car display, including the main projection UI and individual embedded apps, so they appear on the headunit.
  • Control apps from car: sends touch, button and back actions received from the car to the app shown on the car display, so the headunit controls the phone app.
  • Hear media and calls: captures phone media output and phone call downlink audio for streaming to the headunit, so music and calls play through the car.

Android APIs or commands used

  • DisplayManager.createVirtualDisplay
  • VirtualDisplay.getDisplay
  • VirtualDisplay.resize
  • VirtualDisplay.setSurface
  • VirtualDisplay.release
  • ActivityOptions.setLaunchDisplayId
  • IActivityManager.startActivityAsUser
  • InputManager.injectInputEvent
  • AudioRecord with MediaRecorder.AudioSource.REMOTE_SUBMIX
  • AudioRecord with MediaRecorder.AudioSource.VOICE_DOWNLINK
  • am start-activity

Notable details

If the privileged helper cannot create its display, the app falls back to a local virtual display with reduced behavior (new app screens may appear on the phone instead of staying on the car display).

Close

Changelog

What's new for version 1.1.1

Updated fastlane description

no functional changes

Close

Permissions

21 permissions requested

  • android.permission.POST_NOTIFICATIONS
  • android.permission.FOREGROUND_SERVICE
  • android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE
  • android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION
  • android.permission.RECORD_AUDIO
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.ACCESS_WIFI_STATE
  • android.permission.READ_PHONE_STATE
  • android.permission.READ_CONTACTS
  • android.permission.READ_CALL_LOG
  • android.permission.ANSWER_PHONE_CALLS
  • android.permission.BLUETOOTH_CONNECT
  • android.permission.CHANGE_NETWORK_STATE
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.BLUETOOTH
  • android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE
  • android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND
  • android.permission.INTERNET
  • android.permission.QUERY_ALL_PACKAGES
  • moe.shizuku.manager.permission.API_V23
  • io.benwiegand.projection.geargrinder.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
Close