xref: /aosp_15_r20/external/armnn/shim/BuildGuideShimSupportLibrary.md (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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