blob: a4a415e38ae7dd4dcb1d46f0275622789580b65f [file] [log] [blame]
<html devsite>
<head>
<title>Architecture</title>
<meta name="project_path" value="/_project.yaml" />
<meta name="book_path" value="/_book.yaml" />
</head>
<body>
<!--
Copyright 2017 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.
-->
<p>
Android system architecture contains the following components:
</p>
<img src="../images/ape_fwk_all.png">
<p class="img-caption"><strong>Figure 1.</strong> Android system architecture</p>
<h2 id="application-framework">Application framework</h2>
<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>
<h2 id="binder-ipc">Binder IPC</h2>
<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>
<h2 id="system-services">System services</h2>
<p>System services are modular, focused components such as Window Manager,
Search Service, or Notification Manager. Functionality exposed by application
framework APIs communicates with system services to access the underlying
hardware. Android includes two groups of services: <em>system</em> (such as
Window Manager and Notification Manager) and <em>media</em> (services involved
in playing and recording media).</p>
<h2 id="hal">Hardware abstraction layer (HAL)</h2>
<p>A HAL defines a standard interface for hardware vendors to implement,
which enables Android to be agnostic about lower-level driver implementations.
Using a HAL allows you to implement functionality without affecting or modifying
the higher level system. HAL implementations are packaged into modules and
loaded by the Android system at the appropriate time. For details, see
<a href="/devices/architecture/hal.html">Hardware Abstraction Layer (HAL)</a>.
</p>
<h2 id="Linux-kernel">Linux kernel</h2>
<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 aggressive
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>
<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, see
<a href="/source/building-kernels.html">Building Kernels</a>.</p>
</body>
</html>