Sailfish X Build and Flash

From SailfishOS Documentation

Sailfish OS Hardware Adaptation Development Kit for Sony Xperia X

Here you will find instructions how to build Sailfish OS image and flash it to Sony Xperia X (F5121) device.


  • 2018-06-25: Aligned with Platform SDK 2.2.0 and target
  • 2017-11-02: droid-flashing-tools has now been provided in nemo:devel:hw:common repo (which is automaticaly available for local builds), which should unbreak mic image creation
  • 2017-10-11: EDGE variable added for cutting and bleeding flavours of the HW adaptation (removed in Jun '18 due to adaptation now being stable)
  • 2017-10-10: Switching to blobless builds, you no longer have to download SW binaries to build things, will only need them to flash the image (we recommend to start your dev environment from scratch at this point)
  • 2017-10-07: Each repo init below now points to the tagged-manifest.xml, which means a complete re-init, re-sync, and rebuild is required to fix the recent mobile data issue.
  • 2017-09-29: Bluetooth is now enabled, you are welcome to test its profiles and fix up as many as you can (ping jusa in IRC for guidance).
    Browser video playback fixed.
    Camera video recording fixed.
    General performance boosted by enabling all 6 CPU cores.
  • 2017-09-26: droid-configs has been updated to fix the nothing provides requested droid-hal-version-f5121 error


Please download the latest Sailfish OS HADK (Hardware Adaptation Development Kit) from within this link.

If used previously, you'll need to re-install/update your build environment to Sailfish OS Platform SDK 2.2.0 (or newer), delete old target, and create new target, just like HADK v2.2.0 instructs.

If you are new to HADK, please carefully read the disclaimer on page 1, then chapters 1 and 2.

The disk space requirement for this build is not 16GB as HADK says, but around 80GB. The download bandwidth requirement is around 20GB.

HADK uses CyanogenMod as reference base. Here we'll instead have Sony's stock Android (6.0.1 or 7.x) – these are the versions that are supported by Sailfish X and need to be flashed to your Sony before flashing Sailfish OS image. Now you can read through chapter 3.

If you ever run into difficulties, we're there to help in the #sailfishos-porters channel on IRC at Freenode.

In chapter 4 (Setting up the SDKs) setup the environment with:

  • VENDOR=sony
  • DEVICE=f5121
  • Also add HABUILD_DEVICE=suzu next to them in the ~/.hadk.env
  • As well as FAMILY=f512x

Follow through the chapter 4 until the end, and ignore chapter 5, instead perform the following:


git config --global "Your Name"
git config --global ""
ubu-chroot -r $PLATFORM_SDK_ROOT/sdks/ubuntu

At this point, install Android's repo tool: Then


sudo mkdir -p $ANDROID_ROOT
sudo chown -R $USER $ANDROID_ROOT
repo init -u git:// -b hybris-sony-aosp-6.0.1_r80-20170902 -m tagged-manifest.xml
# Adjust X to your bandwidth capabilities
repo sync -jX --fetch-submodules
source build/
export USE_CCACHE=1
lunch aosp_$DEVICE-userdebug
# Adjust XX to your building capabilities
make -jXX hybris-hal

If you encounter errors, check with HADK's section 5.5 "Common Pitfalls", and if it's not there, ask us on IRC.

Once you have hybris-boot.img and hybris-recovery.img files successfully built, go through chapter 6 of the HADK document.

Ignore chapter 7, but do the following instead:


rpm/dhd/helpers/ --droid-hal
git clone --recursive$DEVICE hybris/droid-configs -b master
if [ -z "$(grep community_adaptation $ANDROID_ROOT/hybris/droid-configs/rpm/droid-config-$DEVICE.spec)" ]; then
  sed -i '/%include droid-configs-device/i%define community_adaptation 1\n' $ANDROID_ROOT/hybris/droid-configs/rpm/droid-config-$DEVICE.spec
if [ -z "$(grep patterns-sailfish-consumer-generic $ANDROID_ROOT/hybris/droid-configs/patterns/jolla-configuration-$DEVICE.yaml)" ]; then
  sed -i "/Summary: Jolla Configuration $DEVICE/i- patterns-sailfish-consumer-generic\n- patterns-sailfish-store-applications\n- pattern:sailfish-porter-tools\n" $ANDROID_ROOT/hybris/droid-configs/patterns/jolla-configuration-$DEVICE.yaml
if [ -z "$(grep jolla-devicelock-daemon-encsfa $ANDROID_ROOT/hybris/droid-configs/patterns/jolla-hw-adaptation-$FAMILY.yaml)" ]; then
  sed -i "s/sailfish-devicelock-fpd/jolla-devicelock-daemon-encsfa" $ANDROID_ROOT/hybris/droid-configs/patterns/jolla-hw-adaptation-$FAMILY.yaml
rpm/dhd/helpers/ --configs
rpm/dhd/helpers/ --mw # select "all" option when asked

Wait for middleware to finish, open new terminal window shell and enter:


sudo apt-get install rsync
mkdir syspart
cd syspart
repo init -u git:// -b syspart-sony-aosp-6.0.1_r80-20170902 -m tagged-manifest.xml
# Adjust X to your bandwidth capabilities
repo sync -jX --fetch-submodules
source build/
export USE_CCACHE=1
lunch aosp_$DEVICE-userdebug
# Adjust XX to your building capabilities, it will be very heavy on RAM if you go for more cores, proceed with care:
make -jXX  libnfc-nci bluetooth.default_32 systemtarball
# Go and have a cuppa, as this is going to take some time :)

cd $ANDROID_ROOT/../syspart
git clone$DEVICE
mb2 -t $VENDOR-$DEVICE-$PORT_ARCH -s droid-system-$DEVICE/rpm/droid-system-$DEVICE.spec build
rm -f $ANDROID_ROOT/droid-local-repo/$DEVICE/droid-system-*.rpm
mv RPMS/droid-system-*-0.1.1-1.armv7hl.rpm $ANDROID_ROOT/droid-local-repo/$DEVICE/
createrepo_c "$ANDROID_ROOT/droid-local-repo/$DEVICE"
sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -m sdk-install -R zypper ref

Close the current terminal window, go back to previous window, then:

git clone external/audioflingerglue
git clone external/droidmedia

source build/
lunch aosp_$DEVICE-userdebug
make -jXX $(external/droidmedia/ $PORT_ARCH) $(external/audioflingerglue/ $PORT_ARCH)

DROIDMEDIA_VERSION=$(git --git-dir external/droidmedia/.git describe --tags | sed -r "s/\-/\+/g")
mkdir -p hybris/mw/droidmedia-localbuild/rpm
cp rpm/dhd/helpers/droidmedia-localbuild.spec hybris/mw/droidmedia-localbuild/rpm/droidmedia.spec
sed -ie "s/0.0.0/$DROIDMEDIA_VERSION/" hybris/mw/droidmedia-localbuild/rpm/droidmedia.spec
mv hybris/mw/droidmedia-$DROIDMEDIA_VERSION.tgz hybris/mw/droidmedia-localbuild
rpm/dhd/helpers/ --build=hybris/mw/droidmedia-localbuild
rpm/dhd/helpers/ --mw=

DEVICE=$HABUILD_DEVICE rpm/dhd/helpers/
mkdir -p hybris/mw/audioflingerglue-localbuild/rpm
cp rpm/dhd/helpers/audioflingerglue-localbuild.spec hybris/mw/audioflingerglue-localbuild/rpm/audioflingerglue.spec
mv hybris/mw/audioflingerglue-0.0.1.tgz hybris/mw/audioflingerglue-localbuild
rpm/dhd/helpers/ --build=hybris/mw/audioflingerglue-localbuild
rpm/dhd/helpers/ --mw=

sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -m sdk-install -R zypper in droid-hal-$DEVICE-kernel
sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -m sdk-install -R zypper in --force-resolution droid-hal-$DEVICE-kernel-modules
rpm/dhd/helpers/ --mw=
rpm/dhd/helpers/ --mw=
rpm/dhd/helpers/ --mw=
git clone --recursive$DEVICE hybris/mw/droid-hal-img-boot-$DEVICE
rpm/dhd/helpers/ --mw=$DEVICE
sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -R zypper in  --force-resolution bluez5-libs-devel
rpm/dhd/helpers/ --mw= --spec=rpm/bluetooth-rfkill-event-hciattach.spec

git clone --recursive$DEVICE hybris/droid-hal-version-$DEVICE
rpm/dhd/helpers/ --version

Now go through chapter 8, but instead of the `sudo mic create fs ...` command, perform the following:


sudo zypper in lvm2 atruncate pigz
sudo ssu ar unbreakmic
sudo zypper ref unbreakmic
sudo zypper rm droid-tools # it's ok if you hadn't any
sudo zypper in android-tools
sudo mic create loop --arch=$PORT_ARCH \
    --record-pkgs=name,url     --outdir=sfe-$DEVICE-$RELEASE$EXTRA_NAME \

If you want to rebuild your image again later, umount any /var/tmp/mic/imgcreate-*/ mounts manually.


Ensure you OTA your stock Sony Android to at least 34.3.A.0.228 (check Settings | About phone | Build number) before unlocking your device, so you do not need Windows in the flashing process. Note, you might need to OTA-update several times to reach that version.

PLATFORM_SDK $   # continue from above mic session

mkdir flashing
cd flashing
cd SailfishOS-*/

Download Sony vendor zip archive from and place it in current directory, then:

BLOBS=$(ls -1 * | tail -n1)
unzip $BLOBS
# act upon instructions in the flashing-README.txt, then:
bash ./

If fails with "You have too old Sony Android version (X.Y) on your device"

This means you have not updated your stock Sony Android via OTA to the build 34.3.A.0.228. Since you have already unlocked your device, OTAs are no longer available, and now you have two alternatives: the Linux way or Windows.

The Linux Way

cd $ANDROID_ROOT/flashing/SailfishOS-*/
MATCH='Your Sony Android version ($VMAJOR.$VMINOR) on your device is too old,'
LINE=$(grep -n "$MATCH" | sed 's/:.*//')
if [ -n $LINE ]; then
  sed -i "$(($LINE+1)),$(($LINE+3)) d"
  sed -i "s/$MATCH/Your Sony Android version is too old, but we'll workaround that via Linux cmdline/"
  echo 'Ensure you are using droid-configs from the build instructions above (same branch/up-to-date), then:'
  echo 'cp $ANDROID_ROOT/hybris/droid-configs/sparse/boot/ .'
  echo 'And restart this section from its beginning above ^ (cd $ANDROID_ROOT/flashing etc)'
sed -i 's/echo "Flashing oem partition.."/echo "oem partition is populated manually through recovery"/'
sed -i 's/$FLASHCMD oem $BLOBS/#$FLASHCMD oem $BLOBS/'
fastboot flash system *_loire.img

Open a new terminal window and enter Sailfish_X_Build_and_Flash#Recovery_Mode and shell into the device, then:

mkdir oem
mount /dev/mmcblk0p28 oem
mkdir blobs
mount /dev/mmcblk0p52 system
rm -rf oem/*
cp -ar blobs/* oem
umount oem
umount blobs
rmdir oem blobs

Go back to your previous terminal window session, and complete the flashing:

bash ./

Now reboot the device and you should have Sailfish OS booting normally.


Go back to your Linux installation where you left off previously, and redo:

# act upon instructions in the flashing-README.txt, then:
bash ./

Recovery Mode

If anything goes not according to plan, you can boot the device into fastboot (VolumeUp+Power) and execute this command:


# cd into your flashing/ directory
sudo fastboot boot SailfishOS-*/hybris-recovery.img

Then follow instructions on screen to SSH into your device recovery mode. Further steps will depend on what you want to achieve, mainly guided by our IRC channel.

Adaptation Status

The port is pretty functional, but help from you is always appreciated in these areas:

  • Sensors not working: fingerprint, barometer, step counter
  • Double-tap to wake is deactivated. Activate it and help testing in various scenarios by:
mcetool --set-doubletap-wakeup=proximity
  • FM radio missing (solution is known by community)
  • No big.LITTLE technology is currently enabled, Sailfish OS simply fills up the cores in sequence (from 0 to 3 little, then the big ones 4 and 5), which already gives a very smooth performance.
    However, this means there's no special allocation of the two performance cores for the foreground apps (so the UX experience could be improved even further, even under heavy loads). More details:
    We can't dedicate two big cores to foreground UI apps because we can't allocate PIDs to the foreground sets. And even if we could, we'd have to add the root process for foreground apps (SFOS booster/invoker?) into there so its children would live on the fast cores. Ping abranson on IRC if you want to chip in, or wait for Android 7 (and kernel v4.4 automatically handling all that much better) where only SFOS booster part will need sorting.
  • Startup Wizard skips one blank page (where usually the Android Support is)

If you find more things to fix, please report them in our IRC channel or file a bug.

Have fun and enjoy our first fully-flashable Sailfish OS image built entirely by you!
Your Jolla HW Team