Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 1 | page.title=Android Interfaces and Architecture |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 2 | @jd:body |
| 3 | |
| 4 | <!-- |
Heidi von Markham | 1e7b8b7 | 2015-03-09 10:13:48 -0700 | [diff] [blame] | 5 | Copyright 2015 The Android Open Source Project |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 6 | |
| 7 | Licensed under the Apache License, Version 2.0 (the "License"); |
| 8 | you may not use this file except in compliance with the License. |
| 9 | You may obtain a copy of the License at |
| 10 | |
| 11 | http://www.apache.org/licenses/LICENSE-2.0 |
| 12 | |
| 13 | Unless required by applicable law or agreed to in writing, software |
| 14 | distributed under the License is distributed on an "AS IS" BASIS, |
| 15 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 16 | See the License for the specific language governing permissions and |
| 17 | limitations under the License. |
| 18 | --> |
| 19 | <div id="qv-wrapper"> |
| 20 | <div id="qv"> |
| 21 | <h2>In this document</h2> |
| 22 | <ol id="auto-toc"> |
| 23 | </ol> |
| 24 | </div> |
| 25 | </div> |
| 26 | |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 27 | <p> |
| 28 | Android gives you the freedom to implement your own device specifications and |
| 29 | drivers. The hardware abstraction layer (HAL) provides a standard method for |
| 30 | creating software hooks between the Android platform stack and your hardware. |
| 31 | The Android operating system is also open source, so you can contribute your own |
| 32 | interfaces and enhancements. |
| 33 | </p> |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 34 | |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 35 | <p> |
| 36 | To ensure devices maintain a high level of quality and offer a consistent user |
| 37 | experience, each device must pass tests in the compatibility test suite (CTS). |
| 38 | The CTS verifies devices meet a quality standard that ensures apps run reliably |
| 39 | and users have a good experience. For details on the CTS, see |
| 40 | <a href="{@docRoot}compatibility/index.html">Compatibility</a>. |
| 41 | </p> |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 42 | |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 43 | <p> |
| 44 | Before porting Android to your hardware, take a moment to understand the Android |
| 45 | system architecture at a high level. Because your drivers and the HAL interact |
| 46 | with Android, knowing how Android works can help you navigate the many layers of |
| 47 | code in the Android Open Source Project (AOSP) source tree. |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 48 | </p> |
| 49 | |
Heidi von Markham | 1e7b8b7 | 2015-03-09 10:13:48 -0700 | [diff] [blame] | 50 | <img src="images/ape_fwk_all.png"> |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 51 | |
| 52 | <p class="img-caption"><strong>Figure 1.</strong> Android System Architecture</p> |
| 53 | |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 54 | <h2 id="Application framework">Application framework</h2> |
Heidi von Markham | 1e7b8b7 | 2015-03-09 10:13:48 -0700 | [diff] [blame] | 55 | <p> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 56 | The application framework is used most often by application developers. As a |
| 57 | hardware developer, you should be aware of developer APIs as many map directly |
| 58 | to the underlying HAL interfaces and can provide helpful information about |
| 59 | implementing drivers. |
Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 60 | </p> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 61 | |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 62 | <h2 id="Binder IPC">Binder IPC</h2> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 63 | <p> |
| 64 | The Binder Inter-Process Communication (IPC) mechanism allows the application |
| 65 | framework to cross process boundaries and call into the Android system services |
| 66 | code. This enables high level framework APIs to interact with Android system |
| 67 | services. At the application framework level, this communication is hidden from |
| 68 | the developer and things appear to "just work." |
Clay Murphy | 768b82a | 2013-11-12 11:32:41 -0800 | [diff] [blame] | 69 | </p> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 70 | |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 71 | <h2 id="System services">System services</h2> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 72 | <p> |
| 73 | Functionality exposed by application framework APIs communicates with system |
| 74 | services to access the underlying hardware. Services are modular, focused |
| 75 | components such as Window Manager, Search Service, or Notification Manager. |
| 76 | Android includes two groups of services: <em>system</em> (services such as |
| 77 | Window Manager and Notification Manager) and <em>media</em> (services involved |
| 78 | in playing and recording media). |
| 79 | </p> |
| 80 | |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 81 | <h2 id="Hardware Abstraction Layer">Hardware abstraction layer (HAL)</h2> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 82 | <p> |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 83 | The hardware abstraction layer (HAL) defines a standard interface for hardware |
| 84 | vendors to implement and allows Android to be agnostic about lower-level driver |
| 85 | implementations. The HAL allows you to implement functionality without |
| 86 | affecting or modifying the higher level system. HAL implementations are |
| 87 | packaged into modules (<code>.so</code>) file and loaded by the Android system |
| 88 | at the appropriate time. |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 89 | </p> |
| 90 | |
| 91 | <img src="images/ape_fwk_hal.png"> |
| 92 | |
| 93 | <p class="img-caption"><strong>Figure 2.</strong> Hardware abstraction layer |
| 94 | (HAL) components</p> |
| 95 | |
| 96 | <p> |
| 97 | You must implement the corresponding HAL (and driver) for the specific hardware |
| 98 | your product provides. HAL implementations are typically built into shared |
| 99 | library modules (<code>.so</code> files). Android does not mandate a standard |
| 100 | interaction between your HAL implementation and your device drivers, so you have |
| 101 | free reign to do what is best for your situation. However, to enable the Android |
| 102 | system to correctly interact with your hardware, you <strong>must</strong> abide |
| 103 | by the contract defined in each hardware-specific HAL interface. |
| 104 | </p> |
| 105 | |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 106 | <h3 id="structure">Standard HAL structure</h3> |
| 107 | <p> |
| 108 | Each hardware-specific HAL interface has properties that are defined in |
| 109 | <code>hardware/libhardware/include/hardware/hardware.h</code>, which |
| 110 | guarantee that HALs have a predictable structure. |
| 111 | This interface allows the Android system to load the correct versions of your |
| 112 | HAL modules in a consistent way. There are two general components |
| 113 | that a HAL interface consists of: a module and a device. |
| 114 | </p> |
| 115 | <p> |
| 116 | A module represents your packaged HAL implementation, which is stored as a shared library (<code>.so file</code>). It contains |
| 117 | metadata such as the version, name, and author of the module, which helps Android find and load it correctly. The |
| 118 | <code>hardware/libhardware/include/hardware/hardware.h</code> header file defines a |
| 119 | struct, <code>hw_module_t</code>, that represents a module and contains information such as |
| 120 | the module version, author, and name.</p> |
| 121 | |
| 122 | <p>In addition, the <code>hw_module_t</code> struct contains |
| 123 | a pointer to another struct, <code>hw_module_methods_t</code>, that contains a pointer to |
| 124 | an "open" function for the module. This open function is used to initate communication with |
| 125 | the hardware that the HAL is serving as an abstraction for. Each hardware-specific HAL usually |
| 126 | extends the generic <code>hw_module_t</code> struct with additional information |
| 127 | for that specific piece of hardware. For example in the camera HAL, the <code>camera_module_t</code> struct |
| 128 | contains a <code>hw_module_t</code> struct along with other camera-specific function pointers: |
| 129 | </p> |
| 130 | |
| 131 | <pre> |
| 132 | typedef struct camera_module { |
| 133 | hw_module_t common; |
| 134 | int (*get_number_of_cameras)(void); |
| 135 | int (*get_camera_info)(int camera_id, struct camera_info *info); |
| 136 | } camera_module_t; |
| 137 | </pre> |
| 138 | |
| 139 | <p>When you implement a HAL and create the module struct, you must name it |
| 140 | <code>HAL_MODULE_INFO_SYM</code>. For instance, here is an example from the Nexus 9 audio HAL:</p> |
| 141 | <pre> |
| 142 | struct audio_module HAL_MODULE_INFO_SYM = { |
| 143 | .common = { |
| 144 | .tag = HARDWARE_MODULE_TAG, |
| 145 | .module_api_version = AUDIO_MODULE_API_VERSION_0_1, |
| 146 | .hal_api_version = HARDWARE_HAL_API_VERSION, |
| 147 | .id = AUDIO_HARDWARE_MODULE_ID, |
| 148 | .name = "NVIDIA Tegra Audio HAL", |
| 149 | .author = "The Android Open Source Project", |
| 150 | .methods = &hal_module_methods, |
| 151 | }, |
| 152 | }; |
| 153 | </pre> |
| 154 | <p> |
| 155 | A device abstracts the actual hardware of your product. For example, an audio module can contain |
| 156 | a primary audio device, a USB audio device, or a Bluetooth A2DP audio device. A device |
| 157 | is represented by the <code>hw_device_t</code> struct. Like a module, each type of device |
| 158 | defines a more-detailed version of the generic <code>hw_device_t</code> that contains |
| 159 | function pointers for specific features of the hardware. For example, the |
| 160 | <code>audio_hw_device_t</code> struct type contains function pointers to audio device operations: |
| 161 | </p> |
| 162 | |
| 163 | <pre> |
| 164 | struct audio_hw_device { |
| 165 | struct hw_device_t common; |
| 166 | |
| 167 | /** |
| 168 | * used by audio flinger to enumerate what devices are supported by |
| 169 | * each audio_hw_device implementation. |
| 170 | * |
| 171 | * Return value is a bitmask of 1 or more values of audio_devices_t |
| 172 | */ |
| 173 | uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); |
| 174 | ... |
| 175 | }; |
| 176 | typedef struct audio_hw_device audio_hw_device_t; |
| 177 | </pre> |
| 178 | |
| 179 | <p> |
| 180 | In addition to these standard properties, each hardware-specific HAL interface can define more of its |
| 181 | own features and requirements. See the <a href="{@docRoot}devices/halref/index.html">HAL reference documentation</a> |
| 182 | as well as the individual instructions for each HAL for more information on how to implement a specific interface. |
| 183 | </p> |
| 184 | |
| 185 | <h3 id="modules">HAL modules</h3> |
| 186 | <p>HAL implementations are built into modules (<code>.so</code>) files and are dynamically linked by Android when appropriate. |
| 187 | You can build your modules by creating <code>Android.mk</code> files for each of your HAL implementations |
| 188 | and pointing to your source files. In general, your shared libraries must be named in a certain format, so that |
| 189 | they can be found and loaded properly. The naming scheme varies slightly from module to module, but they follow |
| 190 | the general pattern of: <code><module_type>.<device_name></code>.</p> |
| 191 | |
| 192 | <p>For more information about setting up the build for each HAL, see its respective documentation.</p> |
| 193 | |
| 194 | <h2 id="Linux kernel">Linux kernel</h2> |
Heidi von Markham | a848162 | 2015-04-13 12:26:23 -0700 | [diff] [blame] | 195 | <p> |
| 196 | Developing your device drivers is similar to developing a typical Linux device |
| 197 | driver. Android uses a version of the Linux kernel with a few special additions |
| 198 | such as wake locks (a memory management system that is more agressive in |
| 199 | preserving memory), the Binder IPC driver, and other features important for a |
| 200 | mobile embedded platform. These additions are primarily for system functionality |
| 201 | and do not affect driver development. |
| 202 | |
| 203 | <p> |
| 204 | You can use any version of the kernel as long as it supports the required |
| 205 | features (such as the binder driver). However, we recommend using the latest |
| 206 | version of the Android kernel. For details on the latest Android kernel, see <a href="{@docRoot}source/building-kernels.html" >Building Kernels</a>. |
Clay Murphy | 51f2064 | 2015-07-07 17:15:12 -0700 | [diff] [blame] | 207 | </p> |