marc walter

Building for F-Droid and adding an app to the F-Droid store

2019-07-12

How to build an android app for fdroid using WSL Ubuntu on Windows 10

I started with the official description, which tells us to first follow the fdroid quickstart

Install fdroidserver (I had #da0d639)

git clone https://gitlab.com/fdroid/fdroidserver.git
export PATH="$PATH:$PWD/fdroidserver"
# link it to the bin folder so it will be found
sudo ln -s $(pwd)/fdroidserver/fdroid /usr/bin

Check out fdroid data (I had #03e4a06)

git clone https://gitlab.com/fdroid/fdroiddata.git
cd fdroiddata

Make sure fdroid works and reads the metadata files properly:

fdroid readmeta

Create config.py and key store

Optionally create a base config.py and signing keys with:

fdroid init

Which fails with this error:

FileNotFoundError: [Errno 2] No such file or directory: '/usr/share/doc/fdroidserver/examples/fdroid-icon.png'

Fix: link examples from fdroidserver to doc

sudo mkdir /usr/share/doc/fdroidserver
sudo ln -s $(pwd)/../fdroidserver/examples /usr/share/doc/fdroidserver

Try again

$ fdroid init
INFO: Generating a new key in "keystore.jks"...
[...]

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12".


INFO:
Built repo based in "/home/marc/fdroiddata" with this config:

  Android SDK:                  /home/marc/android
  Android NDK r12b (optional):  $ANDROID_NDK
  Keystore for signing key:     keystore.jks

To complete the setup, add your APKs to "/home/marc/fdroiddata/repo"
then run "fdroid update -c; fdroid update".  You might also want to edit
"config.py" to set the URL, repo name, and more.  You should also set up
a signing key (a temporary one might have been automatically generated).

For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo
and https://f-droid.org/docs/Signing_Process

Add the new app

fdroid import --url https://github.com/marc136/tonuino-nfc-tools --subdir app

change the generated metadata, get inspiration from e.g. templates/app-full or on gitlab.

# fill automated fields like Auto Name
fdroid checkupdates de.mw136.tonuino
# manual changes
vim metadata/de.mw136.tonuino.yml
# check if entered data is valid
fdroid readmeta
# check of warnings or errors
fdroid lint de.mw136.tonuino
# let a tool do formatting
fdroid rewritemeta de.mw136.tonuino

Example content

Categories:
  - Development
  - Science & Education
License: BSD-3-Clause
SourceCode: https://github.com/marc136/tonuino-nfc-tools
IssueTracker: https://github.com/marc136/tonuino-nfc-tools/issues

Summary: Read and write NFC tags for the TonUINO music box
Description: |-
    This app will only work if the device supports NFC.
    More information about the TonUINO diy music box is available at https://www.tonuino.de

RepoType: git
Repo: https://github.com/marc136/tonuino-nfc-tools

Builds:
  - versionName: 0.3.1
    versionCode: 6
    commit: v0.3.1
    subdir: app
    gradle:
      - yes

AutoUpdateMode: None
UpdateCheckMode: Tags

Build the new app

Following the official contributing guide.

fdroid build -v -l de.mw136.tonuino

Note: This fails if no android SDK exists

Install the Android SDK (and sdkmanager)

Download command line tools.

mkdir ~/android
cd ~/android
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
# install unzip if needed
# sudo apt install unzip
unzip sdk-tools-linux-4333796.zip

Add to .profile (or .bashrc or the like)

export ANDROID_HOME=$PWD
export PATH="$PATH:$ANDROID_HOME/tools/bin"

Then use sdkmanager to install build-tools in the correct version and platform-tools.

sdkmanager --install "build-tools;29.0.0" platform-tools
# not run myself, will be done by fdroid
# sdkmanager --install "platforms;android-28" 

# update the installed tools
sdkmanager --update

This throws an error

Warning: File /home/xxxx/.android/repositories.cfg could not be loaded.

Fix: Just create the missing file: (see post)

touch ~/.android/repositories.cfg

Then continue

# update the installed tools
sdkmanager --update

Build the new app

fdroid build -v -l de.mw136.tonuino

I had this problem, but we already linked the bin folder above so it should not happen:

ERROR: Could not build app de.mw136.tonuino: OSError while trying to execute /usr/lib/python3/dist-packages/gradlew-fdroid clean: [Errno 2] No such file or directory: '/usr/lib/python3/dist-packages/gradlew-fdroid'

Info: https://forum.f-droid.org/t/build-error-gradlew-fdroid-no-such-file/5601/4

Fix: Link it to the bin folder

sudo ln -s $(pwd)/fdroidserver/fdroid /usr/bin

Build succeeds, but cannot get installed because the app is not yet signed.

Using adb, we can see more information

adb install tonuino-nfc-tools.apk

Returns

Performing Streamed Install
adb: failed to install tonuino-nfc-tools.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Package /data/app/vmdl860694333.tmp/base.apk has no certificates at entry AndroidManifest.xml]

Creating a signed build

To get a signed version for testing, use fdroid publish which will sign the built .apk and move it from the folder unsigned to repo.

Or use fdroid install to immediately deploy it to a connected emulator or device. More info on these commands are on this page.

Now I could commit my changes on fdroiddata/metadata/de.mw136.tonuino. to the fdroiddata repository and a day after it was merged, it would show up in fdroid.

But I want to have the same information as in the Google Play Store, so I will try to configured fastlane next (as described in this post).

Configure auto-building

Configure auto-building (explanation is here, but this picks up tags like v1.0.0).

AutoUpdateMode: Version v%v
UpdateCheckMode: Tags