blob: b960483b7eb5345f75a1eb94420671d4209d4e73 [file] [log] [blame] [view]
## 3.3\. Native API Compatibility
Native code compatibility is challenging. For this reason,
device implementers are:
* [SR] STRONGLY RECOMMENDED to use the implementations of the libraries
listed below from the upstream Android Open Source Project.
### 3.3.1\. Application Binary Interfaces
Managed Dalvik bytecode can call into native code provided in the application
`.apk` file as an ELF `.so` file compiled for the appropriate device hardware
architecture. As native code is highly dependent on the underlying processor
technology, Android defines a number of Application Binary Interfaces (ABIs) in
the Android NDK.
Device implementations:
* [C-0-1] MUST be compatible with one or more defined [Android NDK ABIs](
https://developer.android.com/ndk/guides/abis).
* [C-0-2] MUST include support for code running in the managed environment to
call into native code, using the standard Java Native Interface (JNI)
semantics.
* [C-0-3] MUST be source-compatible (i.e. header-compatible) and
binary-compatible (for the ABI) with each required library in the list
below.
* [C-0-5] MUST accurately report the native Application Binary Interface
(ABI) supported by the device, via the `android.os.Build.SUPPORTED_ABIS`,
`android.os.Build.SUPPORTED_32_BIT_ABIS`, and
`android.os.Build.SUPPORTED_64_BIT_ABIS` parameters, each a comma separated
list of ABIs ordered from the most to the least preferred one.
* [C-0-6] MUST report, via the above parameters, a subset of the following
list of ABIs and MUST NOT report any ABI not on the list.
* `armeabi` (no longer supported as a target by the NDK)
* [`armeabi-v7a`](https://developer.android.com/ndk/guides/abis#v7a)
* [`arm64-v8a`](https://developer.android.com/ndk/guides/abis#arm64-v8a)
* [`x86`](https://developer.android.com/ndk/guides/abis#x86)
* [`x86-64`](https://developer.android.com/ndk/guides/abis#86-64)
* [C-0-7] MUST make all the following libraries, providing native APIs,
available to apps that include native code:
* libaaudio.so (AAudio native audio support)
* libamidi.so (native MIDI support, if feature `android.software.midi`
is claimed as described in Section 5.9)
* libandroid.so (native Android activity support)
* libc (C library)
* libcamera2ndk.so
* libdl (dynamic linker)
* libEGL.so (native OpenGL surface management)
* libGLESv1\_CM.so (OpenGL ES 1.x)
* libGLESv2.so (OpenGL ES 2.0)
* libGLESv3.so (OpenGL ES 3.x)
* libicui18n.so
* libicuuc.so
* libjnigraphics.so
* liblog (Android logging)
* libmediandk.so (native media APIs support)
* libm (math library)
* libneuralnetworks.so (Neural Networks API)
* libOpenMAXAL.so (OpenMAX AL 1.0.1 support)
* libOpenSLES.so (OpenSL ES 1.0.1 audio support)
* libRS.so
* libstdc++ (Minimal support for C++)
* libvulkan.so (Vulkan)
* libz (Zlib compression)
* JNI interface
* [C-0-8] MUST NOT add or remove the public functions for the native libraries
listed above.
* [C-0-9] MUST list additional non-AOSP libraries exposed directly to
third-party apps in `/vendor/etc/public.libraries.txt`.
* [C-0-10] MUST NOT expose any other native libraries, implemented and
provided in AOSP as system libraries, to third-party apps targeting API
level 24 or higher as they are reserved.
* [C-0-11] MUST export all the OpenGL ES 3.1 and [Android Extension Pack](
http://developer.android.com/guide/topics/graphics/opengl.html#aep)
function symbols, as defined in the NDK, through the `libGLESv3.so` library.
Note that while all the symbols MUST be present, section 7.1.4.1 describes
in more detail the requirements for when the full implementation of each
corresponding functions are expected.
* [C-0-12] MUST export function symbols for the core Vulkan 1.0 function
symbols, as well as the `VK_KHR_surface`, `VK_KHR_android_surface`,
`VK_KHR_swapchain`, `VK_KHR_maintenance1`, and
`VK_KHR_get_physical_device_properties2` extensions through the
`libvulkan.so` library. Note that while all the symbols MUST be present,
section 7.1.4.2 describes in more detail the requirements for when the full
implementation of each corresponding functions are expected.
* SHOULD be built using the source code and header files available in the
upstream Android Open Source Project
Note that future releases of Android may introduce support for additional
ABIs.
### 3.3.2. 32-bit ARM Native Code Compatibility
If device implementations report the support of the `armeabi` ABI, they:
* [C-3-1] MUST also support `armeabi-v7a` and report its support, as
`armeabi` is only for backwards compatibility with older apps.
If device implementations report the support of the `armeabi-v7a` ABI, for apps
using this ABI, they:
* [C-2-1] MUST include the following lines in `/proc/cpuinfo`, and SHOULD NOT
alter the values on the same device, even when they are read by other ABIs.
* `Features: `, followed by a list of any optional ARMv7 CPU features
supported by the device.
* `CPU architecture: `, followed by an integer describing the device's
highest supported ARM architecture (e.g., "8" for ARMv8 devices).
* [C-2-2] MUST always keep the following operations available, even in the
case where the ABI is implemented on an ARMv8 architecture, either through
native CPU support or through software emulation:
* SWP and SWPB instructions.
* SETEND instruction.
* CP15ISB, CP15DSB, and CP15DMB barrier operations.
* [C-2-3] MUST include support for the [Advanced SIMD](
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388f/Beijfcja.html)
(a.k.a. NEON) extension.