Version 23 (modified by 10 years ago) (diff) | ,
---|
How To Build BOINC Apps for Android
This document describes how to build BOINC apps for Android.
We assume the app is written in C/C++. It must be cross-compiled on a non-Android system (Linux, Windows, or Mac; the instructions here are for Linux). The BOINC API library (libboincapi) must also be cross-compiled and linked. The result of this is a "native mode" executable for a particular architecture (ARM, MIPS, or Intel) on Android.
Various build systems can be used for this purpose:
- The GNU tools (configure/make).
- Eclipse
- Android Studio
In this document we'll use the GNU tools.
Cookbook
In the following, we'll assume that on your build system:
- the BOINC source tree is at ~/boinc.
- the source code for your application is at ~/my_app.
Download and install the latest Android Native Development Kit (NDK): http://developer.android.com/tools/sdk/ndk/index.html
Set an environment variable NDKROOT to point to the NDK directory, e.g.
export NDKROOT="$HOME/android-ndk-r10d"
Prepare the Android toolchain by doing
~/boinc/android/build_androidtc_arm.sh
This create a directory ~/androidarm-tc containing compilers, linkers, and libraries for that CPU type.
Now build the BOINC libraries:
cd ~/boinc/android build_libraries_arm.sh
This builds the libraries, and stores them together with their .h files in ~/androidtc_arm.
Now build your app as follows:
cd ~/my_app ~/boinc/android/boinc_build_app_arm.sh
Note: this assumes we're building an ARM executable. If you want to build MIPS or Intel, substitute "mips" or "intel" in the above commands.
Building FPU versions
To build a version for VFP:
-O3 -mhard-float -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer
To build a version for neon:
-O3 -mhard-float -mfpu=neon -mfloat-abi=softfp -fomit-frame-pointer
It's often useful to build a single executable that can support the vfp or neon libraries & instructions, and then use the BOINC APP_INIT_DATA and HOST_INFO structures to find the capabilities of the host and call the appropriate optimized routines (member variable 'p_features' e.g. strstr(aid.host_info.p_features, " neon ").
You can do this by selectively compiling using the above options, into separate small libraries that you link into the single executable, and use C++ namespaces to separate similar function calls. Refer to the boinc/client/Makefile.am and client/whetstone.cpp, and client/cs_benchmark.cpp files for an example of how to do this.
Deploying Android app versions
BOINC on Android uses the following BOINC platform identifier: "arm-android-linux-gnu" "x86-android-linux-gnu" "mipsel-android-linux-gnu"
(how to use plan classes if you have separate FPU versions) The client reports CPU architecture and capabilities, i.e. VFP and NEON support, to the project server.
Position-independent executables (PIE)
Starting with version 4.1, Android supports position-independent executables (PIE). Starting with version 5.0, PIE is mandatory - Android refuses to run native executables that are not PIE.
You can build PIE apps by including in your Makefile:
LOCAL_CFLAGS += -fPIE LOCAL_LDFLAGS += -fPIE -pie
You should use plan classes so that
- PIE versions are sent only to Android 4.1 or later devices.
- non-PIE versions are sent only to pre-5.0 devices.
For example (using XML plan class specification):
<plan_class> <name>android_arm_pie</name> <min_android_version>40100</min_android_version> </plan_class> <plan_class> <name>android_arm_non_pie</name> <max_android_version>49999</max_android_version> </plan_class>
If you have both PIE and non-PIE, change the 49999 to 40099.
FORTRAN on Android NDK (optional build)
The Android NDK currently does not have a FORTRAN compiler distributed with it. But it is possible to build GNU Fortran (gfortran) libraries for ARM/Android using the information at http://danilogiulianelli.blogspot.co.uk/2013/02/how-to-build-gcc-fortran-cross-compiler.html
Example
Setup the environment: http://boinc.berkeley.edu/trac/browser/boinc-v2/samples/example_app/build_android.sh
Android Makefile: http://boinc.berkeley.edu/trac/browser/boinc-v2/samples/example_app/Makefile_android
An example of how to adapt a BOINC app's Makefile to compile it for Android can be found in the BOINC sources at: https://github.com/novarow/AndroidBOINC/blob/master/native/diffs_android/uppercase/Makefile_android
Note that the AndroidBOINC build script sets up the required environment variables for the standard C++ library as well as the Android SYSROOT.
-llog refers to the library required to use Logcat from native code. Logcat is used for debugging purposes and is not required for the app's functionality.