Ubuntu 16.04 is called xenial
. When we search the xenial archive for gnome-software
, we find version 3.20.1
. That was the last version that was available when xenial was released. Per Ubuntu's policy, only targeted fixes for critical bugs or security bugs are accepted as patches after release. This ensures stability for users who don't need the latest-and-greatest and prefer to just have things work the same as they did yesterday. No new versions are allowed in xenial
after release.
Fortunately, there is a suite called xenial-updates
. Sometimes package maintainers are happy to upload new versions of software which are still compatible with its dependencies in xenial
. This allows users to bypass the stability promise and get new software for a released distribution. gnome-software
is available in this suite as 3.20.5. I think this is where your version comes from.
At the time of writing there are several other instances of gnome-software
available in other Ubuntu releases:
- groovy: 3.36.1
- focal-updates: 3.36.1
- focal: 3.36.0
- eon-updates: 3.30.6
- eon: 3.30.6
- bionic-updates: 3.28.1
- bionic: 3.28.1
If we follow SEMVER rules you may notice that *-updates
never increments the major or minor revisions, just the patch revisions. That's a little bit of a red-flag.
If you want to install one of the more recent versions, you can! There are three ways to do this:
- Build from gnome's sources: I don't recommend this. There are lots of debian/ubuntu patches and it could cause some parts to not work with each other. Also, the installed files will no longer be managed by the package manager.
- Add a line in your
/etc/apt/sources.list
for one of the other suits. Then add APT::Default-Release xenial;
to /etc/apt/conf.d/
and install with the lines below. Be very careful about reading the new packages before you confirm the installation to be sure you don't accidentally upgrade your entire system to a newer release. If I missed a step, then it's pinning where you'd pin everything to xenial, then pin gnome-software
to a newer suite.
apt update
apt install -t bionic gnome-software
- Download
gnome-software_*.deb
manually and use dpkg -i
to install it. This prevents the needs to do any apt configuration or pinning and so it may be easier. It will also prevent you from accidentally upgrading your whole system. Get it from packages.ubuntu.com. The other property of this if there are dependency problems, you'll need to resolve them manually. I think that's a good thing because you'll be painfully aware of everything that needs to be upgraded and can make a decision about whether to abort.
One of the problems you'll run into is compatibility of dependencies. The smallest update you can do is to bionic which runs 3.28.1. Let's look at the problems we may encounter. If we compare the dependencies of gnome-software_3.20.5
against gnome-software_3.28.1
we see:
| gnome-software deps | 3.20.5 | 3.28.1 |
|--------------------------------|----------------------------|----------------------|
| appstream | any | any |
| apt-config-icons | any | any |
| dconf-gsettings-backend | any | any |
| gnome-software-common | = 3.20.5-0ubuntu0.16.04.13 | = 3.28.1-0ubuntu4 |
| gsettings-desktop-schemas | >= 3.18 | >= 3.18 |
| libappstream-glib8 | >= 0.5.13 | >= 0.7.0~git20170615 |
| libapt-pkg5.0 | >= 1.2 | |
| libatk1.0-0 | >= 1.12.4 | >= 1.12.4 |
| libc6 | >= 2.17 | >= 2.17 |
| libcairo2 | >= 1.2.4 | >= 1.2.4 |
| libfwupd2 | >= 0.6.3 | >= 1.0.3 |
| libgcc1 | >= 1:3.0 | |
| libgdk-pixbuf2.0-0 | >= 2.22.0 | >= 2.22.0 |
| libglib2.0-0 | >= 2.46.0 | >= 2.49.3 |
| libgnome-desktop-3-12 | >= 3.17.92 | |
| libgnome-desktop-3-17 | | >= 3.18 |
| libgspell-1-1 | | >= 1.3.2 |
| libgtk-3-0 | >= 3.18.2 | >= 3.22.4 |
| libgtkspell3-3-0 | any | |
| libgudev-1.0-0 | | >= 146 |
| libjson-glib-1.0-0 | >= 1.1.2 | >= 0.13.2 |
| liboauth0 | >= 0.9.1 | >= 0.9.1 |
| libpackagekit-glib2-18 | | >= 1.1.0 |
| libpolkit-gobject-1-0 | >= 0.99 | >= 0.99 |
| libsecret-1-0 | >= 0.7 | >= 0.7 |
| libsnapd-glib1 | >= 0.9 | |
| libsoup2.4-1 | >= 2.52 | >= 2.52 |
| libsqlite3-0 | >= 3.5.9 | |
| libstdc++6 | >= 5.2 | |
| packagekit | | >= 1.1.4 |
| software-properties-gtk | | any |
Now we start to see some of the trouble we are going to run into. Let me filter down this list to dependencies which are not already met in xenial
or xenial-updates
:
| package | 3.28.1 Requirement | Available in xenial |
|--------------------------------|----------------------------|----------------------|
| gnome-software-common | = 3.28.1-0ubuntu4 | 3.20.5 |
| libappstream-glib8 | >= 0.7.0~git20170615 | 0.5.13 |
| libfwupd2 | >= 1.0.3 | No |
| libglib2.0-0 | >= 2.49.3 | 2.48.2 |
| libgnome-desktop-3-17 | >= 3.18 | No |
| libgtk-3-0 | >= 3.22.4 | 3.18.9 |
| libpackagekit-glib2-18 | >= 1.1.0 | No |
| packagekit | >= 1.1.4 | No |
| software-properties-gtk | any | No |
I took a look at the debian/control
files for libfwupd2
, libgnome-desktop
, libpackagekit-glib2-18
and packagekit
and these don't seen to Breaks:
or Replaces:
any of the xenial packages so it could be ok to install those packages from the bionic
archive. However, you'd need to look at the dependencies of those packages in the same way that I did above to ensure things are safe.
When looking at gnome-software-common
I couldn't see a reason why you couldn't update the package. It's from the same source package as gnome-software
and so I think they are meant to be paired and it can be updated. Take a look at apt rdepends gnome-software-common
first to ensure that it doesn't break anything else. I think the -common
package is common to all architectures and that's the only reason why it's split from gnome-software
which is compiled for each architecture.
I'm really not sure about libappstream-glib8
, libglib2.0-0
or libgtk-3.0
. I think they can be updated because the major version doesn't increment. Usually if libgtk
3.1 is incompatible with 3.0, the package name would change from libgtk-3-0
to libgtk-3-1
so they could be installed in parallel and co-exist. Since that hasn't been done, I suspect they can co-exist.
As you can see, the dependencies are the toughest part to this. I'm not sure if method 2 above will do this for you automatically, but if you use method 3 then this is how you'd do it. Once you're happy that it can be installed, you'll need to also update the dependencies, and their dependencies, and their dependencies, etc. It could go all the way down to the kernel. Therefore it's up to you to decide how far you want to go with this update.