File waydroid.spec of Package waydroid
%global forgeurl https://github.com/waydroid/waydroid
%global selinuxtype targeted
%global forgemeta #forge
%global tag %{version}
%{!?_metainfodir:%define _metainfodir %{_datadir}/metainfo}
%{!?_iconsdir:%define _iconsdir %{_datadir}/icons}
%forgemeta
Name: waydroid
Release: 5.5
Summary: Container-based approach to boot a full Android system on GNU/Linux
License: GPL-3.0-only
Version: 1.5.4
URL: %{forgeurl}
Source: %{name}-%{version}.tar.gz
Source1: waydroid.te
Source4: dev-binderfs.mount
Source6: waydroid.fc
Patch0: setup-firewalld.patch
Patch1: mount-secontext.patch
BuildArch: noarch
BuildRequires: make
BuildRequires: selinux-policy-devel
BuildRequires: container-selinux
BuildRequires: systemd
BuildRequires: python3-devel
BuildRequires: (dbus-1-devel or dbus-devel)
BuildRequires: polkit-devel
BuildRequires: python3-gbinder
BuildRequires: (python3-dbus-python or python3dist(dbus-python))
BuildRequires: python3-gobject
BuildRequires: systemd-rpm-macros
BuildRequires: desktop-file-utils
BuildRequires: (appstream-glib or libappstream-glib)
Requires: android-tools
Requires: anbox-modules-dkms
Requires: python3-gbinder
Requires: libgbinder1
Requires: libglibutil1
Requires: python3-gobject
Requires: lxc
Requires: nftables
Requires: iproute
Requires: iptables
Requires: dnsmasq
Suggests: kernel-longterm
Suggests: kernel-longterm-devel
Suggests: scrcpy
Suggests: waydroid-image
Suggests: waydroid-image-lineage18
Suggests: waydroid-image-gapps
Suggests: waydroid-image-gapps-lineage18
Requires: (python3-dbus-python or python3dist(dbus-python))
Requires: (%{name}-selinux = %{version}-%{release} if selinux-policy-%{selinuxtype})
%description
Waydroid exemplifies a container-based approach to executing a complete Android system on a standard GNU/Linux operating systems.
Waydroid utilizes Linux namespaces (user, pid, uts, net, mount, ipc) to operate a comprehensive Android system within a container and to facilitate the availability of Android applications on any GNU/Linux-based platform.
Conversely, the Android system within the container has direct access to the necessary hardware components.
The Android runtime environment is distributed with a minimal, customized Android system image based on the LineageOS.
%package selinux
Summary: SELinux policy module for waydroid
Requires: %{name} = %{version}-%{release}
Requires: container-selinux
%{?selinux_requires}
%description selinux
This package contains the SELinux policy module necessary to run Waydroid.
%prep
%autosetup -p1
mkdir SELinux
cp %{S:1} SELinux/
cp %{S:6} SELinux/
%build
# Remove link for ROM files
sed -i -e '/"system_channel":/ s/: ".*"/: ""/' tools/config/__init__.py
sed -i -e '/"vendor_channel":/ s/: ".*"/: ""/' tools/config/__init__.py
# Compile sepolicy
cd SELinux
%{__make} NAME=%{selinuxtype} -f /usr/share/selinux/devel/Makefile
%install
%make_install LIBDIR=%{_libdir} DESTDIR=%{buildroot} USE_SYSTEMD=1 USE_DBUS_ACTIVATION=1 USE_NFTABLES=1
%{?py_byte_compile:py_byte_compile %{python3} %{buildroot}%{_prefix}/lib/waydroid}
%{__install} -d %{buildroot}%{_unitdir}
%{__install} -d %{buildroot}%{_datadir}/selinux/%{selinuxtype}
%{__install} -p -m 644 %{S:4} %{buildroot}%{_unitdir}/
%{__install} -p -m 644 SELinux/%{name}.pp %{buildroot}%{_datadir}/selinux/%{selinuxtype}/%{name}.pp
sed -i '/^\[Unit\]/a Wants=dev-binderfs.mount' %{buildroot}%{_unitdir}/waydroid-container.service
sed -i '/^\[Service\]/a ExecStartPre=/usr/bin/ln -sf /dev/binderfs/binder /dev/binderfs/vndbinder /dev/binderfs/hwbinder /dev/' %{buildroot}%{_unitdir}/waydroid-container.service
%check
desktop-file-validate %{buildroot}/%{_datadir}/applications/Waydroid.desktop
desktop-file-validate %{buildroot}/%{_datadir}/applications/waydroid.market.desktop
desktop-file-validate %{buildroot}/%{_datadir}/applications/waydroid.app.install.desktop
appstream-util validate --nonet %{buildroot}%{_metainfodir}/id.waydro.waydroid.metainfo.xml
%pre selinux
%selinux_relabel_pre -s %{selinuxtype}
%post selinux
%selinux_modules_install -s %{selinuxtype} %{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%selinux_relabel_post -s %{selinuxtype}
if [ "$1" -le "1" ]; then # First install
# the daemon needs to be restarted for the custom label to be applied
%systemd_postun_with_restart waydroid-container.service
fi
%postun selinux
if [ $1 -eq 0 ]; then
%selinux_modules_uninstall -s %{selinuxtype} %{name}
%selinux_relabel_post -s %{selinuxtype}
fi
%post
waydroid upgrade -o > /dev/null || :
%systemd_post waydroid-container.service
if [ $1 -eq 1 ]; then
if systemctl -q is-enabled waydroid-container.service > /dev/null 2>&1 ; then
systemctl start waydroid-container.service > /dev/null 2>&1 || :
fi
fi
%preun
%systemd_preun waydroid-container.service
%postun
%systemd_postun_with_restart waydroid-container.service
%files
%license LICENSE
%doc README.md
%{_prefix}/lib/waydroid
%{_datadir}/applications/Waydroid.desktop
%{_datadir}/applications/waydroid.market.desktop
%{_datadir}/applications/waydroid.app.install.desktop
%dir %{_metainfodir}/
%{_metainfodir}/id.waydro.waydroid.metainfo.xml
%dir %{_iconsdir}/hicolor/
%dir %{_iconsdir}/hicolor/512x512/
%dir %{_iconsdir}/hicolor/512x512/apps/
%{_iconsdir}/hicolor/512x512/apps/waydroid.png
%{_bindir}/waydroid
%{_unitdir}/waydroid-container.service
%{_unitdir}/dev-binderfs.mount
%{_datadir}/dbus-1/system-services/id.waydro.Container.service
%{_datadir}/dbus-1/system.d/id.waydro.Container.conf
%{_datadir}/polkit-1/actions/id.waydro.Container.policy
%dir %{_datadir}/desktop-directories/
%{_datadir}/desktop-directories/waydroid.directory
%dir %{_sysconfdir}/xdg/
%dir %{_sysconfdir}/xdg/menus/
%dir %{_sysconfdir}/xdg/menus/applications-merged/
%{_sysconfdir}/xdg/menus/applications-merged/waydroid.menu
%files selinux
%doc SELinux/%{name}.te
%{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%changelog
* Mon Jul 01 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.4
- Maintain an package %{name} and %{name}-selinux
* Mon Jun 23 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.3
- Maintain an package %{name} and %{name}-selinux
* Thu Jun 19 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.1
- Maintain an package %{name} and %{name}-selinux