| page.title=Android Interfaces |
| @jd:body |
| |
| <!-- |
| Copyright 2015 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>In this document</h2> |
| <ol id="auto-toc"> |
| </ol> |
| </div> |
| </div> |
| |
| <p> |
| Android gives you the freedom to implement your own device specifications and |
| drivers. The hardware abstraction layer (HAL) provides a standard method for |
| creating software hooks between the Android platform stack and your hardware. |
| The Android operating system is also open source, so you can contribute your own |
| interfaces and enhancements. |
| </p> |
| |
| <p> |
| To ensure devices maintain a high level of quality and offer a consistent user |
| experience, each device must pass tests in the compatibility test suite (CTS). |
| The CTS verifies devices meet a quality standard that ensures apps run reliably |
| and users have a good experience. For details on the CTS, see |
| <a href="{@docRoot}compatibility/index.html">Compatibility</a>. |
| </p> |
| |
| <h2 id="Android system architecture">Android system architecture</h2> |
| |
| <p> |
| Before porting Android to your hardware, take a moment to understand the Android |
| system architecture at a high level. Because your drivers and the HAL interact |
| with Android, knowing how Android works can help you navigate the many layers of |
| code in the Android Open Source Project (AOSP) source tree. |
| </p> |
| |
| <img src="images/ape_fwk_all.png"> |
| |
| <p class="img-caption"><strong>Figure 1.</strong> Android System Architecture</p> |
| |
| <h3 id="Application framework">Application framework</h3> |
| <p> |
| The application framework is used most often by application developers. As a |
| hardware developer, you should be aware of developer APIs as many map directly |
| to the underlying HAL interfaces and can provide helpful information about |
| implementing drivers. |
| </p> |
| |
| <h3 id="Binder IPC">Binder IPC</h3> |
| <p> |
| The Binder Inter-Process Communication (IPC) mechanism allows the application |
| framework to cross process boundaries and call into the Android system services |
| code. This enables high level framework APIs to interact with Android system |
| services. At the application framework level, this communication is hidden from |
| the developer and things appear to "just work." |
| </p> |
| |
| <h3 id="System services">System services</h3> |
| <p> |
| Functionality exposed by application framework APIs communicates with system |
| services to access the underlying hardware. Services are modular, focused |
| components such as Window Manager, Search Service, or Notification Manager. |
| Android includes two groups of services: <em>system</em> (services such as |
| Window Manager and Notification Manager) and <em>media</em> (services involved |
| in playing and recording media). |
| </p> |
| |
| <h3 id="Hardware Abstraction Layer">Hardware abstraction layer (HAL)</h3> |
| <p> |
| The HAL is a standard interface that allows the Android system to call into the |
| device driver layer while being agnostic about the lower-level implementations |
| of drivers and hardware. |
| </p> |
| |
| <img src="images/ape_fwk_hal.png"> |
| |
| <p class="img-caption"><strong>Figure 2.</strong> Hardware abstraction layer |
| (HAL) components</p> |
| |
| <p> |
| You must implement the corresponding HAL (and driver) for the specific hardware |
| your product provides. HAL implementations are typically built into shared |
| library modules (<code>.so</code> files). Android does not mandate a standard |
| interaction between your HAL implementation and your device drivers, so you have |
| free reign to do what is best for your situation. However, to enable the Android |
| system to correctly interact with your hardware, you <strong>must</strong> abide |
| by the contract defined in each hardware-specific HAL interface. |
| </p> |
| |
| <h3 id="Linux kernel">Linux Kernel</h3> |
| <p> |
| Developing your device drivers is similar to developing a typical Linux device |
| driver. Android uses a version of the Linux kernel with a few special additions |
| such as wake locks (a memory management system that is more agressive in |
| preserving memory), the Binder IPC driver, and other features important for a |
| mobile embedded platform. These additions are primarily for system functionality |
| and do not affect driver development. |
| |
| <p> |
| You can use any version of the kernel as long as it supports the required |
| features (such as the binder driver). However, we recommend using the latest |
| version of the Android kernel. For details on the latest Android kernel, see <a href="{@docRoot}source/building-kernels.html" >Building Kernels</a>. |
| </p> |