[[PageOutline]]
= How To Build BOINC Apps for Android =
This document describes how to build BOINC apps for Android devices.
== Requirements ==
* Android NDK: http://developer.android.com/tools/sdk/ndk/index.html
* BOINC on Android build script: [http://boinc.berkeley.edu/trac/browser/boinc-v2/android]
== Used versions ==
Development target:
* ARM architecture featuring ABI v5
* NDK-level 4 (Android 1.6)
Tested with:
* ARM ABI v7 device (Samsung Galaxy SII)
* Android platform 2.3.4
== Compatibility with BOINC on Android ==
BOINC on Android runs on all Android devices, regardless of their CPU architecture.
Possible architectures are ARM, x86 and MIPS.
ARM is the dominant platform on Android.
Even within ARM, higher ABIs or specific CPU capabilities might only be available
on a subset of volunteer's devices.
The client reports CPU architecture and capabilities, i.e. VFP and NEON support, to the project server.
== BOINC platform name ==
BOINC on Android uses the following BOINC platform identifier:
"arm-android-linux-gnu"
"x86-android-linux-gnu"
"mipsel-android-linux-gnu"
== Setup NDK toolchain ==
To set up a custom cross compilation toolchain, see AndroidBuildClient.
== Build script ==
Take a look at the build scripts in the BOINC software repository.
They give you an idea of what steps are required and which cross compilation tools to use.
There are also scripts available, which build required software components,
i.e. curl and openSSL, or BOINC libs.
== 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.
== 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 app versions are sent only to Android 4.1 or later devices.
* non-PIE app versions are sent only to pre-5.0 devices.
For example (using [AppPlanSpec XML plan class specification]):
{{{
android_arm_pie
40100
android_arm_non_pie
49999
}}}
== 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.