One way to improve the user experience of your snaps is by reducing their size. Not only does this reduce the amount of storage and network bandwidth required to install and update your snap, but it also reduces its startup time. Since snaps are stored compressed on disk, they need to be decompressed when your application starts, and that takes longer when your snap is larger.
Using content snaps and extensions
Snaps can provide content to other snaps using the content interface. Many popular runtimes and libraries such as GNOME, Qt and Wine are packaged in content snaps. Instead of adding those libraries to your snap, you can connect to the relevant content snaps. The easiest way to use content snaps is to use one of the Snapcraft desktop extensions.
- Snaps using KDE Frameworks or Qt5 can use the
kde-neon
extension which adds content snaps for themes, the Qt5 runtime and KDE frameworks. - Most other desktop snaps can use the
gnome-3-28
extension. - Snaps using Wine can use the
wine-platform-runtime
andwine-platform-5-stable
snaps. - The
gtk-common-themes
bundles many popular GTK, cursor and icon themes.
Updating an existing snap to use a content snap or extension will not automatically reduce the size of your snap. You also need to manually remove the relevant libraries from your snap by removing them from
stage-packages
, for example. The cleanup part can help you do this automatically.
Avoid staging development files
The Ubuntu archives include many packages with development files whose name ends in -dev
. These packages are required to compile software which uses the libraries. For example, in order to compile software which uses libgtk-3-0
(10.1 MB), you also need to install libgtk-3-dev
(+14.0 MB). After compilation, these packages are not needed anymore, so it’s important to make sure they are not included in your snap. In the example of libgtk-3-0
, this will more than halve the size of the library in your snap.
To avoid this, move all stage-packages
which end in -dev
to build-packages
and add their regular counterpart to stage-packages
. See Build and staging dependencies for more information.
Using the cleanup part⚓
Snaps often ship libraries that are already available in the base snap or connected content snaps. This is because stage-packages
currently pulls in all the dependencies of the packages you list, even if those dependencies are already available from content snaps.
You can remove those libraries manually by excluding them using the stage
or prime
keywords. This requires a lot of manual work, however, because you have to figure out which libraries are duplicated and exclude each one manually. An easier method is to use the following cleanup
part, which automatically compares your snap with all the content snaps you specify and removes duplicate files.
-
Add the following part to your
snapcraft.yaml
in theparts
section.# This part removes all the files in this snap which already exist in # connected content and base snaps. Since these files will be available # at runtime from the content and base snaps, they do not need to be # included in this snap itself. # # More info: https://forum.snapcraft.io/t/reducing-the-size-of-desktop-snaps/17280#heading--cleanup-part # cleanup: after: # Make this part run last; list all your other parts here - <YOUR-PARTS> plugin: nil build-snaps: # List all content-snaps and base snaps you're using here - <CORE-SNAP> - <CONTENT-SNAP-1> - <CONTENT-SNAP-2> override-prime: | set -eux for snap in "<CORE-SNAP>" "<CONTENT-SNAP-1>" "<CONTENT-SNAP-2>"; do # List all content-snaps and base snaps you're using here cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$CRAFT_PRIME/{}" \; done
-
List all the other parts of your snap in the
after
section, so that this part gets built last. -
Replace
<CORE-SNAP>
in thebuild-snaps
andoverride-prime
sections with thebase
that you’re using. -
List all your content snaps that you use in the
build-snaps
andoverride-prime
sections.
If your snap uses extensions, you can use the
snapcraft expand-extensions
command to see which content snaps the extension will add.
ⓘ See Desktop applications for more information on how to snap a desktop application.