Building SUSI.AI Android App with FDroid
Fdroid is an app store for Free and Open Source Software (FOSS). Building and hosting an app on Fdroid is not an easy process compared to when we host one on Google Play. A certain set of build checks are required to be done prior to making a merge request (which is similar to a pull request in GitHub) in the fdroid-data GitLab repository. SUSI.AI Android app has undergone through all these checks and tests and is now ready for the merge request to be made.
Setting up the fdroid-server and fdroid-data repositories is a separate thing and is fairly easy. Building the app using the tools provided by fdroid is another thing and is the one that causes the most problems. It will involve quite a few steps to get started. Fdroid requires all the apps need to be built using:
$ fdroid build -v -l ai.susi |
This will output a set of logs which tell us what went wrong in the builds. The usual one in a first time app is obviously the build is not taking place at all. The reason is our metadata file needs to be changed to initiate a build.
The metadata file is used for the build process and contains all the information about the app. The metadata file for a.susi package was a .yaml file.
Builds:
– versionName: 1.0.10 versionCode: 11 commit: 1ad2fd0e858b1256617e652c6c8ce1b8372473e6 subdir: app gradle: – fdroid |
This is the metadata reference file’s build section that is used for the build process using the command that was mentioned above.The versionName a nd versionCode is found in the build.gradle file in the app and commit denotes the commit-id of the latest commit that will be checked out and built, subdir shows the subdirectory of the app, here the subdirectory is the app file.
Next is the interesting stuff, since we are using flavors in the app, we have to mention in the gradle the flavor which we are using, in our case we are using the flavor by the name of “fdroid” and by mentioning this we can build only the “fdroid” flavor in the app.
Also when building the app there were many blockers that were faced, the reason for the usual build fails were :
1 actionable task: 1 executed INFO: Scanning source for common problems… ERROR: Found usual suspect ‘youtube.*android.*player.*api’ at app/libs/YouTubeAndroidPlayerApi.jar WARNING: Found JAR file at app/libs/YouTubeAndroidPlayerApi.jar WARNING: Found possible binary at app/src/main/assets/snowboy/alexa_02092017.umdl WARNING: Found possible binary at app/src/main/assets/snowboy/common.res ERROR: Found shared library at app/src/main/jniLibs/arm64-v8a/libsnowboy-detect-android.so ERROR: Found shared library at app/src/main/jniLibs/armeabi-v7a/libsnowboy-detect-android.so INFO: Removing gradle-wrapper.jar at gradle/wrapper/gradle-wrapper.jar ERROR: Could not build app ai.susi: Can‘t build due to 3 errors while scanning INFO: Finished INFO: 1 build failed |
The reason for these build fails were that fdroid does not allow us to use prebuilt files and any proprietary software if present, the above log indicates the two prebuilt files which should be removed and also the YouTubeAndroidPlayerApi.jar which is proprietary software and hence needs to removed. So, to remove the files that are not used in the fdroid flavor and exclude them in the build process, we have to include the following statements in the build section of the metadata reference file :
rm: – app/src/main/jniLibs/arm64-v8a/libsnowboy-detect-android.so – app/src/main/jniLibs/armeabi-v7a/libsnowboy-detect-android.so – app/libs/YouTubeAndroidPlayerApi.jar |
Once the metadata file is complete we are ready to run the build command once again. If you have properly set the environment in your local PC, build will end successfully assuming there were no Java or any other language syntax errors.
It is worth to mention few other facts which are common to Android software projects. Usually the source code is packed in a folder named “app” inside the repository and this is the common scenario if Android Studio builds up the project from scratch. If this “app” folder is one level below the root, that is “android/app”, the build instructions shown above will throw an error as it cannot find the project files.
The reason for this is as it is mentioned “subdir=app” in the metadata file. Change this to “subdir=android/app” and run the build again. The idea is to direct the build to find where the project files are.
Reference:
- Metadata : https://f-droid.org/docs/Build_Metadata_Reference/#Build
- Publish an app on fdroid: https://blog.fossasia.org/publish-an-open-source-app-on-fdroid/