Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Flutter Pi | 1,216 | 4 days ago | 60 | mit | C | |||||
A light-weight Flutter Engine Embedder for Raspberry Pi that runs without X. | ||||||||||
Flutterhole | 350 | a year ago | 62 | mit | Dart | |||||
A third party Android application for the Pi-Hole® dashboard. | ||||||||||
Flutter_embedded | 149 | a year ago | 1 | mit | CMake | |||||
Embedded Flutter | ||||||||||
Flutter_from_scratch | 127 | a year ago | 5 | C++ | ||||||
A minimal Flutter Embedder from Scratch. | ||||||||||
Smartgreenhouse | 35 | a year ago | gpl-3.0 | Vue | ||||||
🌿👨🔧智能大棚(物联网课设/安卓/web/后端/硬件) // A smart greenhouse project for my IOT curriculum project | ||||||||||
Mm Remote | 18 | 2 years ago | 3 | mit | Dart | |||||
MM-Remote is an Android :iphone: Linux and Windows :computer: app to control your MagicMirror remotely | ||||||||||
Walmart Smart Shopping Cart | 9 | 3 years ago | Dart | |||||||
🛒Self-Checkout Smart Shopping Cart | Walmart | HackFest 19 | ||||||||||
Drun | 9 | a year ago | 5 | other | ||||||
A full-stack open-source autonomous drone delivery system. | ||||||||||
Kart Project | 8 | 2 months ago | mit | Dart | ||||||
A flutter-pi-app running on a RaspberryPi 4, being the infotainment system for a custom builded e-kart, planned by two brothers. | ||||||||||
Fluboard | 7 | 8 months ago | Dart | |||||||
Calendar board built with Flutter and ❤️ |
9776b9fd916635e10a32bd426fcd7a20c3841faf
A light-weight Flutter Engine Embedder for Raspberry Pi. Inspired by chinmaygarde/flutter_from_scratch. Flutter-pi also runs without X11, so you don't need to boot into Raspbian Desktop & have X11 and LXDE load up; just boot into the command-line.
You can now theoretically run every flutter app you want using flutter-pi, including apps using packages & plugins, just that you'd have to build the platform side of the plugins you'd like to use yourself.
The difference between packages and plugins is that packages don't include any native code, they are just pure Dart. Plugins (like the shared_preferences plugin) include platform-specific code.
Although flutter-pi is only tested on a Rasberry Pi 4 2GB, it should work fine on other linux platforms, with the following conditions:
This means flutter-pi won't work on a Pi Zero (only the first one) or Pi 1.
Known working boards:
If you encounter issues running flutter-pi on any of the supported platforms listed above, please report them to me and I'll fix them.
app.so
(for running your app in Release/Profile mode)git pull && git checkout origin/master
and continue with compiling, step 2.Install the flutter engine binaries using the instructions in the in the flutter-engine-binaries-for-arm repo..
flutter-pi needs flutters flutter_embedder.h
to compile and icudtl.dat
at runtime. It also needs libflutter_engine.so.release
at runtime when invoked with the --release
flag and libflutter_engine.so.debug
when invoked without.
You actually have two options here:
Install cmake, graphics, system libraries and fonts:
$ sudo apt install cmake libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev ttf-mscorefonts-installer fontconfig libsystemd-dev libinput-dev libudev-dev libxkbcommon-dev
If you want to use the gstreamer video player, install these too:
$ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad gstreamer1.0-libav
libsystemd
is not systemd, it's just an utility library. It provides the event loop and dbus support for flutter-pi.libinput-dev
, libudev-dev
and libxkbcommon-dev
are needed for (touch, mouse, raw keyboard and text) input support.libudev-dev
is required, but actual udev is not. Flutter-pi will just open all event
devices inside /dev/input
(unless overwritten using -i
) if udev is not present.gpiod
and libgpiod-dev
where required in the past, but aren't anymore since the flutter_gpiod
plugin will directly access the kernel interface.Update the system fonts.
sudo fc-cache
git clone https://github.com/ardera/flutter-pi
cd flutter-pi
mkdir build && cd build
cmake ..
make -j`nproc`
sudo make install
Open raspi-config:
sudo raspi-config
Switch to console mode:
System Options -> Boot / Auto Login
and select Console
or Console (Autologin)
.
You can skip this if you're on Raspberry Pi 4 with Raspbian Bullseye
Enable the V3D graphics driver:
Advanced Options -> GL Driver -> GL (Fake KMS)
Configure the GPU memory
Performance Options -> GPU Memory
and enter 64
.
Leave raspi-config
.
Give the pi
permission to use 3D acceleration. (NOTE: potential security hazard. If you don't want to do this, launch flutter-pi
using sudo
instead.)
usermod -a -G render pi
Finish and reboot.
omxplayer_video_player
plugin.pi
isn't allowed to directly access the GPU because IIRC this has some privilege escalation bugs. Raspberry Pi has quite a lot of system-critical, not graphics-related stuff running on the GPU. I read somewhere it's easily possible to gain control of the GPU by writing malicious shaders. From there you can gain control of the CPU and thus the linux kernel. So basically the pi
user could escalate privileges and become root
just by directly accessing the GPU. But maybe this has already been fixed, I'm not sure.Make sure you've installed the flutter SDK. You must use a flutter SDK that's compatible to the installed engine binaries.
If you encounter error messages like Invalid kernel binary format version
, Invalid SDK hash
or Invalid engine hash
:
stable
and up to date and your engine binaries are up to date.Open terminal or commandline and cd
into your app directory.
flutter build bundle
Deploy the asset bundle to the Raspberry Pi using rsync
or scp
.
rsync
(available on linux and macOS or on Windows when using WSL)
rsync -a --info=progress2 ./build/flutter_assets/ [email protected]:/home/pi/my_apps_flutter_assets
scp
(available on linux, macOS and Windows)
scp -r ./build/flutter_assets/ [email protected]:/home/pi/my_apps_flutter_assets
flutter_gallery
and deploy it using rsync
in this example.git clone https://github.com/flutter/gallery.git flutter_gallery
cd flutter_gallery
git checkout 9776b9fd916635e10a32bd426fcd7a20c3841faf
flutter build bundle
rsync -a ./build/flutter_assets/ [email protected]:/home/pi/flutter_gallery/
flutter-pi /home/pi/flutter_gallery
.9776b9fd916635e10a32bd426fcd7a20c3841faf
is currently the latest flutter gallery
commit working with flutter stable.app.so
(for running your app in Release/Profile mode)C:\flutter
. (I'm on Windows)cd
into your app directory.flutter build bundle
my_app_name
with the name of your app)
C:\flutter\bin\cache\dart-sdk\bin\dart.exe ^
C:\flutter\bin\cache\dart-sdk\bin\snapshots\frontend_server.dart.snapshot ^
--sdk-root C:\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk_product ^
--target=flutter ^
--aot ^
--tfa ^
-Ddart.vm.product=true ^
--packages .dart_tool\package_config.json ^
--output-dill build\kernel_snapshot.dill ^
--verbose ^
--depfile build\kernel_snapshot.d ^
package:my_app_name/main.dart
--packages
argument should be set to .packages
. In versions greater than or equal to 3.3.0 the --packages
argument should be set to .dart_tool\package_config.json
.gen_snapshot_linux_x64_release
I provide in the engine binaries repo.app.so
. If you're building for arm64, you need to omit the --sim-use-hardfp
flag.
gen_snapshot_linux_x64_release \
--deterministic \
--snapshot_kind=app-aot-elf \
--elf=build/flutter_assets/app.so \
--strip \
--sim-use-hardfp \
build/kernel_snapshot.dill
app.so
to your Raspberry Pi.
rsync -a --info=progress2 ./build/flutter_assets/ [email protected]:/home/pi/my_app
or
scp -r ./build/flutter_assets/ [email protected]:/home/pi/my_app
flutter-pi --release /home/pi/my_app
flutter_gallery
and deploy it using rsync
in this example.
git clone https://github.com/flutter/gallery.git flutter_gallery
git clone --depth 1 https://github.com/ardera/flutter-engine-binaries-for-arm.git engine-binaries
cd flutter_gallery
git checkout 9776b9fd916635e10a32bd426fcd7a20c3841faf
flutter build bundle
C:\flutter\bin\cache\dart-sdk\bin\dart.exe ^
C:\flutter\bin\cache\dart-sdk\bin\snapshots\frontend_server.dart.snapshot ^
--sdk-root C:\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk_product ^
--target=flutter ^
--aot ^
--tfa ^
-Ddart.vm.product=true ^
--packages .dart_tool\package_config.json ^
--output-dill build\kernel_snapshot.dill ^
--verbose ^
--depfile build\kernel_snapshot.d ^
package:gallery/main.dart
wsl
../engine-binaries/arm/gen_snapshot_linux_x64_release \
--deterministic \
--snapshot_kind=app-aot-elf \
--elf=build/flutter_assets/app.so \
--strip \
--sim-use-hardfp \
build/kernel_snapshot.dill
rsync -a --info=progress2 ./build/flutter_assets/ [email protected]:/home/pi/flutter_gallery/
exit
flutter-pi --release /home/pi/flutter_gallery
.USAGE:
flutter-pi [options] <asset bundle path> [flutter engine options]
OPTIONS:
--release Run the app in release mode. The AOT snapshot
of the app ("app.so") must be located inside the
asset bundle directory.
This also requires a libflutter_engine.so that was
built with --runtime-mode=release.
-o, --orientation <orientation> Start the app in this orientation. Valid
for <orientation> are: portrait_up, landscape_left,
portrait_down, landscape_right.
For more information about this orientation, see
the flutter docs for the "DeviceOrientation"
enum.
Only one of the --orientation and --rotation
options can be specified.
-r, --rotation <degrees> Start the app with this rotation. This is just an
alternative, more intuitive way to specify the
startup orientation. The angle is in degrees and
clock-wise.
Valid values are 0, 90, 180 and 270.
-d, --dimensions "width_mm,height_mm" The width & height of your display in
millimeters. Useful if your GPU doesn't provide
valid physical dimensions for your display.
The physical dimensions of your display are used
to calculate the flutter device-pixel-ratio, which
in turn basically "scales" the UI.
-i, --input <glob pattern> Appends all files matching this glob pattern to the
list of input (touchscreen, mouse, touchpad,
keyboard) devices. Brace and tilde expansion is
enabled.
Every file that matches this pattern, but is not
a valid touchscreen / -pad, mouse or keyboard is
silently ignored.
If no -i options are given, flutter-pi will try to
use all input devices assigned to udev seat0.
If that fails, or udev is not installed, flutter-pi
will fallback to using all devices matching
"/dev/input/event*" as inputs.
In most cases, there's no need to specify this
option.
Note that you need to properly escape each glob
pattern you use as a parameter so it isn't
implicitly expanded by your shell.
-h, --help Show this help and exit.
EXAMPLES:
flutter-pi ~/hello_world_app
flutter-pi --release ~/hello_world_app
flutter-pi -o portrait_up ./my_app
flutter-pi -r 90 ./my_app
flutter-pi -d "155, 86" ./my_app
SEE ALSO:
Author: Hannes Winkler, a.k.a ardera
Source: https://github.com/ardera/flutter-pi
License: MIT
For instructions on how to build an asset bundle or an AOT snapshot
of your app, please see the linked git repository.
For a list of options you can pass to the flutter engine, look here:
https://github.com/flutter/engine/blob/master/shell/common/switches.h
<asset bundle path>
is the path of the flutter asset bundle directory (i.e. the directory containing kernel_blob.bin
)
of the flutter app you're trying to run.
[flutter engine options...]
will be passed as commandline arguments to the flutter engine. You can find a list of commandline options for the flutter engine Here.
Gstreamer video player is a newer video player based on gstreamer. The older video player (omxplayer_video_player) was based on deprecated omxplayer and it was kind of a hack. So I recommend using the gstreamer one instead.
To use the gstreamer video player, just rebuild flutter-pi (delete your build folder and reconfigure) and make sure the necessary gstreamer packages are installed. (See dependencies)
And then, just use the stuff in the official video_player package. (VideoPlayer
, VideoPlayerController
, etc, there's nothing specific you need to do on the dart-side)
Graphics performance is actually pretty good. With most of the apps inside the flutter SDK -> examples -> catalog
directory I get smooth 50-60fps on the Pi 4 2GB and Pi 3 A+.
Due to the way the touchscreen driver works in raspbian, there's some delta between an actual touch of the touchscreen and a touch event arriving at userspace. The touchscreen driver in the raspbian kernel actually just repeatedly polls some buffer shared with the firmware running on the VideoCore, and the videocore repeatedly polls the touchscreen. (both at 60Hz) So on average, there's a delay of 17ms (minimum 0ms, maximum 34ms). Actually, the firmware is polling correctly at ~60Hz, but the linux driver is not because there's a bug. The linux side actually polls at 25Hz, which makes touch applications look terrible. (When you drag something in a touch application, but the application only gets new touch data at 25Hz, it'll look like the application itself is redrawing at 25Hz, making it look very laggy) The github issue for this raspberry pi kernel bug is here. Leave a like on the issue if you'd like to see this fixed in the kernel.
This is why I created my own (userspace) touchscreen driver, for improved latency & polling rate. See this repo for details. The driver is very easy to use and the difference is noticeable, flutter apps look and feel a lot better with this driver.
There a #custom-embedders
channel on the flutter discord which you can use if you have any questions regarding flutter-pi or generally, anything related to embedding the engine for which you don't want to open issue about or write an email.