aboutsummaryrefslogtreecommitdiff
path: root/3_software/3_3_native-api-compatibility.md
blob: d0c9c9fbfeee2c3f698867c3143b43674829bd8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
## 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 ABIs and implement
    compatibility with the Android NDK.
*   [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`
     *   `armeabi-v7a`
     *   `arm64-v8a`
     *   `x86`
     *   `x86-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)
     *   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.