| This directory contains a number of shell scripts, which we will |
| call the "dev-scripts", that are only used to develop the NDK |
| itself, i.e. they are un-needed when using ndk-build to build |
| applicative native code. |
| |
| Their purpose is to handle various sophisticated issues: |
| |
| - rebuilding host cross-toolchains for our supported CPU ABIs |
| |
| - rebuilding other required host tools (e.g. ndk-stack) from sources |
| |
| - rebuilding all target-specific prebuilt binaries from sources |
| (this requires working host cross-toolchains) |
| |
| - packaging final NDK release tarballs, including adding samples |
| and documentation which normally live in $NDK/../development/ndk |
| |
| This document is here to explain how to use these dev-scripts and how |
| everything is architected / designed, in case you want to maintain it. |
| |
| |
| I. Organization: |
| ---------------- |
| |
| First, a small description of the NDK's overall directory structure: |
| |
| $NDK/build/core |
| Contains the main NDK build system used when 'ndk-build'. |
| Relies heavily on GNU Make 3.81+ but isn't used by any of the |
| scripts described here. |
| |
| $NDK/build/tools |
| Contains all the dev-scripts that are described in this document. |
| More on this later. |
| |
| $NDK/sources/host-tools/ |
| Contains sources of various libraries or programs that will be |
| compiled to generate useful host programs for the final NDK |
| installation. For example, $NDK/sources/host-tools/ndk-stack/ |
| contains the sources of the 'ndk-stack' program. |
| |
| $NDK/sources/cxx-stl/ |
| Contains the sources of various C++ runtime and libraries that |
| can be used with 'ndk-build'. See docs/CPLUSPLUS-SUPPORT.html for |
| more details. |
| |
| $NDK/sources/cxx-stl/gabi++/ |
| Contains the sources of the GAbi++ C++ runtime library. Note that |
| the dev-script 'build-gabi++.sh' can be used to generate prebuilt |
| libraries from these sources, that will be copied under this |
| directory. |
| |
| $NDK/sources/cxx-stl/stlport/ |
| Contains the sources of a port of STLport that can be used with ndk-build. |
| The dev-script 'build-stlport.sh' can be used to generate prebuilt |
| libraries from these sources, that will be copied under this directory. |
| |
| $NDK/sources/cxx-stl/gnu-libstdc++/ |
| This directory doesn't contain sources at all, only an Android.mk. |
| The dev-script 'build-gnu-libstdc++.sh' is used to generate prebuilt |
| libraries from the sources that are located in the toolchain source |
| tree instead. |
| |
| $NDK/sources/cxx-stl/system/ |
| This directory contains a few headers used to use the native system |
| Android C++ runtime (with _very_ limited capabilites), a.k.a. |
| /system/lib/libstdc++.so. The prebuilt version of this library is |
| generated by the 'gen-platform.sh' dev-script described later, but |
| it never placed in this directory. |
| |
| $NDK/sources/android/libthread_db/ |
| This directory contains the sources of the libthread_db implementation |
| that is linked into the prebuilt target gdbserver binary. Note that two |
| versions are provided, corresponding to different versions of gdb. |
| |
| The sources are customized versions of the ones found under |
| $ANDROID/bionic/libthread_db. They contain various changes used to |
| deal with platform bugs. |
| |
| $NDK/sources/ |
| The rest of $NDK/sources/ is used to store the sources of helper |
| libraries used with 'ndk-build'. For example, the 'cpu-features' |
| helper library is under $NDK/sources/android/cpu-features/ |
| |
| $DEVNDK a.k.a $NDK/../development/ndk |
| This directory contains platform-specific files. The reason why it |
| it is separate from $NDK is because it is not primarly developed in |
| the open. |
| |
| More specifically: |
| |
| - all $NDK development happens in the public AOSP repository ndk.git |
| |
| - any $DEVNDK development that happens in the public AOSP development.git |
| repository is auto-merged to the internal tree maintained by Google |
| |
| - $DEVNDK developments that are specific to an yet-unreleased version of |
| the system happen only in the internal tree. They get back-ported to |
| the public tree only when the corresponding system release is |
| open-sourced. |
| |
| Having two distinct git repositories makes things easier. Also, you |
| generally don't want to see the churn that goes in the internal tree |
| during development. It's usually not very pretty :) |
| |
| $DEVNDK/platforms/android-$PLATFORM, where $PLATFORM is a decimal number |
| Contains all files that are specific to a given API level $PLATFORM, |
| that were not already defined for the previous API level. |
| |
| For example, android-3 corresponds to Android 1.5, and android-4 |
| corresponds to Android 1.6. The platforms/android-4 directory only |
| contains files that are either new or modified, compared to android-3. |
| |
| $DEVNDK/platforms/android-$PLATFORM/include/ |
| Contains all system headers exposed by the NDK for a given platform. |
| All these headers are independent from the CPU architecture of target devices. |
| |
| $DEVNDK/platforms/android-$PLATFORM/arch-$ARCH/ |
| Contains all files that are specific to a given $PLATFORM level and a |
| specific CPU architecture. $ARCH is typically 'arm' or 'x86' |
| |
| $DEVNDK/platforms/android-$PLATFORM/arch-$ARCH/include/ |
| Contains all the architecture-specific headers for a given API level. |
| |
| $DEVNDK/platforms/android-$PLATFORM/arch-$ARCH/lib/ |
| Contains several CPU-specific object files and static libraries that |
| are required to build the host cross-toolchains properly. |
| |
| Before NDK r7, this also contains prebuilt system shared libraries that |
| had been hand-picked from various platform builds. These have been |
| replaced by symbol list files instead (see below). |
| |
| $DEVNDK/platforms/android-$PLATFORM/arch-$ARCH/symbols/ |
| Contains, for each system shared library exposed by the NDK, two |
| files describing the dynamic symbols it exports, for example, for |
| the C library: |
| |
| libc.so.functions.txt -> list of exported function names |
| libc.so.variables.txt -> list of exported variable names |
| |
| These files were introduced in NDK r7 and are used to generate "shell" |
| shared libraries that can be used by ndk-build at link time. The shell |
| libraries only provide dynamic symbols to |
| |
| These files can be generated from a given platform build using the |
| 'dev-platform-import.sh' dev-script, described later in this document. |
| |
| This is handy to compare which symbols were added between platform |
| releases (and check that nothing disappeared). |
| |
| $DEVNDK/platforms/android-$PLATFORM/samples/ |
| Contains samples that are specific to a given API level. These are |
| usually copied into $INSTALLED_NDK/samples/ by the 'gen-platforms.sh' |
| script. |
| |
| |
| $NDK/platforms/ |
| Note to be confused with $DEVNDK/platforms/, this directory is not |
| part of the NDK git directory (and is spefically listed in $NDK/.gitignore) |
| but of its final installation. |
| |
| Its purpose is to hold the fully expanded platform-specific files. |
| This means that, unlike $DEVNDK/platforms/android-$PLATFORM, the |
| $NDK/platforms/android-$PLATFORM will contain _all_ the files that |
| are specific to API level $PLATFORM. |
| |
| Moreover, the directory is organized slightly differently, i.e. as |
| toolchain sysroot, i.e. for each supported $PLATFORM and $ARCH values, |
| it provides two directories: |
| |
| $NDK/platforms/android-$PLATFORM/arch-$ARCH/usr/include |
| $NDK/platforms/android-$PLATFORM/arch-$ARCH/usr/lib |
| |
| Notice the 'usr' subdirectory here. It is required by GCC to be able |
| to use the directories with --with-sysroot. For example, to generate |
| binaries that target API level 5 for the arm architecture, one would |
| use: |
| |
| $TOOLCHAIN_PREFIX-gcc --with-sysroot=$NDK/platforms/android-5/arch-arm |
| |
| Where $TOOLCHAIN_PREFIX depends on the exact toolchain being used. |
| |
| The dev-script 'gen-platforms.sh' is used to populate $NDK/platforms. |
| Note that by default, the script does more, see its detailed description |
| below. |
| |
| Generally, everything dev-script supports the --help option to display a |
| description of the program and the list of all supported options. Also, |
| debug traces can be activated by using the --verbose option. Use it several |
| times to increase the level of verbosity. |
| |
| Note that all Windows host programs can be built on Linux if you have the |
| 'mingw32' cross-toolchain installed ('apt-get install mingw32' on Debian or |
| Ubuntu). You will need to add the '--mingw' option when invoking the script. |
| |
| All dev-scripts rebuilding host programs on Linux and Darwin will only |
| generate 32-bit programs by default. You can experiment with 64-bit binary |
| generation by adding the '--try-64' option. Note that as of now, 64-bit |
| binaries are never distributed as part of official NDK releases. |
| |
| When building 32-bit Linux host programs, the dev-scripts will look for |
| $NDK/../prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/, which is |
| part of the Android platform source tree. It is a special toolchain that |
| ensures that the generated programs can run on old systems like Ubuntu 8.04 |
| that only have GLibc 2.7. Otherwise, the corresponding binaries may not run |
| due to ABI changes in mor recent versions of GLibc. |
| |
| This shall always be used to official NDK Linux releases. |
| |
| |
| II. Host toolchains: |
| -------------------- |
| |
| The host toolchains are the compiler, linker, debugger and other crucial |
| programs used to generate machine code for the target Android |
| system supported by the NDK. |
| |
| |
| II.1 Getting the toolchain sources: |
| - - - - - - - - - - - - - - - - - - |
| |
| The NDK toolchain sources are located under the toolchain/ directly |
| from the top of the public AOSP repositories. There are actually several |
| git repositories of interest here: |
| |
| binutils/ |
| build/ |
| gcc/ |
| gdb/ |
| gold/ |
| gmp/ |
| mpfr/ |
| |
| The AOSP toolchain/ repository contains sources corresponding to toolchains |
| that are used to build the Android platform tree. For various reasons, they |
| need to be slightly patched for use with the NDK. |
| |
| All patches are located under $NDK/build/tools/toolchain-patches/ |
| |
| The script 'download-toolchain-sources.sh' can be used to download and patch |
| the toolchain sources from the server. You simply need to give it the name of |
| a destination directory, for example: |
| |
| $NDK/build/tools/download-toolchain-sources.sh /tmp/ndk-$USER/src |
| |
| Note that this process can take several minutes. If you happen to already |
| have a clone of the repo toolchain/ tree, you can speed this up considerably |
| using the --git-reference or --git-base option. See --help for more options |
| and details. |
| |
| Note, to create a local toolchain repo: |
| |
| mkdir -p /tmp/ndk-$USER/toolchain |
| cd /tmp/ndk-$USER/toolchain |
| repo init https://android.googlesource.com/toolchain/manifest.git |
| repo sync |
| |
| then use with: |
| |
| $NDK/build/tools/download-toolchain-sources.sh \ |
| --git-reference=/tmp/ndk-$USER/toolchain \ |
| /tmp/ndk-$USER/src |
| |
| |
| The script doesn't simply copy the current HEAD of the toolchain |
| repositories. Instead, it will checkout the sources as they were |
| at a given known date, defined as TOOLCHAIN_GIT_DATE in 'prebuilt-common.sh'. |
| |
| If you adjust TOOLCHAIN_GIT_DATE, verify that all patches still apply |
| correctly, you might need to remove patches if they have been integrated |
| into the toolchain/ repositories. |
| |
| Note: you can avoid the patching with the --no-patches option to |
| 'download-toolchain-patches.sh', and later use 'patch-sources.sh' manually |
| to verify that the patches apply cleanly. |
| |
| The toolchains binaries are typically placed under the directory |
| $NDK/toolchains/$NAME/prebuilt/$SYSTEM, where $NAME is the toolchain name's |
| full name (e.g. arm-linux-androideabi-4.4.3), and $SYSTEM is the name of the |
| host system it is meant to run on (e.g. 'linux-x86', 'windows' or 'darwin-x86') |
| |
| |
| I.2. Building the toolchains: |
| - - - - - - - - - - - - - - - |
| |
| After downloading and patching the toolchain sources, you will need to build |
| a proper "sysroot" directory before being able to configure/build them. |
| |
| A sysroot is a directory containing system headers and libraries that the |
| compiler will use to build a few required target-specific binaries (e.g. libgcc.a) |
| |
| To do that, use: |
| |
| $NDK/build/tools/gen-platforms.sh --minimal |
| |
| This will populate $NDK/platforms/ with just the files necessary to rebuild the |
| toolchains. Note that without the --minimal option, the script will fail without |
| prebuilt toolchain binaries. |
| |
| Once the sysroots are in place, use 'build-gcc.sh' by providing the path |
| to the toolchain sources root directory, a destination NDK installation |
| directory to build, and the full toolchain name. |
| |
| For example, to rebuild the arm and x86 prebuilt toolchain binaries in the |
| current NDK directory (which can be handy if you want to later use them to |
| rebuild other target prebuilts or run tests), do: |
| |
| $NDK/build/tools/build-gcc.sh /tmp/ndk-$USER/src $NDK arm-linux-androideabi-4.4.3 |
| $NDK/build/tools/build-gcc.sh /tmp/ndk-$USER/src $NDK x86-4.4.3 |
| |
| Here, we assume you downloaded the toolchain sources in /tmp/ndk-$USER/src |
| as described in the previous section. |
| |
| This operation can take some time. The script automatically performs a parallel |
| build to speed up the build on multi-core machine (use the -j<number> option to |
| control this), but the GCC sources are very large, so expect to wait a few |
| minutes. |
| |
| For the record, on a 2.4 GHz Xeon with 16 Hyper-threaded cores and 12GB of |
| memory, rebuilding each toolchain takes between 2 and 4 minutes. |
| |
| You need to be on Linux to build the Windows binaries, using the "mingw32" |
| cross-toolchain (install it with "apt-get install mingw32" on Ubuntu). To do so |
| use the "--mingw" option, as in: |
| |
| $NDK/build/tools/build-gcc.sh --mingw \ |
| /tmp/ndk-$USER/src $NDK arm-linux-androideabi-4.4.3 |
| |
| $NDK/build/tools/build-gcc.sh --mingw \ |
| /tmp/ndk-$USER/src $NDK x86-4.4.3 |
| |
| The corresponding binaries are installed under $NDK/toolchains/$NAME/prebuilt/windows |
| Note that these are native Windows programs, not Cygwin ones. |
| |
| Building the Windows toolchains under MSys and Cygwin is completely unsupported |
| and highly un-recommended: even if it works, it will probably take several |
| hours, even on a powerful machine :-( |
| |
| The Darwin binaries must be generated on a Darwin machine. Note that the script |
| will try to use the 10.5 XCode SDK if it is installed on your system. This |
| ensures that the generated binaries run on Leopard, even if you're building |
| on a more recent version of the system. |
| |
| Once you've completed your builds, you should be able to generate the other |
| target-specific prebuilts. |
| |
| |
| III. Target-specific prebuilt binaries: |
| --------------------------------------- |
| |
| A final NDK installation comes with a lot of various target-specific prebuilt |
| binaries that must be generated from sources once you have working host toolchains. |
| |
| III.1.: Preparation of platform sysroots: |
| - - - - - - - - - - - - - - - - - - - - - |
| |
| Each target prebuilt is handled by a specific dev-script. HOWEVER, all these script |
| require that you generate a fully populated $NDK/platforms/ directory first. To do |
| that, simply run: |
| |
| $NDK/gen-platforms.sh |
| |
| Note that we used this script with the --minimal option to generate the host |
| toolchains. That's because without this flag, the script will also auto-generate |
| tiny versions of the system shared libraries that will be used at link-time when |
| building our target prebuilts. |
| |
| III.2.: Generation of gdbserver: |
| - - - - - - - - - - - - - - - - - |
| |
| A target-specific 'gdbserver' binary is required. This is a small program |
| that is run on the device through 'ndk-gdb' during debugging. For a variety |
| of technical reasons, it must be copied into a debuggable project's output |
| directory when 'ndk-build' is called. |
| |
| The prebuilt binary is placed under $NDK/toolchains/$NAME/prebuilt/gdbserver |
| in the final NDK installation. You can generate with 'build-gdbserver.sh' and |
| takes the same parameters than 'build-gcc.sh'. So one can do: |
| |
| $NDK/build/tools/build-gcc.sh /tmp/ndk-$USER/src $NDK arm-linux-androideabi-4.4.3 |
| $NDK/build/tools/build-gcc.sh /tmp/ndk-$USER/src $NDK x86-4.4.3 |
| |
| |
| III.3. Generating C++ runtime prebuilt binaries: |
| - - - - - - - - - - - - - - - - - - - - - - - - |
| |
| Sources and support files for several C++ runtimes / standard libraries are |
| provided under $NDK/sources/cxx-stl/. Several dev-scripts are provided to |
| rebuild their binaries. The scripts place them to their respective location |
| (e.g. the GAbi++ binaries will go to $NDK/sources/cxx-stl/gabi++/libs/) |
| unless you use the --out-dir=<path> option. |
| |
| Note that: |
| |
| - each script will generate the binaries for all the CPU ABIs supported by |
| the NDK, e.g. armeabi, armeabi-v7a and x86. You can restrict them using |
| the --abis=<list> option though. |
| |
| - the GNU libstdc++ dev-script requires the path to the toolchain sources, |
| since this is where the library's sources are located. |
| |
| An example usage would be: |
| |
| $NDK/build/tools/build-gabi++.sh |
| $NDK/build/tools/build-stlport.sh |
| $NDK/build/tools/build-gnu-libstdc++.sh /tmp/ndk-$USER/src |
| |
| Note that generating the STLport and GNU libstdc++ binaries can take a |
| few minutes. You can follow the build by using the --verbose option to display |
| what's going on. |
| |
| |
| IV. Other host prebuilt binaries: |
| --------------------------------- |
| |
| There are a few other host prebuilt binaries that are needed for a full |
| NDK installation. Their sources are typically installed under |
| $NDK/sources/host-tools/ |
| |
| Note that the corresponding dev-script recognize the --mingw and --try-64 |
| options described at the end of section I above. |
| |
| |
| IV.1.: Building 'ndk-stack': |
| - - - - - - - - - - - - - - |
| |
| The 'build-ndk-stack.sh' script can be used to rebuild the 'ndk-stack' |
| helper host program. See docs/NDK-STACK.html for a usage description. |
| To build it, just do: |
| |
| $NDK/build/tools/build-ndk-stack.sh |
| |
| |
| |
| V. Packaging all prebuilts: |
| --------------------------- |
| |
| Generating all the prebuilt binaries takes a lot of time and is no fun. |
| To avoid doing it again and again, it is useful to place all the generated |
| files aside in special tarballs. |
| |
| Most dev-scripts generating them typically support a --package-dir=<path> |
| option to do this, where <path> points to a directory that will store |
| compressed tarballs of the generated binaries. |
| |
| For example, to build and package the GAbi++ binaries, use: |
| |
| $NDK/build/tools/build-gabi++.sh --package-dir=/tmp/ndk-$USER/prebuilt/ |
| |
| In NDK r7, this will actually create three tarballs (one per supported ABI), |
| under the directory /tmp/ndk-$USER/prebuilt/, i.e.: |
| |
| gabi++-libs-armeabi.tar.bz2 |
| gabi++-libs-armeabi-v7a.tar.bz2 |
| gabi++-libs-x86.tar.bz2 |
| |
| Note that these tarballs are built to be uncompressed from the top-level |
| of an existing NDK install tree. |
| |
| Similarly, to rebuild the STLport binaries and package them: |
| |
| $NDK/build/tools/build-stlport.sh --package-dir=/tmp/ndk-$USER/prebuilt |
| |
| A dev-script is provided to rebuild _and_ package all prebuilts. It is called |
| 'rebuild-all-prebuilt.sh'. Note that by default, it will automatically |
| invoke 'download-toolchain-sources.sh', and place the prebuilt tarballs |
| under /tmp/ndk-$USER/prebuilt-$DATE, where $DATE is the current date in |
| ISO format (e.g. 20110915 for the 15th of September of 2011). |
| |
| If you have already downloaded the toolchain sources, use the |
| --toolchain-src-dir=<path> option to save a few minutes to your rebuild, |
| as in: |
| |
| $NDK/build/tools/rebuild-all-prebuilt.sh \ |
| --toolchain-src-dir=/tmp/ndk-$USER/src |
| |
| By default, this only rebuilds the host prebuilds for the current host |
| system. You can use --mingw to force the generation of Windows binaries on |
| Linux. |
| |
| Additionally, you can use the --darwin-ssh=<hostname> option to launch the |
| build of the Darwin binaries from a Linux machine, by using ssh to access a |
| remote Darwin machine. The script will package all required sources into a |
| temporary tarball, copy it to the remote machine, launch the build there, |
| then copy back all binaries to your own machine. |
| |
| This means that it is possible to generate the host binaries for all supported |
| host systems from Linux (provided you have ssh access to a Darwin machine). |
| |
| Alternatively, you can run 'rebuild-all-prebuilt.sh' on a Darwin machine. |
| |
| Once you have used the script three times (once per supported host systems), |
| you should have plenty of files under /tmp/ndk-$USER/prebuilt-$DATE. |
| For the record, with NDK r7, the list was: |
| |
| |
| VI. Packaging NDK releases: |
| --------------------------- |
| |
| Use the 'package-release.sh' dev-script to generate full NDK release packages. |
| These contain everything needed by a typical NDK user, including: |
| |
| - all prebuilt binaries (host toolchains, host tools, target libs, etc...) |
| - all samples (including those collected from $DEVNDK/platforms/) |
| - all documentation |
| |
| You need to have a directory containing prebuilt tarballs, as described in |
| the previous section. You can use it as: |
| |
| $NDK/build/tools/package-release.sh \ |
| --release=<name> \ |
| --systems=<list> \ |
| --arch=<list> \ |
| --prebuilt-dir=<path> |
| |
| The --release option is optional and allows you to provide a name for your |
| generated NDK archive. More specifically, the archive file name will be |
| something like android-ndk-$RELEASE-$SYSTEM.tar.bz2, where $RELEASE is |
| the release name, and $SYSTEM the supported host system (e.g. linux-x86). |
| |
| By default, i.e. without the option, $RELEASE will be set to the current $DATE. |
| |
| The --systems=<list> is optional, but can be used to limit the number of host |
| systems you want to generate for. <list> must be a comma-separated list of |
| system names (from 'linux-x86', 'windows' and 'darwin-x86'). This is useful |
| if you're working on a experimental feature and don't have the time to |
| regenerate the host toolchains for all systems. It allows you to generate |
| an experimental package that you can distribute to third-party for |
| experimentation. |
| |
| By default, i.e. without the option, the scripts tries to build NDK archives |
| for all supported host systems. |
| |
| The --arch=<list> is also optional, but can be used ot limit the number of |
| target architectures you want to generate for. <list> must be a comma-separated |
| list of CPU architectures (e.g. from 'arm' and 'x86'). Without the option, |
| this will try to build packages that support all architectures. |
| |
| Finally, --prebuilt-dir=<path> must point to the directory that contains the |
| prebuilt tarballs described in section V. Following our previous example, one |
| could use --prebuilt-dir=/tmp/ndk-$USER/prebuilt here. |
| |
| |
| VI. Testing: |
| ------------ |
| |
| The $NDK/tests directory contains a number of NDK unit-tests that can be |
| used to verify that the generated NDK packages or the working NDK tree still |
| behave correctly. |
| |
| If you have an NDK package archive, you can run the following to run the |
| test suite against it: |
| |
| $NDK/tests/run-tests.sh --package=<ndk-archive> |
| |
| This will uncompress the NDK archive in a temporary directory, then run all |
| the tests with it. When all tests have run, the temporary directory is removed |
| automatically. |
| |
| You can also point to an existing NDK installation with --ndk=<path>, as in: |
| |
| $NDK/tests/run-tests.sh --ndk=<path> |
| |
| Where <path> points to another NDK installation. The script will run the |
| test suite present under $NDK/tests/, not the one in the remote NDK directory. |
| |
| If you don't use any option, the test suite will be run with the current NDK |
| directory. This can only work if you have generated or unpacked all prebuilt |
| archives into it before that. |
| |
| You can get more traces from the tests by using --verbose. Use it twice to see |
| even more traces. |
| |
| There are several kinds of tests: |
| |
| - 'build tests' are used to test the building capabilities of the NDK. |
| I.e. the tests will only use them to check that the NDK build system |
| didn't regress. The corresponding generated binaries are never used |
| otherwise. |
| |
| - 'device tests' are used to test both the build and the behaviour of |
| the generated code. If the 'adb' program is in your path, and have |
| one device or emulator connected to your host machine, 'run-tests.sh' |
| will automatically upload, run and cleanup these tests for you. |
| |
| If adb is not in your path, or no device is connected, run-tests.sh |
| will simply print a warning and carry on. |
| |
| |
| Whenever you add a feature to the NDK, or fix a bug, it is recommended to |
| add a unit test to check the feature or the fix. Use $NDK/tests/build for |
| build tests, and $NDK/tests/device for device tests. |
| |