1*89c4ff92SAndroid Build Coastguard Worker# How to use the Android NDK to build Arm NN 2*89c4ff92SAndroid Build Coastguard Worker 3*89c4ff92SAndroid Build Coastguard Worker- [Introduction](#introduction) 4*89c4ff92SAndroid Build Coastguard Worker- [Prerequisites](#prerequisites) 5*89c4ff92SAndroid Build Coastguard Worker- [Download Arm NN](#download-arm-nn) 6*89c4ff92SAndroid Build Coastguard Worker- [Build Arm Compute Library](#build-arm-compute-library) 7*89c4ff92SAndroid Build Coastguard Worker- [Build Arm NN](#build-arm-nn) 8*89c4ff92SAndroid Build Coastguard Worker- [Build Arm NN Support Library](#build-arm-nn-support-library) 9*89c4ff92SAndroid Build Coastguard Worker- [Build Arm NN Shim](#build-arm-nn-shim) 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker## Introduction 13*89c4ff92SAndroid Build Coastguard WorkerThese are step by step instructions for building the Arm NN shim and support library for NNAPI. 14*89c4ff92SAndroid Build Coastguard WorkerThis work is currently in an experimental phase. 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker## Prerequisites 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard WorkerThe following are required to build the Arm NN support library 19*89c4ff92SAndroid Build Coastguard Worker* Android NDK r25 20*89c4ff92SAndroid Build Coastguard Worker * Detailed setup can be found in [BuildGuideAndroidNDK.md](../BuildGuideAndroidNDK.md) 21*89c4ff92SAndroid Build Coastguard Worker* Flatbuffer version 2.0.6 22*89c4ff92SAndroid Build Coastguard Worker * Detailed setup can be found in [BuildGuideCrossCompilation.md](../BuildGuideCrossCompilation.md) 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard WorkerThe following is required to build the Arm NN shim 25*89c4ff92SAndroid Build Coastguard Worker* AOSP Source (Android Open Source Project) 26*89c4ff92SAndroid Build Coastguard Worker * Download the source from the [official website](https://source.android.com/setup/build/downloading) 27*89c4ff92SAndroid Build Coastguard Worker * This guide will use release tag `android12-s1-release` 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker 30*89c4ff92SAndroid Build Coastguard WorkerSet environment variables 31*89c4ff92SAndroid Build Coastguard Worker```bash 32*89c4ff92SAndroid Build Coastguard Workerexport WORKING_DIR=<path to where the Arm NN source code, clframework and aosp repos will be cloned> 33*89c4ff92SAndroid Build Coastguard Workerexport AOSP_ROOT=<path to the root of Android tree where the shim will be built> 34*89c4ff92SAndroid Build Coastguard Workerexport AOSP_MODULES_ROOT=<path to where AOSP modules will be cloned i.e. $WORKING_DIR/aosp> 35*89c4ff92SAndroid Build Coastguard Workerexport ARMNN_BUILD_DIR=<path to the Arm NN build directory i.e. $WORKING_DIR/build> 36*89c4ff92SAndroid Build Coastguard Workerexport NDK=<path to>android-ndk-r25 37*89c4ff92SAndroid Build Coastguard Workerexport NDK_TOOLCHAIN_ROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64 38*89c4ff92SAndroid Build Coastguard Workerexport PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH 39*89c4ff92SAndroid Build Coastguard Workerexport FLATBUFFERS_ANDROID_BUILD=<path to flatbuffers target android build> 40*89c4ff92SAndroid Build Coastguard Workerexport FLATBUFFERS_X86_BUILD=<path to flatbuffers host build-x86_64> 41*89c4ff92SAndroid Build Coastguard Worker``` 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker## Download Arm NN 44*89c4ff92SAndroid Build Coastguard WorkerIf the user only wishes to build the Support Library with the NDK, the Arm NN repo can be cloned into any folder. 45*89c4ff92SAndroid Build Coastguard WorkerIf the user also wishes to build the Arm NN Shim, for this the Arm NN repo will need to reside within 46*89c4ff92SAndroid Build Coastguard Workerthe Android tree in order for armnn/shim/Android.bp to be picked up by the Soong (Android) build system. 47*89c4ff92SAndroid Build Coastguard WorkerFor example $AOSP_ROOT/vendor/arm/armnn 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard Worker* Clone Arm NN: 51*89c4ff92SAndroid Build Coastguard Worker (Requires Git if not previously installed: `sudo apt install git`) 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker```bash 54*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 55*89c4ff92SAndroid Build Coastguard Workergit clone https://github.com/ARM-software/armnn.git 56*89c4ff92SAndroid Build Coastguard Worker``` 57*89c4ff92SAndroid Build Coastguard Worker 58*89c4ff92SAndroid Build Coastguard Worker## Build Arm Compute Library 59*89c4ff92SAndroid Build Coastguard Worker 60*89c4ff92SAndroid Build Coastguard WorkerArm NN provides a script that downloads the version of Arm Compute Library that Arm NN was tested with: 61*89c4ff92SAndroid Build Coastguard Worker```bash 62*89c4ff92SAndroid Build Coastguard Worker${WORKING_DIR}/armnn/scripts/get_compute_library.sh 63*89c4ff92SAndroid Build Coastguard Worker``` 64*89c4ff92SAndroid Build Coastguard Worker* Build the Arm Compute Library: 65*89c4ff92SAndroid Build Coastguard Worker (Requires SCons if not previously installed: `sudo apt install scons`) 66*89c4ff92SAndroid Build Coastguard Worker```bash 67*89c4ff92SAndroid Build Coastguard Workercd ${WORKING_DIR}/clframework 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Workerscons arch=arm64-v8a \ 70*89c4ff92SAndroid Build Coastguard Workertoolchain_prefix=aarch64-linux-android- \ 71*89c4ff92SAndroid Build Coastguard Workercompiler_prefix=aarch64-linux-android29- \ 72*89c4ff92SAndroid Build Coastguard Workerneon=1 opencl=1 \ 73*89c4ff92SAndroid Build Coastguard Workerembed_kernels=1 \ 74*89c4ff92SAndroid Build Coastguard Workerbuild_dir=android-arm64v8a \ 75*89c4ff92SAndroid Build Coastguard Workerextra_cxx_flags="-Wno-parentheses-equality -Wno-missing-braces -fPIC" \ 76*89c4ff92SAndroid Build Coastguard WorkerWerror=0 embed_kernels=1 examples=0 \ 77*89c4ff92SAndroid Build Coastguard Workervalidation_tests=0 benchmark_tests=0 benchmark_examples=0 os=android -j16 78*89c4ff92SAndroid Build Coastguard Worker``` 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker## Build Arm NN and Serializer 81*89c4ff92SAndroid Build Coastguard Worker 82*89c4ff92SAndroid Build Coastguard Worker* Build Arm NN: 83*89c4ff92SAndroid Build Coastguard Worker (Requires CMake if not previously installed: `sudo apt install cmake`) 84*89c4ff92SAndroid Build Coastguard Worker```bash 85*89c4ff92SAndroid Build Coastguard Workercd $ARMNN_BUILD_DIR 86*89c4ff92SAndroid Build Coastguard WorkerCXX=aarch64-linux-android29-clang++ \ 87*89c4ff92SAndroid Build Coastguard WorkerCC=aarch64-linux-android29-clang \ 88*89c4ff92SAndroid Build Coastguard WorkerCXX_FLAGS="-fPIE -fPIC" cmake ${WORKING_DIR}/armnn \ 89*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_ANDROID_NDK=$NDK \ 90*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_SYSTEM_NAME=Android \ 91*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_SYSTEM_VERSION=29 \ 92*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 93*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_EXE_LINKER_FLAGS="-pie -llog -lz" \ 94*89c4ff92SAndroid Build Coastguard Worker-DARMCOMPUTE_ROOT=$WORKING_DIR/clframework/ \ 95*89c4ff92SAndroid Build Coastguard Worker-DARMCOMPUTE_BUILD_DIR=$WORKING_DIR/clframework/build/android-arm64v8a/ \ 96*89c4ff92SAndroid Build Coastguard Worker-DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \ 97*89c4ff92SAndroid Build Coastguard Worker-DFLATBUFFERS_ROOT=$FLATBUFFERS_ANDROID_BUILD \ 98*89c4ff92SAndroid Build Coastguard Worker-DFLATC_DIR=$FLATBUFFERS_X86_BUILD \ 99*89c4ff92SAndroid Build Coastguard Worker-DBUILD_ARMNN_SERIALIZER=1 -DBUILD_GATORD_MOCK=0 -DBUILD_BASE_PIPE_SERVER=0 100*89c4ff92SAndroid Build Coastguard Worker``` 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Worker * Run the build 103*89c4ff92SAndroid Build Coastguard Worker```bash 104*89c4ff92SAndroid Build Coastguard Workermake -j16 105*89c4ff92SAndroid Build Coastguard Worker``` 106*89c4ff92SAndroid Build Coastguard Worker 107*89c4ff92SAndroid Build Coastguard Worker## Build Arm NN Support Library 108*89c4ff92SAndroid Build Coastguard Worker 109*89c4ff92SAndroid Build Coastguard WorkerBuilding the support library requires building some AOSP libraries via the NDK. 110*89c4ff92SAndroid Build Coastguard WorkerIt should be possible to use $AOSP_ROOT instead of $AOSP_MODULES_ROOT. 111*89c4ff92SAndroid Build Coastguard Worker 112*89c4ff92SAndroid Build Coastguard WorkerHowever this example will instead clone the necessary AOSP repos outside of the Android tree and apply some minor patches 113*89c4ff92SAndroid Build Coastguard Workerwhich were required to get it to build with the Android version used in this guide. 114*89c4ff92SAndroid Build Coastguard Worker 115*89c4ff92SAndroid Build Coastguard Worker```bash 116*89c4ff92SAndroid Build Coastguard Worker# Call a script which will clone the necessary AOSP repos (do not clone them into Android tree) 117*89c4ff92SAndroid Build Coastguard Worker${WORKING_DIR}/armnn/shim/sl/scripts/clone_aosp_libs.sh $AOSP_MODULES_ROOT 118*89c4ff92SAndroid Build Coastguard Worker 119*89c4ff92SAndroid Build Coastguard Worker# Modify the repos by applying patches 120*89c4ff92SAndroid Build Coastguard Worker${WORKING_DIR}/armnn/shim/sl/scripts/modify_aosp_libs.sh $AOSP_MODULES_ROOT 121*89c4ff92SAndroid Build Coastguard Worker 122*89c4ff92SAndroid Build Coastguard Worker# Build the Support Library 123*89c4ff92SAndroid Build Coastguard WorkerCMARGS="$CMARGS \ 124*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \ 125*89c4ff92SAndroid Build Coastguard Worker-DANDROID_ABI=arm64-v8a \ 126*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 127*89c4ff92SAndroid Build Coastguard Worker-DCMAKE_ANDROID_NDK=$NDK \ 128*89c4ff92SAndroid Build Coastguard Worker-DANDROID_PLATFORM=android-29 \ 129*89c4ff92SAndroid Build Coastguard Worker-DAOSP_MODULES_ROOT=$AOSP_MODULES_ROOT \ 130*89c4ff92SAndroid Build Coastguard Worker-DARMNN_SOURCE_DIR=$WORKING_DIR/armnn \ 131*89c4ff92SAndroid Build Coastguard Worker-DArmnn_DIR=$ARMNN_BUILD_DIR " 132*89c4ff92SAndroid Build Coastguard Worker 133*89c4ff92SAndroid Build Coastguard Workermkdir ${WORKING_DIR}/armnn/shim/sl/build 134*89c4ff92SAndroid Build Coastguard Workercd ${WORKING_DIR}/armnn/shim/sl/build 135*89c4ff92SAndroid Build Coastguard Worker 136*89c4ff92SAndroid Build Coastguard WorkerCXX=aarch64-linux-android29-clang++ \ 137*89c4ff92SAndroid Build Coastguard WorkerCC=aarch64-linux-android29-clang \ 138*89c4ff92SAndroid Build Coastguard Workercmake $CMARGS ../ 139*89c4ff92SAndroid Build Coastguard Workermake 140*89c4ff92SAndroid Build Coastguard Worker``` 141*89c4ff92SAndroid Build Coastguard Worker 142*89c4ff92SAndroid Build Coastguard Worker## Build Arm NN Shim 143*89c4ff92SAndroid Build Coastguard Worker 144*89c4ff92SAndroid Build Coastguard WorkerBy default the Arm NN shim Android.bp.off is not enabled. 145*89c4ff92SAndroid Build Coastguard WorkerIt is enabled below by renaming it to Android.bp 146*89c4ff92SAndroid Build Coastguard Worker 147*89c4ff92SAndroid Build Coastguard Worker```bash 148*89c4ff92SAndroid Build Coastguard Workercd ${WORKING_DIR}/armnn/shim 149*89c4ff92SAndroid Build Coastguard Workermv Android.bp.off Android.bp 150*89c4ff92SAndroid Build Coastguard Worker 151*89c4ff92SAndroid Build Coastguard Workercd $AOSP_ROOT 152*89c4ff92SAndroid Build Coastguard Workersource build/envsetup.sh 153*89c4ff92SAndroid Build Coastguard Workerlunch <device>-eng 154*89c4ff92SAndroid Build Coastguard Workercd vendor/arm/armnn/shim 155*89c4ff92SAndroid Build Coastguard Workerexport ARMNN_ANDROID_MK_ENABLE=0 156*89c4ff92SAndroid Build Coastguard Workermm 157*89c4ff92SAndroid Build Coastguard Worker``` 158*89c4ff92SAndroid Build Coastguard Worker 159*89c4ff92SAndroid Build Coastguard WorkerThe built libraries and manifest file can be found here: 160*89c4ff92SAndroid Build Coastguard Worker$AOSP_ROOT/out/target/product/<device>/vendor/lib64/libarmnn_support_library.so 161*89c4ff92SAndroid Build Coastguard Worker$AOSP_ROOT/out/target/product/<device>/vendor/bin/hw/android.hardware.neuralnetworks-shim-service-armnn 162*89c4ff92SAndroid Build Coastguard Worker$AOSP_ROOT/out/target/product/<device>/vendor/etc/vintf/manifest/android.hardware.neuralnetworks-shim-service-armnn.xml 163*89c4ff92SAndroid Build Coastguard Worker 164*89c4ff92SAndroid Build Coastguard WorkerCurrently the Arm NN libraries are shared libraries and therefore will need to be pushed to the device: 165*89c4ff92SAndroid Build Coastguard Worker$ARMNN_BUILD_DIR/libarmnn.so 166