11411 lines
324 KiB
HTML
11411 lines
324 KiB
HTML
<html devsite>
|
|
<head>
|
|
<title>Android 7.1 Compatibility Definition</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.
|
|
-->
|
|
|
|
<body>
|
|
<h2 id="1_introduction">
|
|
1. Introduction
|
|
</h2>
|
|
<p>
|
|
This document enumerates the requirements that must be met in order for devices
|
|
to be compatible with Android 7.1.
|
|
</p>
|
|
<p>
|
|
The use of “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
|
|
“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” is per the IETF standard
|
|
defined in
|
|
<a href="http://www.ietf.org/rfc/rfc2119.txt">
|
|
RFC2119
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
As used in this document, a “device implementer” or “implementer” is a person
|
|
or organization developing a hardware/software solution running Android
|
|
7.1. A “device implementation” or “implementation is the
|
|
hardware/software solution so developed.
|
|
</p>
|
|
<p>
|
|
To be considered compatible with Android 7.1, device
|
|
implementations MUST meet the requirements presented in this Compatibility
|
|
Definition, including any documents incorporated via reference.
|
|
</p>
|
|
<p>
|
|
Where this definition or the software tests described in
|
|
<a href="#10_software_compatibility_testing">
|
|
section
|
|
10
|
|
</a>
|
|
is silent, ambiguous, or incomplete, it
|
|
is the responsibility of the device implementer to ensure compatibility with
|
|
existing implementations.
|
|
</p>
|
|
<p>
|
|
For this reason, the
|
|
<a href="http://source.android.com/">
|
|
Android Open Source Project
|
|
</a>
|
|
is both the reference and preferred implementation of Android. Device
|
|
implementers are STRONGLY RECOMMENDED to base their implementations to the
|
|
greatest extent possible on the “upstream” source code available from the
|
|
Android Open Source Project. While some components can hypothetically be
|
|
replaced with alternate implementations, it is STRONGLY RECOMMENDED to not
|
|
follow this practice, as passing the software tests will become substantially
|
|
more difficult. It is the implementer’s responsibility to ensure full
|
|
behavioral compatibility with the standard Android implementation, including
|
|
and beyond the Compatibility Test Suite. Finally, note that certain component
|
|
substitutions and modifications are explicitly forbidden by this document.
|
|
</p>
|
|
<p>
|
|
Many of the resources linked to in this document are derived directly or
|
|
indirectly from the Android SDK and will be functionally identical to the
|
|
information in that SDK’s documentation. In any cases where this Compatibility
|
|
Definition or the Compatibility Test Suite disagrees with the SDK
|
|
documentation, the SDK documentation is considered authoritative. Any technical
|
|
details provided in the linked resources throughout this document are
|
|
considered by inclusion to be part of this Compatibility Definition.
|
|
</p>
|
|
<h2 id="2_device_types">
|
|
2. Device Types
|
|
</h2>
|
|
<p>
|
|
While the Android Open Source Project has been used in the implementation of a
|
|
variety of device types and form factors, many aspects of the architecture and
|
|
compatibility requirements were optimized for handheld devices. Starting from
|
|
Android 5.0, the Android Open Source Project aims to embrace a wider variety of
|
|
device types as described in this section.
|
|
</p>
|
|
<p>
|
|
<strong>
|
|
Android Handheld device
|
|
</strong>
|
|
refers to an Android device implementation that is
|
|
typically used by holding it in the hand, such as mp3 players, phones, and
|
|
tablets. Android Handheld device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST have a touchscreen embedded in the device.
|
|
</li>
|
|
<li>
|
|
MUST have a power source that provides mobility, such as a battery.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
<strong>
|
|
Android Television device
|
|
</strong>
|
|
refers to an Android device implementation that
|
|
is an entertainment interface for consuming digital media, movies, games, apps,
|
|
and/or live TV for users sitting about ten feet away (a “lean back” or “10-foot
|
|
user interface”). Android Television devices:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST have an embedded screen OR include a video output port, such as VGA,
|
|
HDMI, or a wireless port for display.
|
|
</li>
|
|
<li>
|
|
MUST declare the features
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_LEANBACK">
|
|
android.software.leanback
|
|
</a>
|
|
and android.hardware.type.television.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
<strong>
|
|
Android Watch device
|
|
</strong>
|
|
refers to an Android device implementation intended to
|
|
be worn on the body, perhaps on the wrist, and:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST have a screen with the physical diagonal length in the range from 1.1
|
|
to 2.5 inches.
|
|
</li>
|
|
<li>
|
|
MUST declare the feature android.hardware.type.watch.
|
|
</li>
|
|
<li>
|
|
MUST support uiMode =
|
|
<a href="http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_WATCH">
|
|
UI_MODE_TYPE_WATCH
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
<strong>
|
|
Android Automotive implementation
|
|
</strong>
|
|
refers to a vehicle head unit running
|
|
Android as an operating system for part or all of the system and/or
|
|
infotainment functionality. Android Automotive implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST have a screen with the physical diagonal length equal to or greater
|
|
than 6 inches.
|
|
</li>
|
|
<li>
|
|
MUST declare the feature android.hardware.type.automotive.
|
|
</li>
|
|
<li>
|
|
MUST support uiMode =
|
|
<a href="http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_CAR">
|
|
UI_MODE_TYPE_CAR
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
Android Automotive implementations MUST support all public APIs in the
|
|
<code>
|
|
android.car.*
|
|
</code>
|
|
namespace.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All Android device implementations that do not fit into any of the above device
|
|
types still MUST meet all requirements in this document to be Android
|
|
7.1 compatible, unless the requirement is explicitly described to
|
|
be only applicable to a specific Android device type from above.
|
|
</p>
|
|
<h3 id="2_1_device_configurations">
|
|
2.1 Device Configurations
|
|
</h3>
|
|
<p>
|
|
This is a summary of major differences in hardware configuration by device
|
|
type. (Empty cells denote a “MAY”). Not all configurations are covered in this
|
|
table; see relevant hardware sections for more detail.
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Category
|
|
</th>
|
|
<th>
|
|
Feature
|
|
</th>
|
|
<th>
|
|
Section
|
|
</th>
|
|
<th>
|
|
Handheld
|
|
</th>
|
|
<th>
|
|
Television
|
|
</th>
|
|
<th>
|
|
Watch
|
|
</th>
|
|
<th>
|
|
Automotive
|
|
</th>
|
|
<th>
|
|
Other
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="3">
|
|
Input
|
|
</td>
|
|
<td>
|
|
D-pad
|
|
</td>
|
|
<td>
|
|
<a href="#7_2_2_non-touch-navigation">
|
|
7.2.2. Non-touch Navigation
|
|
</a>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Touchscreen
|
|
</td>
|
|
<td>
|
|
<a href="#7_2_4_touchscreen_input">
|
|
7.2.4. Touchscreen input
|
|
</a>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Microphone
|
|
</td>
|
|
<td>
|
|
<a href="#7_8_1_microphone">
|
|
7.8.1. Microphone
|
|
</a>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="2">
|
|
Sensors
|
|
</td>
|
|
<td>
|
|
Accelerometer
|
|
</td>
|
|
<td>
|
|
<a href="#7_3_1_accelerometer">
|
|
7.3.1 Accelerometer
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
GPS
|
|
</td>
|
|
<td>
|
|
<a href="#7_3_3_gps">
|
|
7.3.3. GPS
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="6">
|
|
Connectivity
|
|
</td>
|
|
<td>
|
|
Wi-Fi
|
|
</td>
|
|
<td>
|
|
<a href="#7_4_2_ieee_802.11">
|
|
7.4.2. IEEE 802.11
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Wi-Fi Direct
|
|
</td>
|
|
<td>
|
|
<a href="#7_4_2_1_wi-fi-direct">
|
|
7.4.2.1. Wi-Fi Direct
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Bluetooth
|
|
</td>
|
|
<td>
|
|
<a href="#7_4_3_bluetooth">
|
|
7.4.3. Bluetooth
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Bluetooth Low Energy
|
|
</td>
|
|
<td>
|
|
<a href="#7_4_3_bluetooth">
|
|
7.4.3. Bluetooth
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Cellular radio
|
|
</td>
|
|
<td>
|
|
<a href="#7_4_5_minimum_network_capability">
|
|
7.4.5. Minimum Network Capability
|
|
</a>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
USB peripheral/host mode
|
|
</td>
|
|
<td>
|
|
<a href="#7_7_usb">
|
|
7.7. USB
|
|
</a>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
<td>
|
|
SHOULD
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Output
|
|
</td>
|
|
<td>
|
|
Speaker and/or Audio output ports
|
|
</td>
|
|
<td>
|
|
<a href="#7_8_2_audio_output">
|
|
7.8.2. Audio Output
|
|
</a>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
<td>
|
|
MUST
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h2 id="3_software">
|
|
3. Software
|
|
</h2>
|
|
<h3 id="3_1_managed_api_compatibility">
|
|
3.1. Managed API Compatibility
|
|
</h3>
|
|
<p>
|
|
The managed Dalvik bytecode execution environment is the primary vehicle for
|
|
Android applications. The Android application programming interface (API) is the
|
|
set of Android platform interfaces exposed to applications running in the
|
|
managed runtime environment. Device implementations MUST provide complete
|
|
implementations, including all documented behaviors, of any documented API
|
|
exposed by the
|
|
<a href="http://developer.android.com/reference/packages.html">
|
|
Android SDK
|
|
</a>
|
|
or any API decorated with the “@SystemApi” marker in the upstream Android source code.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST support/preserve all classes, methods, and
|
|
associated elements marked by the TestApi annotation (@TestApi).
|
|
</p>
|
|
<p>
|
|
Device implementations MUST NOT omit any managed APIs, alter API interfaces or
|
|
signatures, deviate from the documented behavior, or include no-ops, except
|
|
where specifically allowed by this Compatibility Definition.
|
|
</p>
|
|
<p>
|
|
This Compatibility Definition permits some types of hardware for which Android
|
|
includes APIs to be omitted by device implementations. In such cases, the APIs
|
|
MUST still be present and behave in a reasonable way. See
|
|
<a href="#7_hardware_compatibility">
|
|
section 7
|
|
</a>
|
|
for specific requirements for this scenario.
|
|
</p>
|
|
<h3 id="3_1_1_android_extensions">
|
|
3.1.1. Android Extensions
|
|
</h3>
|
|
<p>
|
|
Android includes the support of extending the managed APIs while keeping the same API
|
|
level version. Android device implementations MUST preload the AOSP implementation
|
|
of both the shared library
|
|
<code>
|
|
ExtShared
|
|
</code>
|
|
and services
|
|
<code>
|
|
ExtServices
|
|
</code>
|
|
with versions higher
|
|
than or equal to the minimum versions allowed per each API level.
|
|
For example, Android 7.0 device implementations, running API level 24 MUST include
|
|
at least version 1.
|
|
</p>
|
|
<h3 id="3_2_soft_api_compatibility">
|
|
3.2. Soft API Compatibility
|
|
</h3>
|
|
<p>
|
|
In addition to the managed APIs from
|
|
<a href="#3_1_managed_api_compatibility">
|
|
section 3.1
|
|
</a>,
|
|
Android also includes a significant runtime-only “soft” API, in the form of such
|
|
things as intents, permissions, and similar aspects of Android applications that
|
|
cannot be enforced at application compile time.
|
|
</p>
|
|
<h4 id="3_2_1_permissions">
|
|
3.2.1. Permissions
|
|
</h4>
|
|
<p>
|
|
Device implementers MUST support and enforce all permission constants as
|
|
documented by the
|
|
<a href="http://developer.android.com/reference/android/Manifest.permission.html">
|
|
Permission reference page
|
|
</a>.
|
|
Note that
|
|
<a href="#9_security_model_compatibility">
|
|
section 9
|
|
</a>
|
|
lists additional
|
|
requirements related to the Android security model.
|
|
</p>
|
|
<h4 id="3_2_2_build_parameters">
|
|
3.2.2. Build Parameters
|
|
</h4>
|
|
<p>
|
|
The Android APIs include a number of constants on the
|
|
<a href="http://developer.android.com/reference/android/os/Build.html">
|
|
android.os.Build class
|
|
</a>
|
|
that are intended to describe the current device. To provide consistent,
|
|
meaningful values across device implementations, the table below includes
|
|
additional restrictions on the formats of these values to which device
|
|
implementations MUST conform.
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Parameter
|
|
</th>
|
|
<th>
|
|
Details
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VERSION.RELEASE
|
|
</td>
|
|
<td>
|
|
The version of the currently-executing Android system, in human-readable
|
|
format. This field MUST have one of the string values defined in
|
|
<a href="http://source.android.com/compatibility/7.1/versions.html">
|
|
7.1
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VERSION.SDK
|
|
</td>
|
|
<td>
|
|
The version of the currently-executing Android system, in a format
|
|
accessible to third-party application code. For Android 7.1,
|
|
this field MUST have the integer value 7.1_INT.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VERSION.SDK_INT
|
|
</td>
|
|
<td>
|
|
The version of the currently-executing Android system, in a format
|
|
accessible to third-party application code. For Android 7.1,
|
|
this field MUST have the integer value 7.1_INT.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VERSION.INCREMENTAL
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer designating the specific build
|
|
of the currently-executing Android system, in human-readable format. This
|
|
value MUST NOT be reused for different builds made available to end users. A
|
|
typical use of this field is to indicate which build number or
|
|
source-control change identifier was used to generate the build. There are
|
|
no requirements on the specific format of this field, except that it MUST
|
|
NOT be null or the empty string ("").
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
BOARD
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer identifying the specific
|
|
internal hardware used by the device, in human-readable format. A possible
|
|
use of this field is to indicate the specific revision of the board powering
|
|
the device. The value of this field MUST be encodable as 7-bit ASCII and
|
|
match the regular expression “^[a-zA-Z0-9_-]+$”.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
BRAND
|
|
</td>
|
|
<td>
|
|
A value reflecting the brand name associated with the device as known to
|
|
the end users. MUST be in human-readable format and SHOULD represent the
|
|
manufacturer of the device or the company brand under which the device is
|
|
marketed. The value of this field MUST be encodable as 7-bit ASCII and match
|
|
the regular expression “^[a-zA-Z0-9_-]+$”.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
SUPPORTED_ABIS
|
|
</td>
|
|
<td>
|
|
The name of the instruction set (CPU type + ABI convention) of native
|
|
code. See
|
|
<a href="#3_3_native_api_compatibility">
|
|
section 3.3. Native API
|
|
Compatibility
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
SUPPORTED_32_BIT_ABIS
|
|
</td>
|
|
<td>
|
|
The name of the instruction set (CPU type + ABI convention) of native
|
|
code. See
|
|
<a href="#3_3_native_api_compatibility">
|
|
section 3.3. Native API
|
|
Compatibility
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
SUPPORTED_64_BIT_ABIS
|
|
</td>
|
|
<td>
|
|
The name of the second instruction set (CPU type + ABI convention) of
|
|
native code. See
|
|
<a href="#3_3_native_api_compatibility">
|
|
section 3.3. Native
|
|
API Compatibility
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
CPU_ABI
|
|
</td>
|
|
<td>
|
|
The name of the instruction set (CPU type + ABI convention) of native
|
|
code. See
|
|
<a href="#3_3_native_api_compatibility">
|
|
section 3.3. Native API
|
|
Compatibility
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
CPU_ABI2
|
|
</td>
|
|
<td>
|
|
The name of the second instruction set (CPU type + ABI convention) of
|
|
native code. See
|
|
<a href="#3_3_native_api_compatibility">
|
|
section 3.3. Native
|
|
API Compatibility
|
|
</a>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
DEVICE
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer containing the development name
|
|
or code name identifying the configuration of the hardware features and
|
|
industrial design of the device. The value of this field MUST be encodable
|
|
as 7-bit ASCII and match the regular expression
|
|
“^[a-zA-Z0-9_-]+$”. This device name MUST NOT change during the
|
|
lifetime of the product.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
FINGERPRINT
|
|
</td>
|
|
<td>
|
|
A string that uniquely identifies this build. It SHOULD be reasonably
|
|
human-readable. It MUST follow this template:
|
|
<p class="small">
|
|
$(BRAND)/$(PRODUCT)/
|
|
<br/>
|
|
$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)
|
|
</p>
|
|
<p>
|
|
For example:
|
|
</p>
|
|
<p class="small">
|
|
acme/myproduct/
|
|
<br/>
|
|
mydevice:7.1/LMYXX/3359:userdebug/test-keys
|
|
</p>
|
|
<p>
|
|
The fingerprint MUST NOT include whitespace characters. If other fields
|
|
included in the template above have whitespace characters, they MUST be
|
|
replaced in the build fingerprint with another character, such as the
|
|
underscore ("_") character. The value of this field MUST be encodable as
|
|
7-bit ASCII.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
HARDWARE
|
|
</td>
|
|
<td>
|
|
The name of the hardware (from the kernel command line or /proc). It
|
|
SHOULD be reasonably human-readable. The value of this field MUST be
|
|
encodable as 7-bit ASCII and match the regular expression
|
|
“^[a-zA-Z0-9_-]+$”.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
HOST
|
|
</td>
|
|
<td>
|
|
A string that uniquely identifies the host the build was built on, in
|
|
human-readable format. There are no requirements on the specific format of
|
|
this field, except that it MUST NOT be null or the empty string ("").
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
ID
|
|
</td>
|
|
<td>
|
|
An identifier chosen by the device implementer to refer to a specific
|
|
release, in human-readable format. This field can be the same as
|
|
android.os.Build.VERSION.INCREMENTAL, but SHOULD be a value sufficiently
|
|
meaningful for end users to distinguish between software builds. The value
|
|
of this field MUST be encodable as 7-bit ASCII and match the regular
|
|
expression “^[a-zA-Z0-9._-]+$”.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MANUFACTURER
|
|
</td>
|
|
<td>
|
|
The trade name of the Original Equipment Manufacturer (OEM) of the
|
|
product. There are no requirements on the specific format of this field,
|
|
except that it MUST NOT be null or the empty string ("").
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MODEL
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer containing the name of the
|
|
device as known to the end user. This SHOULD be the same name under which
|
|
the device is marketed and sold to end users. There are no requirements on
|
|
the specific format of this field, except that it MUST NOT be null or the
|
|
empty string ("").
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PRODUCT
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer containing the development name
|
|
or code name of the specific product (SKU) that MUST be unique within the
|
|
same brand. MUST be human-readable, but is not necessarily intended for view
|
|
by end users. The value of this field MUST be encodable as 7-bit ASCII and
|
|
match the regular expression “^[a-zA-Z0-9_-]+$”. This product
|
|
name MUST NOT change during the lifetime of the product.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
SERIAL
|
|
</td>
|
|
<td>
|
|
A hardware serial number, which MUST be available and unique across
|
|
devices with the same MODEL and MANUFACTURER. The value of this field MUST
|
|
be encodable as 7-bit ASCII and match the regular expression
|
|
“^([a-zA-Z0-9]{6,20})$”.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
TAGS
|
|
</td>
|
|
<td>
|
|
A comma-separated list of tags chosen by the device implementer that
|
|
further distinguishes the build. This field MUST have one of the values
|
|
corresponding to the three typical Android platform signing configurations:
|
|
release-keys, dev-keys, test-keys.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
TIME
|
|
</td>
|
|
<td>
|
|
A value representing the timestamp of when the build occurred.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
TYPE
|
|
</td>
|
|
<td>
|
|
A value chosen by the device implementer specifying the runtime
|
|
configuration of the build. This field MUST have one of the values
|
|
corresponding to the three typical Android runtime configurations: user,
|
|
userdebug, or eng.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
USER
|
|
</td>
|
|
<td>
|
|
A name or user ID of the user (or automated user) that generated the
|
|
build. There are no requirements on the specific format of this field,
|
|
except that it MUST NOT be null or the empty string ("").
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
SECURITY_PATCH
|
|
</td>
|
|
<td>
|
|
A value indicating the security patch level of a build. It MUST signify
|
|
that the build is not in any way vulnerable to any of the issues described
|
|
up through the designated Android Public Security Bulletin. It MUST be in
|
|
the format [YYYY-MM-DD], matching a defined string documented in the
|
|
<a href="source.android.com/security/bulletin">
|
|
Android Public Security
|
|
Bulletin
|
|
</a>
|
|
or in the
|
|
<a href="http://source.android.com/security/advisory">
|
|
Android Security Advisory
|
|
</a>, for example "2015-11-01".
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
BASE_OS
|
|
</td>
|
|
<td>
|
|
A value representing the FINGERPRINT parameter of the build that is
|
|
otherwise identical to this build except for the patches provided in the
|
|
Android Public Security Bulletin. It MUST report the correct value and if
|
|
such a build does not exist, report an empty string ("").
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h4 id="3_2_3_intent_compatibility">
|
|
3.2.3. Intent Compatibility
|
|
</h4>
|
|
<h5 id="3_2_3_1_core_application_intents">
|
|
3.2.3.1. Core Application Intents
|
|
</h5>
|
|
<p>
|
|
Android intents allow application components to request functionality from
|
|
other Android components. The Android upstream project includes a list of
|
|
applications considered core Android applications, which implements several
|
|
intent patterns to perform common actions. The core Android applications are:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Desk Clock
|
|
</li>
|
|
<li>
|
|
Browser
|
|
</li>
|
|
<li>
|
|
Calendar
|
|
</li>
|
|
<li>
|
|
Contacts
|
|
</li>
|
|
<li>
|
|
Gallery
|
|
</li>
|
|
<li>
|
|
GlobalSearch
|
|
</li>
|
|
<li>
|
|
Launcher
|
|
</li>
|
|
<li>
|
|
Music
|
|
</li>
|
|
<li>
|
|
Settings
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations MUST include the core Android applications as
|
|
appropriate or a component implementing the same intent patterns defined by
|
|
all the Activity or Service components of these core Android applications
|
|
exposed to other applications, implicitly or explicitly, through the
|
|
<code>
|
|
android:exported
|
|
</code>
|
|
attribute.
|
|
</p>
|
|
<h5 id="3_2_3_2_intent_resolution">
|
|
3.2.3.2. Intent Resolution
|
|
</h5>
|
|
<p>
|
|
As Android is an extensible platform, device implementations MUST allow each
|
|
intent pattern referenced in
|
|
<a href="#3_2_3_1_core_application_intents">
|
|
section 3.2.3.1
|
|
</a>
|
|
to be overridden by third-party
|
|
applications. The upstream Android open source implementation allows this by
|
|
default; device implementers MUST NOT attach special privileges to system
|
|
applications' use of these intent patterns, or prevent third-party applications
|
|
from binding to and assuming control of these patterns. This prohibition
|
|
specifically includes but is not limited to disabling the “Chooser” user
|
|
interface that allows the user to select between multiple applications that all
|
|
handle the same intent pattern.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST provide a user interface for users to modify the
|
|
default activity for intents.
|
|
</p>
|
|
<p>
|
|
However, device implementations MAY provide default activities for specific URI
|
|
patterns (e.g. http://play.google.com) when the default activity provides a
|
|
more specific attribute for the data URI. For example, an intent filter pattern
|
|
specifying the data URI “http://www.android.com” is more specific than the
|
|
browser's core intent pattern for “http://”.
|
|
</p>
|
|
<p>
|
|
Android also includes a mechanism for third-party apps to declare an
|
|
authoritative default
|
|
<a href="https://developer.android.com/training/app-links">
|
|
app linking behavior
|
|
</a>
|
|
for certain types of web URI intents. When such authoritative declarations are
|
|
defined in an app's intent filter patterns, device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST attempt to validate any intent filters by performing the validation
|
|
steps defined in the
|
|
<a href="https://developers.google.com/digital-asset-links">
|
|
Digital Asset Links specification
|
|
</a>
|
|
as implemented by the Package Manager in the upstream Android Open Source
|
|
Project.
|
|
</li>
|
|
<li>
|
|
MUST attempt validation of the intent filters during the installation of
|
|
the application and set all successfully validated UIR intent filters as
|
|
default app handlers for their UIRs.
|
|
</li>
|
|
<li>
|
|
MAY set specific URI intent filters as default app handlers for their URIs,
|
|
if they are successfully verified but other candidate URI filters fail
|
|
verification. If a device implementation does this, it MUST provide the
|
|
user appropriate per-URI pattern overrides in the settings menu.
|
|
</li>
|
|
<li>
|
|
MUST provide the user with per-app App Links controls in Settings as
|
|
follows:
|
|
<ul>
|
|
<li>
|
|
The user MUST be able to override holistically the default app links
|
|
behavior for an app to be: always open, always ask, or never open,
|
|
which must apply to all candidate URI intent filters equally.
|
|
</li>
|
|
<li>
|
|
The user MUST be able to see a list of the candidate URI intent filters.
|
|
</li>
|
|
<li>
|
|
The device implementation MAY provide the user with the ability to
|
|
override specific candidate URI intent filters that were successfully
|
|
verified, on a per-intent filter basis.
|
|
</li>
|
|
<li>
|
|
The device implementation MUST provide users with the ability to view
|
|
and override specific candidate URI intent filters if the device
|
|
implementation lets some candidate URI intent filters succeed
|
|
verification while some others can fail.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h5 id="3_2_3_3_intent_namespaces">
|
|
3.2.3.3. Intent Namespaces
|
|
</h5>
|
|
<p>
|
|
Device implementations MUST NOT include any Android component that honors any
|
|
new intent or broadcast intent patterns using an ACTION, CATEGORY, or other key
|
|
string in the android.
|
|
<em>
|
|
or com.android.
|
|
</em>
|
|
namespace. Device implementers MUST
|
|
NOT include any Android components that honor any new intent or broadcast
|
|
intent patterns using an ACTION, CATEGORY, or other key string in a package
|
|
space belonging to another organization. Device implementers MUST NOT alter or
|
|
extend any of the intent patterns used by the core apps listed in
|
|
<a href="#3_2_3_1_core_application_intents">
|
|
section 3.2.3.1
|
|
</a>. Device implementations MAY
|
|
include intent patterns using namespaces clearly and obviously associated with
|
|
their own organization. This prohibition is analogous to that specified for Java
|
|
language classes in
|
|
<a href="#3_6_api_namespaces">
|
|
section 3.6
|
|
</a>.
|
|
</p>
|
|
<h5 id="3_2_3_4_broadcast_intents">
|
|
3.2.3.4. Broadcast Intents
|
|
</h5>
|
|
<p>
|
|
Third-party applications rely on the platform to broadcast certain intents to
|
|
notify them of changes in the hardware or software environment.
|
|
Android-compatible devices MUST broadcast the public broadcast intents in
|
|
response to appropriate system events. Broadcast intents are described in the
|
|
SDK documentation.
|
|
</p>
|
|
<h5 id="3_2_3_5_default_app_settings">
|
|
3.2.3.5. Default App Settings
|
|
</h5>
|
|
<p>
|
|
Android includes settings that provide users an easy way to select their
|
|
default applications, for example for Home screen or SMS. Where it makes sense,
|
|
device implementations MUST provide a similar settings menu and be compatible
|
|
with the intent filter pattern and API methods described in the SDK
|
|
documentation as below.
|
|
</p>
|
|
<p>
|
|
Device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST honor the
|
|
<a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_HOME_SETTINGS">
|
|
android.settings.HOME_SETTINGS
|
|
</a>
|
|
intent to show a default app settings menu for Home Screen, if the device
|
|
implementation reports android.software.home_screen.
|
|
</li>
|
|
<li>
|
|
MUST provide a settings menu that will call the
|
|
<a href="http://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html">
|
|
android.provider.Telephony.ACTION_CHANGE_DEFAULT
|
|
</a>
|
|
intent to show a dialog to change the default SMS application, if the
|
|
device implementation reports android.hardware.telephony.
|
|
</li>
|
|
<li>
|
|
MUST honor the
|
|
<a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFC_PAYMENT_SETTINGS">
|
|
android.settings.NFC_PAYMENT_SETTINGS
|
|
</a>
|
|
intent to show a default app settings menu for Tap and Pay, if the device
|
|
implementation reports android.hardware.nfc.hce.
|
|
</li>
|
|
<li>
|
|
MUST honor the
|
|
<a href="https://developer.android.com/reference/android/telecom/TelecomManager.html#ACTION_CHANGE_DEFAULT_DIALER">
|
|
android.telecom.action.CHANGE_DEFAULT_DIALER
|
|
</a>
|
|
intent to show a dialog to allow the user to change the default Phone application, if the
|
|
device implementation reports
|
|
<code>
|
|
android.hardware.telephony
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
MUST honor the
|
|
<a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_VOICE_INPUT_SETTINGS">
|
|
android.settings.ACTION_VOICE_INPUT_SETTINGS
|
|
</a>
|
|
intent when the device supports the VoiceInteractionService and show a
|
|
default app settings menu for voice input and assist.
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_3_native_api_compatibility">
|
|
3.3. Native API Compatibility
|
|
</h3>
|
|
<p>
|
|
Native code compatibility is challenging. For this reason, device implementers
|
|
are
|
|
<strong>
|
|
STRONGLY RECOMMENDED
|
|
</strong>
|
|
to use the implementations of the libraries listed
|
|
below from the upstream Android Open Source Project.
|
|
</p>
|
|
<h4 id="3_3_1_application_binary_interfaces">
|
|
3.3.1. Application Binary Interfaces
|
|
</h4>
|
|
<p>
|
|
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 MUST be compatible with one or more
|
|
defined ABIs, and MUST implement compatibility with the Android NDK, as below.
|
|
</p>
|
|
<p>
|
|
If a device implementation includes support for an Android ABI, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST include support for code running in the managed environment to call
|
|
into native code, using the standard Java Native Interface (JNI) semantics.
|
|
</li>
|
|
<li>
|
|
MUST be source-compatible (i.e. header compatible) and binary-compatible
|
|
(for the ABI) with each required library in the list below.
|
|
</li>
|
|
<li>
|
|
MUST support the equivalent 32-bit ABI if any 64-bit ABI is supported.
|
|
</li>
|
|
<li>
|
|
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.
|
|
</li>
|
|
<li>
|
|
MUST report, via the above parameters, only those ABIs documented and
|
|
described in the latest version of the
|
|
<a href="https://developer.android.com/ndk/guides/abis.html">
|
|
Android NDK ABI Management documentation
|
|
</a>, and MUST
|
|
include support for the
|
|
<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388f/Beijfcja.html">
|
|
Advanced SIMD
|
|
</a>
|
|
(a.k.a. NEON) extension.
|
|
</li>
|
|
<li>
|
|
SHOULD be built using the source code and header files available in the
|
|
upstream Android Open Source Project
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Note that future releases of the Android NDK may introduce support for
|
|
additional ABIs. If a device implementation is not compatible with an existing
|
|
predefined ABI, it MUST NOT report support for any ABIs at all.
|
|
</p>
|
|
<p>
|
|
The following native code APIs MUST be available to apps that include native code:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
libandroid.so (native Android activity support)
|
|
</li>
|
|
<li>
|
|
libc (C library)
|
|
</li>
|
|
<li>
|
|
libcamera2ndk.so
|
|
</li>
|
|
<li>
|
|
libdl (dynamic linker)
|
|
</li>
|
|
<li>
|
|
libEGL.so (native OpenGL surface management)
|
|
</li>
|
|
<li>
|
|
libGLESv1_CM.so (OpenGL ES 1.x)
|
|
</li>
|
|
<li>
|
|
libGLESv2.so (OpenGL ES 2.0)
|
|
</li>
|
|
<li>
|
|
libGLESv3.so (OpenGL ES 3.x)
|
|
</li>
|
|
<li>
|
|
libicui18n.so
|
|
</li>
|
|
<li>
|
|
libicuuc.so
|
|
</li>
|
|
<li>
|
|
libjnigraphics.so
|
|
</li>
|
|
<li>
|
|
liblog (Android logging)
|
|
</li>
|
|
<li>
|
|
libmediandk.so (native media APIs support)
|
|
</li>
|
|
<li>
|
|
libm (math library)
|
|
</li>
|
|
<li>
|
|
libOpenMAXAL.so (OpenMAX AL 1.0.1 support)
|
|
</li>
|
|
<li>
|
|
libOpenSLES.so (OpenSL ES 1.0.1 audio support)
|
|
</li>
|
|
<li>
|
|
libRS.so
|
|
</li>
|
|
<li>
|
|
libstdc++ (Minimal support for C++)
|
|
</li>
|
|
<li>
|
|
libvulkan.so (Vulkan)
|
|
</li>
|
|
<li>
|
|
libz (Zlib compression)
|
|
</li>
|
|
<li>
|
|
JNI interface
|
|
</li>
|
|
<li>
|
|
Support for OpenGL, as described below
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
For the native libraries listed above, the device implementation MUST NOT add
|
|
or remove the public functions.
|
|
</p>
|
|
<p>
|
|
Native libraries not listed above but implemented and provided in AOSP as system
|
|
libraries are reserved and MUST NOT be exposed to third-party apps targeting API
|
|
level 24 or higher.
|
|
</p>
|
|
<p>
|
|
Device implementations MAY add non-AOSP libraries and expose them directly as
|
|
an API to third-party apps but the additional libraries SHOULD be in
|
|
<code>
|
|
/vendor/lib
|
|
</code>
|
|
or
|
|
<code>
|
|
/vendor/lib64
|
|
</code>
|
|
and MUST be listed in
|
|
<code>
|
|
/vendor/etc/public.libraries.txt
|
|
</code>
|
|
.
|
|
</p>
|
|
<p>
|
|
Note that device implementations MUST include libGLESv3.so and in turn, MUST export
|
|
all the OpenGL ES 3.1 and
|
|
<a href="http://developer.android.com/guide/topics/graphics/opengl.html#aep">
|
|
Android Extension Pack
|
|
</a>
|
|
function symbols as defined in the NDK release android-24. Although all the
|
|
symbols must be present, only the corresponding functions for OpenGL ES versions
|
|
and extensions actually supported by the device must be fully implemented.
|
|
</p>
|
|
<h5 id="3_3_1_1_graphic_libraries">
|
|
3.3.1.1. Graphic Libraries
|
|
</h5>
|
|
<p>
|
|
<a href="https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/xhtml/vkspec.html">
|
|
Vulkan
|
|
</a>
|
|
is a low-overhead, cross-platform API for high-performance 3D graphics. Device
|
|
implementations, even if not including support of the Vulkan APIs, MUST satisfy
|
|
the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
It MUST always provide a native library named
|
|
<code>
|
|
libvulkan.so
|
|
</code>
|
|
which exports
|
|
function symbols for the core Vulkan 1.0 API as well as the
|
|
<code>
|
|
VK_KHR_surface
|
|
</code>
|
|
,
|
|
<code>
|
|
VK_KHR_android_surface
|
|
</code>
|
|
, and
|
|
<code>
|
|
VK_KHR_swapchain
|
|
</code>
|
|
extensions.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations, if including support of the Vulkan APIs:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report, one or more
|
|
<code>
|
|
VkPhysicalDevices
|
|
</code>
|
|
through the
|
|
<code>
|
|
vkEnumeratePhysicalDevices
|
|
</code>
|
|
call.
|
|
</li>
|
|
<li>
|
|
Each enumerated
|
|
<code>
|
|
VkPhysicalDevices
|
|
</code>
|
|
MUST fully implement the Vulkan 1.0 API.
|
|
</li>
|
|
<li>
|
|
MUST report the correct
|
|
<a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_VULKAN_HARDWARE_LEVEL">
|
|
<code>
|
|
PackageManager#FEATURE_VULKAN_HARDWARE_LEVEL
|
|
</code>
|
|
</a>
|
|
and
|
|
<a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_VULKAN_HARDWARE_VERSION">
|
|
<code>
|
|
PackageManager#FEATURE_VULKAN_HARDWARE_VERSION
|
|
</code>
|
|
</a>
|
|
feature flags.
|
|
</li>
|
|
<li>
|
|
MUST enumerate layers, contained in native libraries named
|
|
<code>
|
|
libVkLayer*.so
|
|
</code>
|
|
in the application package’s native library directory, through the
|
|
<code>
|
|
vkEnumerateInstanceLayerProperties
|
|
</code>
|
|
and
|
|
<code>
|
|
vkEnumerateDeviceLayerProperties
|
|
</code>
|
|
functions in
|
|
<code>
|
|
libvulkan.so
|
|
</code>
|
|
</li>
|
|
<li>
|
|
MUST NOT enumerate layers provided by libraries outside of the application
|
|
package, or provide other ways of tracing or intercepting the Vulkan API,
|
|
unless the application has the
|
|
<code>
|
|
android:debuggable=”true”
|
|
</code>
|
|
attribute.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations, if not including support of the Vulkan APIs:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report 0
|
|
<code>
|
|
VkPhysicalDevices
|
|
</code>
|
|
through the
|
|
<code>
|
|
vkEnumeratePhysicalDevices
|
|
</code>
|
|
call.
|
|
</li>
|
|
<li>
|
|
MUST NOT declare any of the Vulkan feature flags
|
|
<a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_VULKAN_HARDWARE_LEVEL">
|
|
<code>
|
|
PackageManager#FEATURE_VULKAN_HARDWARE_LEVEL
|
|
</code>
|
|
</a>
|
|
and
|
|
<a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_VULKAN_HARDWARE_VERSION">
|
|
<code>
|
|
PackageManager#FEATURE_VULKAN_HARDWARE_VERSION
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<h4 id="3_3_2_32-bit_arm_native_code_compatibility">
|
|
3.3.2. 32-bit ARM Native Code Compatibility
|
|
</h4>
|
|
<p>
|
|
The ARMv8 architecture deprecates several CPU operations, including some
|
|
operations used in existing native code. On 64-bit ARM devices, the following
|
|
deprecated operations MUST remain available to 32-bit native ARM code, either
|
|
through native CPU support or through software emulation:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SWP and SWPB instructions
|
|
</li>
|
|
<li>
|
|
SETEND instruction
|
|
</li>
|
|
<li>
|
|
CP15ISB, CP15DSB, and CP15DMB barrier operations
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Legacy versions of the Android NDK used /proc/cpuinfo to discover CPU features
|
|
from 32-bit ARM native code. For compatibility with applications built using
|
|
this NDK, devices MUST include the following lines in /proc/cpuinfo when it is
|
|
read by 32-bit ARM applications:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
"Features: ", followed by a list of any optional ARMv7 CPU features supported by the device.
|
|
</li>
|
|
<li>
|
|
"CPU architecture: ", followed by an integer describing the device's highest
|
|
supported ARM architecture (e.g., "8" for ARMv8 devices).
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
These requirements only apply when /proc/cpuinfo is read by 32-bit ARM
|
|
applications. Devices SHOULD not alter /proc/cpuinfo when read by 64-bit ARM or
|
|
non-ARM applications.
|
|
</p>
|
|
<h3 id="3_4_web_compatibility">
|
|
3.4. Web Compatibility
|
|
</h3>
|
|
<h4 id="3_4_1_webview_compatibility">
|
|
3.4.1. WebView Compatibility
|
|
</h4>
|
|
<div class="note">
|
|
Android Watch devices MAY, but all other device implementations MUST provide a
|
|
complete implementation of the android.webkit.Webview API.
|
|
</div>
|
|
<p>
|
|
The platform feature android.software.webview MUST be reported on any device
|
|
that provides a complete implementation of the android.webkit.WebView API, and
|
|
MUST NOT be reported on devices without a complete implementation of the API.
|
|
The Android Open Source implementation uses code from the Chromium Project to
|
|
implement the
|
|
<a href="http://developer.android.com/reference/android/webkit/WebView.html">
|
|
android.webkit.WebView
|
|
</a>.
|
|
Because it is not feasible to develop a comprehensive test suite for a web
|
|
rendering system, device implementers MUST use the specific upstream build of
|
|
Chromium in the WebView implementation. Specifically:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device android.webkit.WebView implementations MUST be based on the
|
|
<a href="http://www.chromium.org/">
|
|
Chromium
|
|
</a>
|
|
build from the upstream Android Open
|
|
Source Project for Android 7.1. This build includes a specific
|
|
set of functionality and security fixes for the WebView.
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The user agent string reported by the WebView MUST be in this format:
|
|
</p>
|
|
<p>
|
|
Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD); wv)
|
|
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile
|
|
Safari/537.36
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The value of the $(VERSION) string MUST be the same as the value for android.os.Build.VERSION.RELEASE.
|
|
</li>
|
|
<li>
|
|
The value of the $(MODEL) string MUST be the same as the value for android.os.Build.MODEL.
|
|
</li>
|
|
<li>
|
|
The value of the $(BUILD) string MUST be the same as the value for android.os.Build.ID.
|
|
</li>
|
|
<li>
|
|
The value of the $(CHROMIUM_VER) string MUST be the version of Chromium in the upstream Android Open Source Project.
|
|
</li>
|
|
<li>
|
|
Device implementations MAY omit Mobile in the user agent string.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The WebView component SHOULD include support for as many HTML5 features as
|
|
possible and if it supports the feature SHOULD conform to the
|
|
<a href="http://html.spec.whatwg.org/multipage/">
|
|
HTML5 specification
|
|
</a>.
|
|
</p>
|
|
<h4 id="3_4_2_browser_compatibility">
|
|
3.4.2. Browser Compatibility
|
|
</h4>
|
|
<div class="note">
|
|
Android Television, Watch, and Android Automotive implementations MAY omit a
|
|
browser application, but MUST support the public intent patterns as described in
|
|
<a href="#3_2_3_1_core_application_intents">
|
|
section 3.2.3.1
|
|
</a>. All other types of device
|
|
implementations MUST include a standalone Browser application for general user
|
|
web browsing.
|
|
</div>
|
|
<p>
|
|
The standalone Browser MAY be based on a browser technology other than WebKit.
|
|
However, even if an alternate Browser application is used, the
|
|
android.webkit.WebView component provided to third-party applications MUST be
|
|
based on WebKit, as described in
|
|
<a href="#3_4_1_webview_compatibility">
|
|
section 3.4.1
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Implementations MAY ship a custom user agent string in the standalone Browser application.
|
|
</p>
|
|
<p>
|
|
The standalone Browser application (whether based on the upstream WebKit Browser
|
|
application or a third-party replacement) SHOULD include support for as much of
|
|
<a href="http://html.spec.whatwg.org/multipage/">
|
|
HTML5
|
|
</a>
|
|
as possible. Minimally, device
|
|
implementations MUST support each of these APIs associated with HTML5:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<a href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#offline">
|
|
application cache/offline operation
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="http://www.w3.org/html/wg/drafts/html/master/semantics.html#video">
|
|
<video> tag
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="http://www.w3.org/TR/geolocation-API/">
|
|
geolocation
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Additionally, device implementations MUST support the HTML5/W3C
|
|
<a href="http://www.w3.org/TR/webstorage/">
|
|
webstorage API
|
|
</a>
|
|
and SHOULD support the HTML5/W3C
|
|
<a href="http://www.w3.org/TR/IndexedDB/">
|
|
IndexedDB API
|
|
</a>. Note that as the web
|
|
development standards bodies are transitioning to favor IndexedDB over
|
|
webstorage, IndexedDB is expected to become a required component in a future
|
|
version of Android.
|
|
</p>
|
|
<h3 id="3_5_api_behavioral_compatibility">
|
|
3.5. API Behavioral Compatibility
|
|
</h3>
|
|
<p>
|
|
The behaviors of each of the API types (managed, soft, native, and web) must be
|
|
consistent with the preferred implementation of the upstream
|
|
<a href="http://source.android.com/">
|
|
Android Open Source Project
|
|
</a>. Some specific areas of
|
|
compatibility are:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Devices MUST NOT change the behavior or semantics of a standard intent.
|
|
</li>
|
|
<li>
|
|
Devices MUST NOT alter the lifecycle or lifecycle semantics of a particular
|
|
type of system component (such as Service, Activity, ContentProvider, etc.).
|
|
</li>
|
|
<li>
|
|
Devices MUST NOT change the semantics of a standard permission.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The above list is not comprehensive. The Compatibility Test Suite (CTS) tests
|
|
significant portions of the platform for behavioral compatibility, but not all.
|
|
It is the responsibility of the implementer to ensure behavioral compatibility
|
|
with the Android Open Source Project. For this reason, device implementers
|
|
SHOULD use the source code available via the Android Open Source Project where
|
|
possible, rather than re-implement significant parts of the system.
|
|
</p>
|
|
<h3 id="3_6_api_namespaces">
|
|
3.6. API Namespaces
|
|
</h3>
|
|
<p>
|
|
Android follows the package and class namespace conventions defined by the Java
|
|
programming language. To ensure compatibility with third-party applications,
|
|
device implementers MUST NOT make any prohibited modifications (see below) to
|
|
these package namespaces:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
java.*
|
|
</li>
|
|
<li>
|
|
javax.*
|
|
</li>
|
|
<li>
|
|
sun.*
|
|
</li>
|
|
<li>
|
|
android.*
|
|
</li>
|
|
<li>
|
|
com.android.*
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
<strong>
|
|
Prohibited modifications include
|
|
</strong>
|
|
:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST NOT modify the publicly exposed APIs on the
|
|
Android platform by changing any method or class signatures, or by removing
|
|
classes or class fields.
|
|
</li>
|
|
<li>
|
|
Device implementers MAY modify the underlying implementation of the APIs,
|
|
but such modifications MUST NOT impact the stated behavior and Java-language
|
|
signature of any publicly exposed APIs.
|
|
</li>
|
|
<li>
|
|
Device implementers MUST NOT add any publicly exposed elements (such as
|
|
classes or interfaces, or fields or methods to existing classes or
|
|
interfaces) to the APIs above.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
A “publicly exposed element” is any construct that is not decorated with
|
|
the“@hide” marker as used in the upstream Android source code. In other words,
|
|
device implementers MUST NOT expose new APIs or alter existing APIs in the
|
|
namespaces noted above. Device implementers MAY make internal-only
|
|
modifications, but those modifications MUST NOT be advertised or otherwise
|
|
exposed to developers.
|
|
</p>
|
|
<p>
|
|
Device implementers MAY add custom APIs, but any such APIs MUST NOT be in a
|
|
namespace owned by or referring to another organization. For instance, device
|
|
implementers MUST NOT add APIs to the com.google.* or similar namespace: only
|
|
Google may do so. Similarly, Google MUST NOT add APIs to other companies'
|
|
namespaces. Additionally, if a device implementation includes custom APIs
|
|
outside the standard Android namespace, those APIs MUST be packaged in an
|
|
Android shared library so that only apps that explicitly use them (via the
|
|
<uses-library> mechanism) are affected by the increased memory usage of such
|
|
APIs.
|
|
</p>
|
|
<p>
|
|
If a device implementer proposes to improve one of the package namespaces above
|
|
(such as by adding useful new functionality to an existing API, or adding a new
|
|
API), the implementer SHOULD visit
|
|
<a href="http://source.android.com/">
|
|
source.android.com
|
|
</a>
|
|
and begin the process for
|
|
contributing changes and code, according to the information on that site.
|
|
</p>
|
|
<p>
|
|
Note that the restrictions above correspond to standard conventions for naming
|
|
APIs in the Java programming language; this section simply aims to reinforce
|
|
those conventions and make them binding through inclusion in this Compatibility
|
|
Definition.
|
|
</p>
|
|
<h3 id="3_7_runtime_compatibility">
|
|
3.7. Runtime Compatibility
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST support the full Dalvik Executable (DEX) format and
|
|
<a href="https://android.googlesource.com/platform/dalvik/">
|
|
Dalvik bytecode specification and semantics
|
|
</a>.
|
|
Device implementers SHOULD use ART, the reference upstream implementation of the Dalvik
|
|
Executable Format, and the reference implementation’s package management system.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST configure Dalvik runtimes to allocate memory in
|
|
accordance with the upstream Android platform, and as specified by the following
|
|
table. (See
|
|
<a href="#7_1_1_screen_configuration">
|
|
section 7.1.1
|
|
</a>
|
|
for screen size and
|
|
screen density definitions.) Note that memory values specified below are
|
|
considered minimum values and device implementations MAY allocate more memory
|
|
per application.
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Screen Layout
|
|
</th>
|
|
<th>
|
|
Screen Density
|
|
</th>
|
|
<th>
|
|
Minimum Application Memory
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="12">
|
|
Android Watch
|
|
</td>
|
|
<td>
|
|
120 dpi (ldpi)
|
|
</td>
|
|
<td rowspan="3">
|
|
32MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
160 dpi (mdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
213 dpi (tvdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
240 dpi (hdpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
36MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
280 dpi (280dpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
320 dpi (xhdpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
48MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
360 dpi (360dpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
400 dpi (400dpi)
|
|
</td>
|
|
<td>
|
|
56MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
420 dpi (420dpi)
|
|
</td>
|
|
<td>
|
|
64MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
480 dpi (xxhdpi)
|
|
</td>
|
|
<td>
|
|
88MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
560 dpi (560dpi)
|
|
</td>
|
|
<td>
|
|
112MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
640 dpi (xxxhdpi)
|
|
</td>
|
|
<td>
|
|
154MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="12">
|
|
small/normal
|
|
</td>
|
|
<td>
|
|
120 dpi (ldpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
32MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
160 dpi (mdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
213 dpi (tvdpi)
|
|
</td>
|
|
<td rowspan="3">
|
|
48MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
240 dpi (hdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
280 dpi (280dpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
320 dpi (xhdpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
80MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
360 dpi (360dpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
400 dpi (400dpi)
|
|
</td>
|
|
<td>
|
|
96MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
420 dpi (420dpi)
|
|
</td>
|
|
<td>
|
|
112MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
480 dpi (xxhdpi)
|
|
</td>
|
|
<td>
|
|
128MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
560 dpi (560dpi)
|
|
</td>
|
|
<td>
|
|
192MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
640 dpi (xxxhdpi)
|
|
</td>
|
|
<td>
|
|
256MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="12">
|
|
large
|
|
</td>
|
|
<td>
|
|
120 dpi (ldpi)
|
|
</td>
|
|
<td>
|
|
32MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
160 dpi (mdpi)
|
|
</td>
|
|
<td>
|
|
48MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
213 dpi (tvdpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
80MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
240 dpi (hdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
280 dpi (280dpi)
|
|
</td>
|
|
<td>
|
|
96MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
320 dpi (xhdpi)
|
|
</td>
|
|
<td>
|
|
128MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
360 dpi (360dpi)
|
|
</td>
|
|
<td>
|
|
160MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
400 dpi (400dpi)
|
|
</td>
|
|
<td>
|
|
192MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
420 dpi (420dpi)
|
|
</td>
|
|
<td>
|
|
228MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
480 dpi (xxhdpi)
|
|
</td>
|
|
<td>
|
|
256MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
560 dpi (560dpi)
|
|
</td>
|
|
<td>
|
|
384MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
640 dpi (xxxhdpi)
|
|
</td>
|
|
<td>
|
|
512MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="12">
|
|
xlarge
|
|
</td>
|
|
<td>
|
|
120 dpi (ldpi)
|
|
</td>
|
|
<td>
|
|
48MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
160 dpi (mdpi)
|
|
</td>
|
|
<td>
|
|
80MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
213 dpi (tvdpi)
|
|
</td>
|
|
<td rowspan="2">
|
|
96MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
240 dpi (hdpi)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
280 dpi (280dpi)
|
|
</td>
|
|
<td>
|
|
144MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
320 dpi (xhdpi)
|
|
</td>
|
|
<td>
|
|
192MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
360 dpi (360dpi)
|
|
</td>
|
|
<td>
|
|
240MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
400 dpi (400dpi)
|
|
</td>
|
|
<td>
|
|
288MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
420 dpi (420dpi)
|
|
</td>
|
|
<td>
|
|
336MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
480 dpi (xxhdpi)
|
|
</td>
|
|
<td>
|
|
384MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
560 dpi (560dpi)
|
|
</td>
|
|
<td>
|
|
576MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
640 dpi (xxxhdpi)
|
|
</td>
|
|
<td>
|
|
768MB
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h3 id="3_8_user_interface_compatibility">
|
|
3.8. User Interface Compatibility
|
|
</h3>
|
|
<h4 id="3_8_1_launcher_(home_screen)">
|
|
3.8.1. Launcher (Home Screen)
|
|
</h4>
|
|
<p>
|
|
Android includes a launcher application (home screen) and support for
|
|
third-party applications to replace the device launcher (home screen). Device
|
|
implementations that allow third-party applications to replace the device home
|
|
screen MUST declare the platform feature android.software.home_screen.
|
|
</p>
|
|
<h4 id="3_8_2_widgets">
|
|
3.8.2. Widgets
|
|
</h4>
|
|
<div class="note">
|
|
Widgets are optional for all Android device implementations, but SHOULD be
|
|
supported on Android Handheld devices.
|
|
</div>
|
|
<p>
|
|
Android defines a component type and corresponding API and lifecycle that allows
|
|
applications to expose an
|
|
<a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html">
|
|
“AppWidget”
|
|
</a>
|
|
to the end user, a feature that is STRONGLY RECOMMENDED to be supported on
|
|
Handheld Device implementations. Device implementations that support embedding
|
|
widgets on the home screen MUST meet the following requirements and declare
|
|
support for platform feature android.software.app_widgets.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device launchers MUST include built-in support for AppWidgets and expose
|
|
user interface affordances to add, configure, view, and remove AppWidgets
|
|
directly within the Launcher.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST be capable of rendering widgets that are 4 x 4
|
|
in the standard grid size. See the
|
|
<a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html">
|
|
App Widget Design
|
|
Guidelines
|
|
</a>
|
|
in the Android SDK documentation for details.
|
|
</li>
|
|
<li>
|
|
Device implementations that include support for lock screen MAY support
|
|
application widgets on the lock screen.
|
|
</li>
|
|
</ul>
|
|
<h4 id="3_8_3_notifications">
|
|
3.8.3. Notifications
|
|
</h4>
|
|
<p>
|
|
Android includes APIs that allow developers to
|
|
<a href="http://developer.android.com/guide/topics/ui/notifiers/notifications.html">
|
|
notify users of notable events
|
|
</a>
|
|
using hardware and software features of the device.
|
|
</p>
|
|
<p>
|
|
Some APIs allow applications to perform notifications or attract attention using
|
|
hardware—specifically sound, vibration, and light. Device implementations MUST
|
|
support notifications that use hardware features, as described in the SDK
|
|
documentation, and to the extent possible with the device implementation
|
|
hardware. For instance, if a device implementation includes a vibrator, it MUST
|
|
correctly implement the vibration APIs. If a device implementation lacks
|
|
hardware, the corresponding APIs MUST be implemented as no-ops. This behavior is
|
|
further detailed in
|
|
<a href="#7_hardware_compatibility">
|
|
section 7
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Additionally, the implementation MUST correctly render all
|
|
<a href="https://developer.android.com/guide/topics/resources/available-resources.html">
|
|
resources
|
|
</a>
|
|
(icons, animation files etc.) provided for in the APIs, or in the Status/System
|
|
Bar
|
|
<a href="http://developer.android.com/design/style/iconography.html">
|
|
icon style guide
|
|
</a>, which in the
|
|
case of an Android Television device includes the possibility to not display the
|
|
notifications. Device implementers MAY provide an alternative user experience
|
|
for notifications than that provided by the reference Android Open Source
|
|
implementation; however, such alternative notification systems MUST support
|
|
existing notification resources, as above.
|
|
</p>
|
|
<div class="note">
|
|
Android Automotive implementations MAY manage the visibility and timing of
|
|
notifications to mitigate driver distraction, but MUST display
|
|
notifications that use
|
|
<a href="https://developer.android.com/reference/android/app/Notification.CarExtender.html">
|
|
CarExtender
|
|
</a>
|
|
when requested by applications.
|
|
</div>
|
|
<p>
|
|
Android includes support for various notifications, such as:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Rich notifications
|
|
</strong>
|
|
. Interactive Views for ongoing notifications.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Heads-up notifications
|
|
</strong>
|
|
. Interactive Views users can act on or dismiss without leaving the current app.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Lock screen notifications
|
|
</strong>
|
|
. Notifications shown over a lock screen with granular control on visibility.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Android device implementations, when such notifications are made visible, MUST
|
|
properly execute Rich and Heads-up notifications and include the title/name,
|
|
icon, text as
|
|
<a href="https://developer.android.com/design/patterns/notifications.html">
|
|
documented in the Android APIs
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Android includes Notification Listener Service APIs that allow apps (once
|
|
explicitly enabled by the user) to receive a copy of all notifications as they
|
|
are posted or updated. Device implementations MUST correctly and promptly send
|
|
notifications in their entirety to all such installed and user-enabled listener
|
|
services, including any and all metadata attached to the Notification object.
|
|
</p>
|
|
<p>
|
|
Handheld device implementations MUST support the behaviors of updating,
|
|
removing, replying to, and bundling notifications as described in this
|
|
<a href="https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Managing">
|
|
section
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Also, handheld device implementations MUST provide:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The ability to control notifications directly in the notification shade.
|
|
</li>
|
|
<li>
|
|
The visual affordance to trigger the control panel in the notification shade.
|
|
</li>
|
|
<li>
|
|
The ability to BLOCK, MUTE and RESET notification preference from a
|
|
package, both in the inline control panel as well as in the settings app.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All 6 direct subclasses of the
|
|
<code>
|
|
Notification.Style class
|
|
</code>
|
|
MUST be supported as
|
|
described in the
|
|
<a href="https://developer.android.com/reference/android/app/Notification.Style.html">
|
|
SDK documents
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Device implementations that support the DND (Do not Disturb) feature MUST meet
|
|
the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement an activity that would respond to the intent
|
|
<a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS">
|
|
ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
|
|
</a>,
|
|
which for implementations with UI_MODE_TYPE_NORMAL it MUST be an activity
|
|
where the user can grant or deny the app access to DND policy
|
|
configurations.
|
|
</li>
|
|
<li>
|
|
MUST, for when the device implementation has provided a means for the user
|
|
to grant or deny third-party apps to access the DND policy configuration,
|
|
display
|
|
<a href="https://developer.android.com/reference/android/app/NotificationManager.html#addAutomaticZenRule%28android.app.AutomaticZenRule%29">
|
|
Automatic DND rules
|
|
</a>
|
|
created by applications alongside the user-created and pre-defined rules.
|
|
</li>
|
|
<li>
|
|
MUST honor the
|
|
<a href="https://developer.android.com/reference/android/app/NotificationManager.Policy.html#suppressedVisualEffects">
|
|
<code>
|
|
suppressedVisualEffects
|
|
</code>
|
|
</a>
|
|
values passed along the
|
|
<a href="https://developer.android.com/reference/android/app/NotificationManager.Policy.html#NotificationManager.Policy%28int, int, int, int%29">
|
|
<code>
|
|
NotificationManager.Policy
|
|
</code>
|
|
</a>
|
|
and if an app has set any of the SUPPRESSED_EFFECT_SCREEN_OFF or
|
|
SUPPRESSED_EFFECT_SCREEN_ON flags, it SHOULD indicate to the user that the
|
|
visual effects are suppressed in the DND settings menu.
|
|
</li>
|
|
</ul>
|
|
<h4 id="3_8_4_search">
|
|
3.8.4. Search
|
|
</h4>
|
|
<p>
|
|
Android includes APIs that allow developers to
|
|
<a href="http://developer.android.com/reference/android/app/SearchManager.html">
|
|
incorporate search
|
|
</a>
|
|
into their applications and expose their application’s data into the global
|
|
system search. Generally speaking, this functionality consists of a single,
|
|
system-wide user interface that allows users to enter queries, displays
|
|
suggestions as users type, and displays results. The Android APIs allow
|
|
developers to reuse this interface to provide search within their own apps and
|
|
allow developers to supply results to the common global search user interface.
|
|
</p>
|
|
<p>
|
|
Android device implementations SHOULD include global search, a single, shared,
|
|
system-wide search user interface capable of real-time suggestions in response
|
|
to user input. Device implementations SHOULD implement the APIs that allow
|
|
developers to reuse this user interface to provide search within their own
|
|
applications. Device implementations that implement the global search interface
|
|
MUST implement the APIs that allow third-party applications to add suggestions
|
|
to the search box when it is run in global search mode. If no third-party
|
|
applications are installed that make use of this functionality, the default
|
|
behavior SHOULD be to display web search engine results and suggestions.
|
|
</p>
|
|
<p>
|
|
Android device implementations SHOULD, and Android Automotive implementations
|
|
MUST, implement an assistant on the device to
|
|
handle the
|
|
<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST">
|
|
Assist action
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Android also includes the
|
|
<a href="https://developer.android.com/reference/android/app/assist/package-summary.html">
|
|
Assist APIs
|
|
</a>
|
|
to allow applications to elect how much information of the current context is
|
|
shared with the assistant on the device. Device implementations supporting the
|
|
Assist action MUST indicate clearly to the end user when the context is
|
|
shared by displaying a white light around the edges of the screen. To ensure
|
|
clear visibility to the end user, the indication MUST meet or exceed the
|
|
duration and brightness of the Android Open Source Project implementation.
|
|
</p>
|
|
<p>
|
|
This indication MAY be disabled by default for preinstalled apps using the Assist and
|
|
VoiceInteractionService API, if all following requirements are met:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
The preinstalled app MUST request the context to be shared only when the
|
|
user invoked the app by one of the following means, and the app is running in the
|
|
foreground:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
hotword invocation
|
|
</li>
|
|
<li>
|
|
input of the ASSIST navigation key/button/gesture
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The device implementation MUST provide an affordance to enable the
|
|
indication, less than two navigations away from
|
|
(the default voice input and assistant app settings menu)
|
|
<a href="#3_2_3_5_default_app_settings">
|
|
section 3.2.3.5
|
|
</a>.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<h4 id="3_8_5_toasts">
|
|
3.8.5. Toasts
|
|
</h4>
|
|
<p>
|
|
Applications can use the
|
|
<a href="http://developer.android.com/reference/android/widget/Toast.html">
|
|
“Toast” API
|
|
</a>
|
|
to
|
|
display short non-modal strings to the end user that disappear after a brief
|
|
period of time. Device implementations MUST display Toasts from applications to
|
|
end users in some high-visibility manner.
|
|
</p>
|
|
<h4 id="3_8_6_themes">
|
|
3.8.6. Themes
|
|
</h4>
|
|
<p>
|
|
Android provides “themes” as a mechanism for applications to apply styles across
|
|
an entire Activity or application.
|
|
</p>
|
|
<p>
|
|
Android includes a “Holo” theme family as a set of defined styles for
|
|
application developers to use if they want to match the
|
|
<a href="http://developer.android.com/guide/topics/ui/themes.html">
|
|
Holo theme look and feel
|
|
</a>
|
|
as defined by the Android SDK. Device implementations MUST NOT alter any of the
|
|
<a href="http://developer.android.com/reference/android/R.style.html">
|
|
Holo theme attributes
|
|
</a>
|
|
exposed to applications.
|
|
</p>
|
|
<p>
|
|
Android includes a “Material” theme family as a set of defined styles for
|
|
application developers to use if they want to match the design theme’s look and
|
|
feel across the wide variety of different Android device types. Device
|
|
implementations MUST support the “Material” theme family and MUST NOT alter any
|
|
of the
|
|
<a href="http://developer.android.com/reference/android/R.style.html#Theme_Material">
|
|
Material theme attributes
|
|
</a>
|
|
or their assets exposed to applications.
|
|
</p>
|
|
<p>
|
|
Android also includes a “Device Default” theme family as a set of defined styles
|
|
for application developers to use if they want to match the look and feel of the
|
|
device theme as defined by the device implementer. Device implementations MAY
|
|
modify the
|
|
<a href="http://developer.android.com/reference/android/R.style.html">
|
|
Device Default theme attributes
|
|
</a>
|
|
exposed
|
|
to applications.
|
|
</p>
|
|
<p>
|
|
Android supports a variant theme with translucent system bars, which allows
|
|
application developers to fill the area behind the status and navigation bar
|
|
with their app content. To enable a consistent developer experience in this
|
|
configuration, it is important the status bar icon style is maintained across
|
|
different device implementations. Therefore, Android device implementations MUST
|
|
use white for system status icons (such as signal strength and battery level)
|
|
and notifications issued by the system, unless the icon is indicating a
|
|
problematic status or an app requests a light status bar using the
|
|
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR flag. When an app requests a light status bar,
|
|
Android device implementations MUST change the color of the system status icons
|
|
to black (for details, refer to
|
|
<a href="http://developer.android.com/reference/android/R.style.html">
|
|
R.style
|
|
</a>
|
|
).
|
|
</p>
|
|
<h4 id="3_8_7_live_wallpapers">
|
|
3.8.7. Live Wallpapers
|
|
</h4>
|
|
<p>
|
|
Android defines a component type and corresponding API and lifecycle that allows
|
|
applications to expose one or more
|
|
<a href="http://developer.android.com/reference/android/service/wallpaper/WallpaperService.html">
|
|
“Live Wallpapers”
|
|
</a>
|
|
to the end user. Live wallpapers are animations, patterns, or similar images
|
|
with limited input capabilities that display as a wallpaper, behind other
|
|
applications.
|
|
</p>
|
|
<p>
|
|
Hardware is considered capable of reliably running live wallpapers if it can run
|
|
all live wallpapers, with no limitations on functionality, at a reasonable frame
|
|
rate with no adverse effects on other applications. If limitations in the
|
|
hardware cause wallpapers and/or applications to crash, malfunction, consume
|
|
excessive CPU or battery power, or run at unacceptably low frame rates, the
|
|
hardware is considered incapable of running live wallpaper. As an example, some
|
|
live wallpapers may use an OpenGL 2.0 or 3.x context to render their content.
|
|
Live wallpaper will not run reliably on hardware that does not support multiple
|
|
OpenGL contexts because the live wallpaper use of an OpenGL context may conflict
|
|
with other applications that also use an OpenGL context.
|
|
</p>
|
|
<p>
|
|
Device implementations capable of running live wallpapers reliably as described
|
|
above SHOULD implement live wallpapers, and when implemented MUST report the
|
|
platform feature flag android.software.live_wallpaper.
|
|
</p>
|
|
<h4 id="3_8_8_activity_switching">
|
|
3.8.8. Activity Switching
|
|
</h4>
|
|
<div class="note">
|
|
As the Recent function navigation key is OPTIONAL, the requirement to implement
|
|
the overview screen is OPTIONAL for Android Watch and Android Automotive implementations,
|
|
and RECOMMENDED for Android Television devices. There SHOULD still be a
|
|
method to switch between activities on Android Automotive implementations.
|
|
</div>
|
|
<p>
|
|
The upstream Android source code includes the
|
|
<a href="http://developer.android.com/guide/components/recents.html">
|
|
overview screen
|
|
</a>, a
|
|
system-level user interface for task switching and displaying recently accessed
|
|
activities and tasks using a thumbnail image of the application’s graphical
|
|
state at the moment the user last left the application. Device implementations
|
|
including the recents function navigation key as detailed in
|
|
<a href="#7_2_3_navigation_keys">
|
|
section 7.2.3
|
|
</a>
|
|
MAY alter the interface but MUST meet the
|
|
following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support at least up to 20 displayed activities.
|
|
</li>
|
|
<li>
|
|
SHOULD at least display the title of 4 activities at a time.
|
|
</li>
|
|
<li>
|
|
MUST implement the
|
|
<a href="http://developer.android.com/about/versions/android-5.0.html#ScreenPinning">
|
|
screen pinning behavior
|
|
</a>
|
|
and provide the user with a settings menu to toggle the feature.
|
|
</li>
|
|
<li>
|
|
SHOULD display highlight color, icon, screen title in recents.
|
|
</li>
|
|
<li>
|
|
SHOULD display a closing affordance ("x") but MAY delay this until user interacts with screens.
|
|
</li>
|
|
<li>
|
|
SHOULD implement a shortcut to switch easily to the previous activity
|
|
</li>
|
|
<li>
|
|
MAY display affiliated recents as a group that moves together.
|
|
</li>
|
|
<li>
|
|
SHOULD trigger the fast-switch action between the two most recently used
|
|
apps, when the recents function key is tapped twice.
|
|
</li>
|
|
<li>
|
|
SHOULD trigger the split-screen multiwindow-mode, if supported, when the
|
|
recents functions key is long pressed.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations are STRONGLY RECOMMENDED to use the upstream Android user
|
|
interface (or a similar thumbnail-based interface) for the overview screen.
|
|
</p>
|
|
<h4 id="3_8_9_input_management">
|
|
3.8.9. Input Management
|
|
</h4>
|
|
<p>
|
|
Android includes support for
|
|
<a href="http://developer.android.com/guide/topics/text/creating-input-method.html">
|
|
Input Management
|
|
</a>
|
|
and support for third-party input method editors. Device implementations that
|
|
allow users to use third-party input methods on the device MUST declare the
|
|
platform feature android.software.input_methods and support IME APIs as defined
|
|
in the Android SDK documentation.
|
|
</p>
|
|
<p>
|
|
Device implementations that declare the android.software.input_methods feature
|
|
MUST provide a user-accessible mechanism to add and configure third-party input
|
|
methods. Device implementations MUST display the settings interface in response
|
|
to the android.settings.INPUT_METHOD_SETTINGS intent.
|
|
</p>
|
|
<h4 id="3_8_10_lock_screen_media_control">
|
|
3.8.10. Lock Screen Media Control
|
|
</h4>
|
|
<p>
|
|
The Remote Control Client API is deprecated from Android 5.0 in favor of the
|
|
<a href="http://developer.android.com/reference/android/app/Notification.MediaStyle.html">
|
|
Media Notification Template
|
|
</a>
|
|
that allows media applications to integrate with playback controls that are
|
|
displayed on the lock screen. Device implementations that support a lock screen,
|
|
unless an Android Automotive or Watch implementation, MUST display the
|
|
Lock screen Notifications including the Media Notification Template.
|
|
</p>
|
|
<h4 id="3_8_11_screen_savers_(previously_dreams)">
|
|
3.8.11. Screen savers (previously Dreams)
|
|
</h4>
|
|
<p>
|
|
Android includes support for
|
|
<a href="http://developer.android.com/reference/android/service/dreams/DreamService.html">
|
|
interactivescreensavers
|
|
</a>,
|
|
previously referred to as Dreams. Screen savers allow users to interact with
|
|
applications when a device connected to a power source is idle or docked in a
|
|
desk dock. Android Watch devices MAY implement screen savers, but other types
|
|
of device implementations SHOULD include support for screen savers and provide
|
|
a settings option for users toconfigure screen savers in response to the
|
|
<code>
|
|
android.settings.DREAM_SETTINGS
|
|
</code>
|
|
intent.
|
|
</p>
|
|
<h4 id="3_8_12_location">
|
|
3.8.12. Location
|
|
</h4>
|
|
<p>
|
|
When a device has a hardware sensor (e.g. GPS) that is capable of providing the
|
|
location coordinates,
|
|
<a href="http://developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE">
|
|
location modes
|
|
</a>
|
|
MUST be displayed in the Location menu within Settings.
|
|
</p>
|
|
<h4 id="3_8_13_unicode_and_font">
|
|
3.8.13. Unicode and Font
|
|
</h4>
|
|
<p>
|
|
Android includes support for the emoji characters defined in
|
|
<a href="http://www.unicode.org/versions/Unicode9.0.0/">
|
|
Unicode 9.0
|
|
</a>. All device
|
|
implementations MUST be capable of rendering these emoji characters
|
|
in color glyph and when Android device implementations include an IME,
|
|
it SHOULD provide an input method to the user for these emoji characters.
|
|
</p>
|
|
<p>
|
|
Android handheld devices SHOULD support the skin tone and diverse family emojis
|
|
as specified in the
|
|
<a href="http://unicode.org/reports/tr51">
|
|
Unicode Technical Report #51
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Android includes support for Roboto 2 font with different
|
|
weights—sans-serif-thin, sans-serif-light, sans-serif-medium, sans-serif-black,
|
|
sans-serif-condensed, sans-serif-condensed-light—which MUST all be included for
|
|
the languages available on the device and full Unicode 7.0 coverage of Latin,
|
|
Greek, and Cyrillic, including the Latin Extended A, B, C, and D ranges, and all
|
|
glyphs in the currency symbols block of Unicode 7.0.
|
|
</p>
|
|
<h4 id="3_8_14_multi-windows">
|
|
3.8.14. Multi-windows
|
|
</h4>
|
|
<p>
|
|
A device implementation MAY choose not to implement any multi-window modes, but
|
|
if it has the capability to display multiple activities at the same time it
|
|
MUST implement such multi-window mode(s) in accordance with the application
|
|
behaviors and APIs described in the Android SDK
|
|
<a href="https://developer.android.com/preview/features/multi-window.html">
|
|
multi-window mode support documentation
|
|
</a>
|
|
and meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Applications can indicate whether they are capable of operating in
|
|
multi-window mode in the AndroidManifest.xml file, either explicitly via the
|
|
<a href="https://developer.android.com/reference/android/R.attr.html#resizeableActivity">
|
|
<code>
|
|
android:resizeableActivity
|
|
</code>
|
|
</a>
|
|
attribute or implicitly by having the targetSdkVersion > 24. Apps that
|
|
explicitly set this attribute to false in their manifest MUST not be
|
|
launched in multi-window mode. Apps that don't set the attribute in their
|
|
manifest file (targetSdkVersion < 24) can be launched in multi-window mode,
|
|
but the system MUST provide warning that the app may not work as expected in
|
|
multi-window mode.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST NOT offer split-screen or freeform mode
|
|
if both the screen height and width is less than 440 dp.
|
|
</li>
|
|
<li>
|
|
Device implementations with screen size
|
|
<code>
|
|
xlarge
|
|
</code>
|
|
SHOULD support freeform mode.
|
|
</li>
|
|
<li>
|
|
Android Television device implementations MUST support picture-in-picture (PIP) mode multi-window
|
|
and place the PIP multi-window in the top right corner when PIP is ON.
|
|
</li>
|
|
<li>
|
|
Device implementations with PIP mode multi-window support
|
|
MUST allocate at least 240x135 dp for the PIP window.
|
|
</li>
|
|
<li>
|
|
If the PIP multi-window mode is supported the
|
|
<a href="https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_WINDOW">
|
|
<code>
|
|
KeyEvent.KEYCODE_WINDOW
|
|
</code>
|
|
</a>
|
|
key MUST be used to control the PIP window; otherwise, the key MUST be
|
|
available to the foreground activity.
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_9_device_administration">
|
|
3.9. Device Administration
|
|
</h3>
|
|
<p>
|
|
Android includes features that allow security-aware applications to perform
|
|
device administration functions at the system level, such as enforcing password
|
|
policies or performing remote wipe, through the
|
|
<a href="http://developer.android.com/guide/topics/admin/device-admin.html">
|
|
Android Device Administration API
|
|
</a>
|
|
].
|
|
Device implementations MUST provide an implementation of the
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html">
|
|
DevicePolicyManager
|
|
</a>
|
|
class. Device implementations that supports a secure lock screen MUST implement
|
|
the full range of
|
|
<a href="http://developer.android.com/guide/topics/admin/device-admin.html">
|
|
device administration
|
|
</a>
|
|
policies defined in the Android SDK documentation and report the platform
|
|
feature android.software.device_admin.
|
|
</p>
|
|
<h4 id="3_9_1_device_provisioning">
|
|
3.9.1 Device Provisioning
|
|
</h4>
|
|
<h5 id="3_9_1_1_device_owner_provisioning">
|
|
3.9.1.1 Device owner provisioning
|
|
</h5>
|
|
<p>
|
|
If a device implementation declares the
|
|
<code>
|
|
android.software.device_admin
|
|
</code>
|
|
feature
|
|
then it MUST implement the provisioning of the
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isDeviceOwnerApp(java.lang.String)">
|
|
Device Owner app
|
|
</a>
|
|
of a Device Policy Client (DPC) application as indicated below:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
When the device implementation has no user data configured yet, it:
|
|
<ul>
|
|
<li>
|
|
MUST report
|
|
<code>
|
|
true
|
|
</code>
|
|
for
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProvisioningAllowed(java.lang.String)">
|
|
<code>
|
|
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST enroll the DPC application as the Device Owner app in response to
|
|
the intent action
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_DEVICE">
|
|
<code>
|
|
android.app.action.PROVISION_MANAGED_DEVICE
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST enroll the DPC application as the Device Owner app if the device
|
|
declares Near-Field Communications (NFC) support via the feature flag
|
|
<code>
|
|
android.hardware.nfc
|
|
</code>
|
|
and receives an NFC message containing a record
|
|
with MIME type
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#MIME_TYPE_PROVISIONING_NFC">
|
|
<code>
|
|
MIME_TYPE_PROVISIONING_NFC
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
When the device implementation has user data, it:
|
|
<ul>
|
|
<li>
|
|
MUST report
|
|
<code>
|
|
false
|
|
</code>
|
|
for the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProvisioningAllowed(java.lang.String)">
|
|
<code>
|
|
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST not enroll any DPC application as the Device Owner App any more.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations MAY have a preinstalled application performing device
|
|
administration functions but this application MUST NOT be set as the Device
|
|
Owner app without explicit consent or action from the user or the administrator
|
|
of the device.
|
|
</p>
|
|
<h5 id="3_9_1_2_managed_profile_provisioning">
|
|
3.9.1.2 Managed profile provisioning
|
|
</h5>
|
|
<p>
|
|
If a device implementation declares the android.software.managed_users, it MUST
|
|
be possible to enroll a Device Policy Controller (DPC) application as the
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProfileOwnerApp(java.lang.String)">
|
|
owner of a new Managed Profile
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
The managed profile provisioning process (the flow initiated by
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE">
|
|
android.app.action.PROVISION_MANAGED_PROFILE
|
|
</a>
|
|
)
|
|
user experience MUST align with the AOSP implementation.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST provide the following user affordances within the
|
|
Settings user interface to indicate to the user when a particular system function
|
|
has been disabled by the Device Policy Controller (DPC):
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
A consistent icon or other user affordance (for example the upstream AOSP
|
|
info icon) to represent when a particular setting is restricted by a
|
|
Device Admin.
|
|
</li>
|
|
<li>
|
|
A short explanation message, as provided by the Device Admin via the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setShortSupportMessage%28android.content.ComponentName, java.lang.CharSequence%29">
|
|
<code>
|
|
setShortSupportMessage
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
The DPC application’s icon.
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_9_2_managed_profile_support">
|
|
3.9.2 Managed Profile Support
|
|
</h3>
|
|
<p>
|
|
Managed profile capable devices are those devices that:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Declare android.software.device_admin (see
|
|
<a href="#3_9_device_administration">
|
|
section 3.9 Device Administration
|
|
</a>
|
|
).
|
|
</li>
|
|
<li>
|
|
Are not low RAM devices (see
|
|
<a href="#7_6_1_minimum_memory_and_storage">
|
|
section 7.6.1
|
|
</a>
|
|
).
|
|
</li>
|
|
<li>
|
|
Allocate internal (non-removable) storage as shared storage (see
|
|
<a href="#7_6_2_application_shared_storage">
|
|
section 7.6.2
|
|
</a>
|
|
).
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Managed profile capable devices MUST:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Declare the platform feature flag
|
|
<code>
|
|
android.software.managed_users
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
Support managed profiles via the
|
|
<code>
|
|
android.app.admin.DevicePolicyManager
|
|
</code>
|
|
APIs.
|
|
</li>
|
|
<li>
|
|
Allow one and only
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE">
|
|
one managed profile to be created
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
Use an icon badge (similar to the AOSP upstream work badge) to represent the
|
|
managed applications and widgets and other badged UI elements like
|
|
Recents & Notifications.
|
|
</li>
|
|
<li>
|
|
Display a notification icon (similar to the AOSP upstream work badge) to
|
|
indicate when user is within a managed profile application.
|
|
</li>
|
|
<li>
|
|
Display a toast indicating that the user is in the managed profile if and
|
|
when the device wakes up (ACTION_USER_PRESENT) and the foreground
|
|
application is within the managed profile.
|
|
</li>
|
|
<li>
|
|
Where a managed profile exists, show a visual affordance in the Intent
|
|
'Chooser' to allow the user to forward the intent from the managed profile
|
|
to the primary user or vice versa, if enabled by the Device Policy
|
|
Controller.
|
|
</li>
|
|
<li>
|
|
Where a managed profile exists, expose the following user affordances for
|
|
both the primary user and the managed profile:
|
|
<ul>
|
|
<li>
|
|
Separate accounting for battery, location, mobile data and storage usage
|
|
for the primary user and managed profile.
|
|
</li>
|
|
<li>
|
|
Independent management of VPN Applications installed within the primary
|
|
user or managed profile.
|
|
</li>
|
|
<li>
|
|
Independent management of applications installed within the primary user
|
|
or managed profile.
|
|
</li>
|
|
<li>
|
|
Independent management of accounts within the primary user or managed
|
|
profile.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
Ensure the preinstalled dialer, contacts and messaging applications can
|
|
search for and look up caller information from the managed profile (if one
|
|
exists) alongside those from the primary profile, if the Device Policy
|
|
Controller permits it. When contacts from the managed profile are displayed
|
|
in the preinstalled call log, in-call UI, in-progress and missed-call
|
|
notifications, contacts and messaging apps they SHOULD be badged with the
|
|
same badge used to indicate managed profile applications.
|
|
</li>
|
|
<li>
|
|
MUST ensure that it satisfies all the security requirements applicable for a
|
|
device with multiple users enabled (see
|
|
<a href="#9_5_multi-user_support">
|
|
section 9.5
|
|
</a>
|
|
),
|
|
even though the managed profile is not counted as another user in addition
|
|
to the primary user.
|
|
</li>
|
|
<li>
|
|
Support the ability to specify a separate lock screen meeting the following
|
|
requirements to grant access to apps running in a managed profile.
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST honor the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_SET_NEW_PASSWORD">
|
|
<code>
|
|
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
|
|
</code>
|
|
</a>
|
|
intent and show an interface to configure a separate lock screen
|
|
credential for the managed profile.
|
|
</li>
|
|
<li>
|
|
The lock screen credentials of the managed profile MUST use the same
|
|
credential storage and management mechanisms as the parent profile,
|
|
as documented on the
|
|
<a href="http://source.android.com/security/authentication/index.html">
|
|
Android Open Source Project Site
|
|
</a>
|
|
</li>
|
|
<li>
|
|
The DPC
|
|
<a href="https://developer.android.com/guide/topics/admin/device-admin.html#pwd">
|
|
password policies
|
|
</a>
|
|
MUST apply to only the managed profile's lock screen credentials unless
|
|
called upon the
|
|
<code>
|
|
DevicePolicyManager
|
|
</code>
|
|
instance returned by
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#getParentProfileInstance%28android.content.ComponentName%29">
|
|
getParentProfileInstance
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_10_accessibility">
|
|
3.10. Accessibility
|
|
</h3>
|
|
<p>
|
|
Android provides an accessibility layer that helps users with disabilities to
|
|
navigate their devices more easily. In addition, Android provides platform APIs
|
|
that enable
|
|
<a href="http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html">
|
|
accessibility service implementations
|
|
</a>
|
|
to receive callbacks for user and system events and generate alternate feedback
|
|
mechanisms, such as text-to-speech, haptic feedback, and trackball/d-pad
|
|
navigation.
|
|
</p>
|
|
<p>
|
|
Device implementations include the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Android Automotive implementations SHOULD provide an implementation of the
|
|
Android accessibility framework consistent with the default Android
|
|
implementation.
|
|
</li>
|
|
<li>
|
|
Device implementations (Android Automotive excluded) MUST provide an
|
|
implementation of the Android accessibility framework consistent with the
|
|
default Android implementation.
|
|
</li>
|
|
<li>
|
|
Device implementations (Android Automotive excluded) MUST support
|
|
third-party accessibility service implementations through the
|
|
<a href="http://developer.android.com/reference/android/view/accessibility/package-summary.html">
|
|
android.accessibilityservice APIs
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
Device implementations (Android Automotive excluded) MUST generate
|
|
AccessibilityEvents and deliver these events to all registered
|
|
AccessibilityService implementations in a manner consistent with the default
|
|
Android implementation
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Device implementations (Android Automotive and Android Watch devices with no
|
|
audio output excluded), MUST provide a user-accessible mechanism to enable
|
|
and disable accessibility services, and MUST display this interface in
|
|
response to the android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS
|
|
intent.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Android device implementations with audio output are STRONGLY RECOMMENDED to provide
|
|
implementations of accessibility services on the device comparable in or exceeding functionality
|
|
of the TalkBack** and Switch Access accessibility services (https://github.com/google/talkback).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
Android Watch devices with audio output SHOULD provide implementations of an accessibility service
|
|
on the device comparable in or exceeding functionality of the TalkBack accessibility service
|
|
(https://github.com/google/talkback).
|
|
</li>
|
|
<li>
|
|
Device implementations SHOULD provide a mechanism in the out-of-box setup flow for users to enable
|
|
relevant accessibility services, as well as options to adjust the font size, display size and
|
|
magnification gestures.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
** For languages supported by Text-to-speech.
|
|
</p>
|
|
<p>
|
|
Also, note that if there is a preloaded accessibility service, it MUST be a Direct Boot aware
|
|
{directBootAware} app if the device has encrypted storage using File Based
|
|
Encryption (FBE).
|
|
</p>
|
|
<h3 id="3_11_text-to-speech">
|
|
3.11. Text-to-Speech
|
|
</h3>
|
|
<p>
|
|
Android includes APIs that allow applications to make use of text-to-speech
|
|
(TTS) services and allows service providers to provide implementations of TTS
|
|
services. Device implementations reporting the feature
|
|
android.hardware.audio.output MUST meet these requirements related to the
|
|
<a href="http://developer.android.com/reference/android/speech/tts/package-summary.html">
|
|
Android TTS framework
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Android Automotive implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the Android TTS framework APIs.
|
|
</li>
|
|
<li>
|
|
MAY support installation of third-party TTS engines. If supported, partners
|
|
MUST provide a user-accessible interface that allows the user to select a
|
|
TTS engine for use at system level.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All other device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the Android TTS framework APIs and SHOULD include a TTS engine
|
|
supporting the languages available on the device. Note that the upstream
|
|
Android open source software includes a full-featured TTS engine
|
|
implementation.
|
|
</li>
|
|
<li>
|
|
MUST support installation of third-party TTS engines.
|
|
</li>
|
|
<li>
|
|
MUST provide a user-accessible interface that allows users to select a TTS
|
|
engine for use at the system level.
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_12_tv_input_framework">
|
|
3.12. TV Input Framework
|
|
</h3>
|
|
<p>
|
|
The
|
|
<a href="http://source.android.com/devices/tv/index.html">
|
|
Android Television Input Framework (TIF)
|
|
</a>
|
|
simplifies the delivery of live content to Android Television devices. TIF
|
|
provides a standard API to create input modules that control Android Television
|
|
devices. Android Television device implementations MUST support TV Input
|
|
Framework.
|
|
</p>
|
|
<p>
|
|
Device implementations that support TIF MUST declare the platform feature
|
|
android.software.live_tv.
|
|
</p>
|
|
<h4 id="3_12_1_tv_app">
|
|
3.12.1. TV App
|
|
</h4>
|
|
<p>
|
|
Any device implementation that declares support for Live TV MUST have an
|
|
installed TV application (TV App). The Android Open Source Project provides an
|
|
implementation of the TV App.
|
|
</p>
|
|
<p>
|
|
The TV App MUST provide facilities to install and use
|
|
<a href="http://developer.android.com/reference/android/media/tv/TvContract.Channels.html">
|
|
TV Channels
|
|
</a>
|
|
and meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST allow third-party TIF-based inputs
|
|
(
|
|
<a href="https://source.android.com/devices/tv/index.html#third-party_input_example">
|
|
third-party inputs
|
|
</a>
|
|
)
|
|
to be installed and managed.
|
|
</li>
|
|
<li>
|
|
Device implementations MAY provide visual separation between pre-installed
|
|
<a href="https://source.android.com/devices/tv/index.html#tv_inputs">
|
|
TIF-based inputs
|
|
</a>
|
|
(installed inputs) and third-party inputs.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST NOT display the third-party inputs more than a
|
|
single navigation action away from the TV App (i.e. expanding a list of
|
|
third-party inputs from the TV App).
|
|
</li>
|
|
</ul>
|
|
<h5 id="3_12_1_1_electronic_program_guide">
|
|
3.12.1.1. Electronic Program Guide
|
|
</h5>
|
|
<p>
|
|
Android Television device implementations MUST show an informational and
|
|
interactive overlay, which MUST include an electronic program guide (EPG)
|
|
generated from the values in the
|
|
<a href="https://developer.android.com/reference/android/media/tv/TvContract.Programs.html">
|
|
TvContract.Programs
|
|
</a>
|
|
fields. The EPG MUST meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The EPG MUST display information from all installed inputs and third-party
|
|
inputs.
|
|
</li>
|
|
<li>
|
|
The EPG MAY provide visual separation between the installed inputs and
|
|
third-party inputs.
|
|
</li>
|
|
<li>
|
|
The EPG is STRONGLY RECOMMENDED to display installed inputs and third-party
|
|
inputs with equal prominence. The EPG MUST NOT display the third-party
|
|
inputs more than a single navigation action away from the installed inputs
|
|
on the EPG.
|
|
</li>
|
|
<li>
|
|
On channel change, device implementations MUST display EPG data for the
|
|
currently playing program.
|
|
</li>
|
|
</ul>
|
|
<h5 id="3_12_1_2_navigation">
|
|
3.12.1.2. Navigation
|
|
</h5>
|
|
<p>
|
|
The TV App MUST allow navigation for the following functions via the D-pad,
|
|
Back, and Home keys on the Android Television device’s input device(s)
|
|
(i.e. remote control, remote control application, or game controller):
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Changing TV channels
|
|
</li>
|
|
<li>
|
|
Opening EPG
|
|
</li>
|
|
<li>
|
|
Configuring and tuning to third-party TIF-based inputs
|
|
</li>
|
|
<li>
|
|
Opening Settings menu
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The TV App SHOULD pass key events to HDMI inputs through CEC.
|
|
</p>
|
|
<h5 id="3_12_1_3_tv_input_app_linking">
|
|
3.12.1.3. TV input app linking
|
|
</h5>
|
|
<p>
|
|
Android Television device implementations MUST support
|
|
<a href="http://developer.android.com/reference/android/media/tv/TvContract.Channels.html#COLUMN_APP_LINK_INTENT_URI">
|
|
TV input app linking
|
|
</a>,
|
|
which allows all inputs to provide activity links from the current activity to
|
|
another activity (i.e. a link from live programming to related content). The TV
|
|
App MUST show TV input app linking when it is provided.
|
|
</p>
|
|
<h5 id="3_12_1_4_time_shifting">
|
|
3.12.1.4. Time shifting
|
|
</h5>
|
|
<p>
|
|
Android Television device implementations MUST support time shifting, which
|
|
allows the user to pause and resume live content. Device implementations MUST
|
|
provide the user a way to pause and resume the currently playing program, if
|
|
time shifting for that program
|
|
<a href="https://developer.android.com/reference/android/media/tv/TvInputManager.html#TIME_SHIFT_STATUS_AVAILABLE">
|
|
is available
|
|
</a>.
|
|
</p>
|
|
<h5 id="3_12_1_5_tv_recording">
|
|
3.12.1.5. TV recording
|
|
</h5>
|
|
<p>
|
|
Android Television device implementations are STRONGLY RECOMMENDED to support
|
|
TV recording. If the TV input supports recording, the EPG MAY provide a way to
|
|
<a href="https://developer.android.com/reference/android/media/tv/TvInputInfo.html#canRecord%28%29">
|
|
record a program
|
|
</a>
|
|
if the recording of such a program is not
|
|
<a href="https://developer.android.com/reference/android/media/tv/TvContract.Programs.html#COLUMN_RECORDING_PROHIBITED">
|
|
prohibited
|
|
</a>.
|
|
Device implementations SHOULD provide a user interface to play recorded programs.
|
|
</p>
|
|
<h3 id="3_13_quick_settings">
|
|
3.13. Quick Settings
|
|
</h3>
|
|
<p>
|
|
Android device implementations SHOULD include a Quick Settings UI component that
|
|
allow quick access to frequently used or urgently needed actions.
|
|
</p>
|
|
<p>
|
|
Android includes the
|
|
<a href="https://developer.android.com/reference/android/service/quicksettings/package-summary.html">
|
|
<code>
|
|
quicksettings
|
|
</code>
|
|
</a>
|
|
API allowing third party apps to implement tiles that can be added by the user
|
|
alongside the system-provided tiles in the Quick Settings UI component. If a
|
|
device implementation has a Quick Settings UI component, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST allow the user to add or remove tiles from a third-party app to Quick
|
|
Settings.
|
|
</li>
|
|
<li>
|
|
MUST NOT automatically add a tile from a third-party app directly to Quick
|
|
Settings.
|
|
</li>
|
|
<li>
|
|
MUST display all the user-added tiles from third-party apps alongside the
|
|
system-provided quick setting tiles.
|
|
</li>
|
|
</ul>
|
|
<h3 id="3_14_vehicle_ui_apis">
|
|
3.14. Vehicle UI APIs
|
|
</h3>
|
|
<h4 id="3_14_1__vehicle_media_ui">
|
|
3.14.1. Vehicle Media UI
|
|
</h4>
|
|
<p>
|
|
Any device implementation that
|
|
<a href="https://developer.android.com/reference/android/content/pm/PackageManager.html?#FEATURE_AUTOMOTIVE?">
|
|
declares automotive support
|
|
</a>
|
|
MUST include a UI framework to support third-party apps consuming the
|
|
<a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.html">
|
|
MediaBrowser
|
|
</a>
|
|
and
|
|
<a href="http://developer.android.com/reference/android/media/session/MediaSession.html">
|
|
MediaSession
|
|
</a>
|
|
APIs.
|
|
</p>
|
|
<p>
|
|
The UI framework supporting third-party apps that depend on MediaBrowser and
|
|
MediaSession has the following visual requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST display
|
|
<a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.MediaItem.html">
|
|
MediaItem
|
|
</a>
|
|
icons and notification icons unaltered.
|
|
</li>
|
|
<li>
|
|
MUST display those items as described by MediaSession, e.g., metadata, icons,
|
|
imagery.
|
|
</li>
|
|
<li>
|
|
MUST show app title.
|
|
</li>
|
|
<li>
|
|
MUST have drawer to present
|
|
<a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.html">
|
|
MediaBrowser
|
|
</a>
|
|
hierarchy.
|
|
</li>
|
|
</ul>
|
|
<h2 id="4_application_packaging_compatibility">
|
|
4. Application Packaging Compatibility
|
|
</h2>
|
|
<p>
|
|
Device implementations MUST install and run Android “.apk” files as generated
|
|
by the “aapt” tool included in the
|
|
<a href="http://developer.android.com/tools/help/index.html">
|
|
official Android SDK
|
|
</a>.
|
|
For this reason device implementations SHOULD use the reference implementation’s
|
|
package management system.
|
|
</p>
|
|
<p>
|
|
The package manager MUST support verifying “.apk” files using the
|
|
<a href="https://source.android.com/security/apksigning/v2.html">
|
|
APK Signature Scheme v2
|
|
</a>
|
|
and
|
|
<a href="https://source.android.com/security/apksigning/v2.html#v1-verification">
|
|
JAR signing
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Devices implementations MUST NOT extend either the
|
|
<a href="http://developer.android.com/guide/components/fundamentals.html">
|
|
.apk
|
|
</a>,
|
|
<a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">
|
|
Android Manifest
|
|
</a>,
|
|
<a href="https://android.googlesource.com/platform/dalvik/">
|
|
Dalvik bytecode
|
|
</a>, or
|
|
RenderScript bytecode formats in such a way that would prevent those files from
|
|
installing and running correctly on other compatible devices.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST NOT allow apps other than the current
|
|
"installer of record" for the package to silently uninstall the app without any
|
|
prompt, as documented in the SDK for the
|
|
<a href="https://developer.android.com/reference/android/Manifest.permission.html#DELETE_PACKAGES">
|
|
<code>
|
|
DELETE_PACKAGE
|
|
</code>
|
|
</a>
|
|
permission. The only exceptions are the system package verifier app handling
|
|
<a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_NEEDS_VERIFICATION">
|
|
PACKAGE_NEEDS_VERIFICATION
|
|
</a>
|
|
intent and the storage manager app handling
|
|
<a href="https://developer.android.com/reference/android/os/storage/StorageManager.html#ACTION_MANAGE_STORAGE">
|
|
ACTION_MANAGE_STORAGE
|
|
</a>
|
|
intent.
|
|
</p>
|
|
<h2 id="5_multimedia_compatibility">
|
|
5. Multimedia Compatibility
|
|
</h2>
|
|
<h3 id="5_1_media_codecs">
|
|
5.1. Media Codecs
|
|
</h3>
|
|
<p>
|
|
Device implementations—
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
MUST support the
|
|
<a href="http://developer.android.com/guide/appendix/media-formats.html">
|
|
core media
|
|
formats
|
|
</a>
|
|
specified in the Android SDK documentation, except where explicitly permitted
|
|
in this document.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST support the media formats, encoders, decoders, file types, and
|
|
container formats defined in the tables below and reported via
|
|
<a href="http://developer.android.com/reference/android/media/MediaCodecList.html">
|
|
MediaCodecList
|
|
</a>.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST also be able to decode all profiles reported in its
|
|
<a href="http://developer.android.com/reference/android/media/CamcorderProfile.html">
|
|
CamcorderProfile
|
|
</a>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST be able to decode all formats it can encode. This includes all
|
|
bitstreams that its encoders generate.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Codecs SHOULD aim for minimum codec latency, in other words, codecs—
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD NOT consume and store input buffers and return input buffers only
|
|
once processed
|
|
</li>
|
|
<li>
|
|
SHOULD NOT hold onto decoded buffers for longer than as specified by the
|
|
standard (e.g. SPS).
|
|
</li>
|
|
<li>
|
|
SHOULD NOT hold onto encoded buffers longer than required by the GOP
|
|
structure.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All of the codecs listed in the table below are provided as software
|
|
implementations in the preferred Android implementation from the Android Open
|
|
Source Project.
|
|
</p>
|
|
<p>
|
|
Please note that neither Google nor the Open Handset Alliance make any
|
|
representation that these codecs are free from third-party patents. Those
|
|
intending to use this source code in hardware or software products are advised
|
|
that implementations of this code, including in open source software or
|
|
shareware, may require patent licenses from the relevant patent holders.
|
|
</p>
|
|
<h4 id="5_1_1_audio_codecs">
|
|
5.1.1. Audio Codecs
|
|
</h4>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Format/Codec
|
|
</th>
|
|
<th>
|
|
Encoder
|
|
</th>
|
|
<th>
|
|
Decoder
|
|
</th>
|
|
<th>
|
|
Details
|
|
</th>
|
|
<th>
|
|
Supported File Types/Container Formats
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MPEG-4 AAC Profile
|
|
<br/>
|
|
(AAC LC)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
Support for mono/stereo/5.0/5.1
|
|
<sup>
|
|
2
|
|
</sup>
|
|
content with standard
|
|
sampling rates from 8 to 48 kHz.
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
3GPP (.3gp)
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-4 (.mp4, .m4a)
|
|
</li>
|
|
<li class="table_list">
|
|
ADTS raw AAC (.aac, decode in Android 3.1+, encode in
|
|
Android 4.0+, ADIF not supported)
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-TS (.ts, not seekable, Android 3.0+)
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MPEG-4 HE AAC Profile (AAC+)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
1
|
|
</sup>
|
|
<br/>
|
|
(Android 4.1+)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
Support for mono/stereo/5.0/5.1
|
|
<sup>
|
|
2
|
|
</sup>
|
|
content with standard
|
|
sampling rates from 16 to 48 kHz.
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MPEG-4 HE AACv2
|
|
<br/>
|
|
Profile (enhanced AAC+)
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
Support for mono/stereo/5.0/5.1
|
|
<sup>
|
|
2
|
|
</sup>
|
|
content with standard
|
|
sampling rates from 16 to 48 kHz.
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AAC ELD (enhanced low delay AAC)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
1
|
|
</sup>
|
|
<br/>
|
|
(Android 4.1+)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<br/>
|
|
(Android 4.1+)
|
|
</td>
|
|
<td>
|
|
Support for mono/stereo content with standard sampling rates from 16 to
|
|
48 kHz.
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AMR-NB
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
4.75 to 12.2 kbps sampled @ 8 kHz
|
|
</td>
|
|
<td>
|
|
3GPP (.3gp)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AMR-WB
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16 kHz
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
FLAC
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<br/>
|
|
(Android 3.1+)
|
|
</td>
|
|
<td>
|
|
Mono/Stereo (no multichannel). Sample rates up to 48 kHz (but up to 44.1
|
|
kHz is RECOMMENDED on devices with 44.1 kHz output, as the 48 to 44.1 kHz
|
|
downsampler does not include a low-pass filter). 16-bit RECOMMENDED; no
|
|
dither applied for 24-bit.
|
|
</td>
|
|
<td>
|
|
FLAC (.flac) only
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MP3
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
Mono/Stereo 8-320Kbps constant (CBR) or variable bitrate (VBR)
|
|
</td>
|
|
<td>
|
|
MP3 (.mp3)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MIDI
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for
|
|
ringtone formats RTTTL/RTX, OTA, and iMelody
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
Type 0 and 1 (.mid, .xmf, .mxmf)
|
|
</li>
|
|
<li class="table_list">
|
|
RTTTL/RTX (.rtttl, .rtx)
|
|
</li>
|
|
<li class="table_list">
|
|
OTA (.ota)
|
|
</li>
|
|
<li class="table_list">
|
|
iMelody (.imy)
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Vorbis
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
Ogg (.ogg)
|
|
</li>
|
|
<li class="table_list">
|
|
Matroska (.mkv, Android 4.0+)
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PCM/WAVE
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
4
|
|
</sup>
|
|
<br/>
|
|
(Android 4.1+)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
16-bit linear PCM (rates up to limit of hardware). Devices MUST support
|
|
sampling rates for raw PCM recording at 8000, 11025, 16000, and 44100 Hz
|
|
frequencies.
|
|
</td>
|
|
<td>
|
|
WAVE (.wav)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Opus
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<br/>
|
|
(Android 5.0+)
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
Matroska (.mkv), Ogg(.ogg)
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 Required for device implementations that define
|
|
android.hardware.microphone but optional for Android Watch device
|
|
implementations.
|
|
</p>
|
|
<p class="table_footnote">
|
|
2 Recording or playback MAY be performed in mono
|
|
or stereo, but the decoding of AAC input buffers of multichannel streams
|
|
(i.e. more than two channels) to PCM through the default AAC audio decoder
|
|
in the android.media.MediaCodec API, the following MUST be supported:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
decoding is performed without downmixing (e.g. a 5.0 AAC stream must be
|
|
decoded to five channels of PCM, a 5.1 AAC stream must be decoded to six
|
|
channels of PCM),
|
|
</li>
|
|
<li>
|
|
dynamic range metadata, as defined in "Dynamic Range Control (DRC)"
|
|
in ISO/IEC 14496-3, and the android.media.MediaFormat DRC keys to
|
|
configure the dynamic range-related behaviors of the audio decoder. The
|
|
AAC DRC keys were introduced in API 21,and are:
|
|
KEY_AAC_DRC_ATTENUATION_FACTOR, KEY_AAC_DRC_BOOST_FACTOR,
|
|
KEY_AAC_DRC_HEAVY_COMPRESSION, KEY_AAC_DRC_TARGET_REFERENCE_LEVEL and
|
|
KEY_AAC_ENCODED_TARGET_LEVEL
|
|
</li>
|
|
</ul>
|
|
<p class="table_footnote">
|
|
3 Required for Android Handheld device
|
|
implementations.
|
|
</p>
|
|
<p class="table_footnote">
|
|
4 Required for device implementations that define
|
|
android.hardware.microphone, including Android Watch device implementations.
|
|
</p>
|
|
<h4 id="5_1_2_image_codecs">
|
|
5.1.2. Image Codecs
|
|
</h4>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Format/Codec
|
|
</th>
|
|
<th>
|
|
Encoder
|
|
</th>
|
|
<th>
|
|
Decoder
|
|
</th>
|
|
<th>
|
|
Details
|
|
</th>
|
|
<th>
|
|
Supported File Types/Container Formats
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
JPEG
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
Base+progressive
|
|
</td>
|
|
<td>
|
|
JPEG (.jpg)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
GIF
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
GIF (.gif)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PNG
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
PNG (.png)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
BMP
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
BMP (.bmp)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
WebP
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
WebP (.webp)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Raw
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
ARW (.arw), CR2 (.cr2), DNG (.dng), NEF (.nef), NRW (.nrw), ORF (.orf),
|
|
PEF (.pef), RAF (.raf), RW2 (.rw2), SRW (.srw)
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h4 id="5_1_3_video_codecs">
|
|
5.1.3. Video Codecs
|
|
</h4>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
Codecs advertising HDR profile support MUST support HDR static metadata
|
|
parsing and handling.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
If a media codec advertises intra refresh support, then it MUST support the
|
|
refresh periods in the range of 10 - 60 frames and accurately operate within
|
|
20% of configured refresh period.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Video codecs MUST support output and input bytebuffer sizes that
|
|
accommodate the largest feasible compressed and uncompressed frame as dictated
|
|
by the standard and configuration but also not overallocate.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Video encoders and decoders MUST support YUV420 flexible color format
|
|
(COLOR_FormatYUV420Flexible).
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Format/Codec
|
|
</th>
|
|
<th>
|
|
Encoder
|
|
</th>
|
|
<th>
|
|
Decoder
|
|
</th>
|
|
<th>
|
|
Details
|
|
</th>
|
|
<th>
|
|
Supported File Types/
|
|
<br/>
|
|
Container Formats
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H.263
|
|
</td>
|
|
<td>
|
|
MAY
|
|
</td>
|
|
<td>
|
|
MAY
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
3GPP (.3gp)
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-4 (.mp4)
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H.264 AVC
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_2_video_encoding">
|
|
section 5.2
|
|
</a>
|
|
and
|
|
<a href="#5_3_video_decoding">
|
|
5.3
|
|
</a>
|
|
for details
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
3GPP (.3gp)
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-4 (.mp4)
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-2 TS (.ts, AAC audio only, not seekable, Android
|
|
3.0+)
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H.265 HEVC
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
5
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_3_video_decoding">
|
|
section 5.3
|
|
</a>
|
|
for details
|
|
</td>
|
|
<td>
|
|
MPEG-4 (.mp4)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MPEG-2
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
STRONGLY RECOMMENDED
|
|
<sup>
|
|
6
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
Main Profile
|
|
</td>
|
|
<td>
|
|
MPEG2-TS
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MPEG-4 SP
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
3GPP (.3gp)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VP8
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
<br/>
|
|
(Android 4.3+)
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
<br/>
|
|
(Android 2.3.3+)
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_2_video_encoding">
|
|
section 5.2
|
|
</a>
|
|
and
|
|
<a href="#5_3_video_decoding">
|
|
5.3
|
|
</a>
|
|
for details
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
<a href="http://www.webmproject.org/">
|
|
WebM
|
|
(.webm)
|
|
</a>
|
|
</li>
|
|
<li class="table_list">
|
|
Matroska (.mkv, Android 4.0+)
|
|
<sup>
|
|
4
|
|
</sup>
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
VP9
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>
|
|
REQUIRED
|
|
<sup>
|
|
2
|
|
</sup>
|
|
<br/>
|
|
(Android 4.4+)
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_3_video_decoding">
|
|
section 5.3
|
|
</a>
|
|
for details
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
<a href="http://www.webmproject.org/">
|
|
WebM
|
|
(.webm)
|
|
</a>
|
|
</li>
|
|
<li class="table_list">
|
|
Matroska (.mkv, Android 4.0+)
|
|
<sup>
|
|
4
|
|
</sup>
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 Required for device implementations that include
|
|
camera hardware and define android.hardware.camera or
|
|
android.hardware.camera.front.
|
|
</p>
|
|
<p class="table_footnote">
|
|
2 Required for device implementations except Android
|
|
Watch devices.
|
|
</p>
|
|
<p class="table_footnote">
|
|
3 For acceptable quality of web video streaming and
|
|
video-conference services, device implementations SHOULD use a hardware VP8
|
|
codec that meets the
|
|
<a href="http://www.webmproject.org/hardware/rtc-coding-requirements/">
|
|
requirements
|
|
</a>.
|
|
</p>
|
|
<p class="table_footnote">
|
|
4 Device implementations SHOULD support writing
|
|
Matroska WebM files.
|
|
</p>
|
|
<p class="table_footnote">
|
|
5 STRONGLY RECOMMENDED for Android Automotive,
|
|
optional for Android Watch, and required for all other device types.
|
|
</p>
|
|
<p class="table_footnote">
|
|
6 Applies only to Android Television device
|
|
implementations.
|
|
</p>
|
|
<h3 id="5_2_video_encoding">
|
|
5.2. Video Encoding
|
|
</h3>
|
|
<div class="note">
|
|
Video codecs are optional for Android Watch device implementations.
|
|
</div>
|
|
<p>
|
|
H.264, VP8, VP9 and HEVC video encoders—
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support dynamically configurable bitrates.
|
|
</li>
|
|
<li>
|
|
SHOULD support variable frame rates, where video encoder SHOULD determine
|
|
instantaneous frame duration based on the timestamps of input buffers, and
|
|
allocate its bit bucket based on that frame duration.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
H.263 and MPEG-4 video encoder SHOULD support dynamically configurable
|
|
bitrates.
|
|
</p>
|
|
<p>
|
|
All video encoders SHOULD meet the following bitrate targets over two sliding
|
|
windows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
It SHOULD be not more than ~15% over the bitrate between intraframe
|
|
(I-frame) intervals.
|
|
</li>
|
|
<li>
|
|
It SHOULD be not more than ~100% over the bitrate over a sliding window of
|
|
1 second.
|
|
</li>
|
|
</ul>
|
|
<h4 id="5_2_1_h_263">
|
|
5.2.1. H.263
|
|
</h4>
|
|
<p>
|
|
Android device implementations with H.263 encoders MUST support Baseline Profile Level 45.
|
|
</p>
|
|
<h4 id="5_2_2_h-264">
|
|
5.2.2. H-264
|
|
</h4>
|
|
<p>
|
|
Android device implementations with H.264 codec support:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support Baseline Profile Level 3.
|
|
<br/>
|
|
However, support for ASO (Arbitrary Slice Ordering), FMO (Flexible Macroblock
|
|
Ordering) and RS (Redundant Slices) is OPTIONAL. Moreover, to maintain
|
|
compatibility with other Android devices, it is RECOMMENDED that ASO, FMO
|
|
and RS are not used for Baseline Profile by encoders.
|
|
</li>
|
|
<li>
|
|
MUST support the SD (Standard Definition) video encoding profiles in the following table.
|
|
</li>
|
|
<li>
|
|
SHOULD support Main Profile Level 4.
|
|
</li>
|
|
<li>
|
|
SHOULD support the HD (High Definition) video encoding profiles as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
In addition, Android Television devices are STRONGLY RECOMMENDED to encode HD 1080p video at 30 fps.
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
320 x 240 px
|
|
</td>
|
|
<td>
|
|
720 x 480 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
20 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
384 Kbps
|
|
</td>
|
|
<td>
|
|
2 Mbps
|
|
</td>
|
|
<td>
|
|
4 Mbps
|
|
</td>
|
|
<td>
|
|
10 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 When supported by hardware, but STRONGLY RECOMMENDED
|
|
for Android Television devices.
|
|
</p>
|
|
<h4 id="5_2_3_vp8">
|
|
5.2.3. VP8
|
|
</h4>
|
|
<p>
|
|
Android device implementations with VP8 codec support MUST support the SD video
|
|
encoding profiles and SHOULD support the following HD (High Definition) video encoding profiles.
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
320 x 180 px
|
|
</td>
|
|
<td>
|
|
640 x 360 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
800 Kbps
|
|
</td>
|
|
<td>
|
|
2 Mbps
|
|
</td>
|
|
<td>
|
|
4 Mbps
|
|
</td>
|
|
<td>
|
|
10 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 When supported by hardware.
|
|
</p>
|
|
<h3 id="5_3_video_decoding">
|
|
5.3. Video Decoding
|
|
</h3>
|
|
<div class="note">
|
|
Video codecs are optional for Android Watch device implementations.
|
|
</div>
|
|
<p>
|
|
Device implementations—
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
MUST support dynamic video resolution and frame rate switching through the
|
|
standard Android APIs within the same stream for all VP8, VP9, H.264, and
|
|
H.265 codecs in real time and up to the maximum resolution supported by each
|
|
codec on the device.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Implementations that support the Dolby Vision decoder—
|
|
</p>
|
|
</li>
|
|
<li>
|
|
MUST provide a Dolby Vision-capable extractor.
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST properly display Dolby Vision content on the device screen or on a
|
|
standard video output port (e.g., HDMI).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Implementations that provide a Dolby Vision-capable extractor MUST set the
|
|
track index of backward-compatible base-layer(s) (if present) to be the same
|
|
as the combined Dolby Vision layer's track index.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<h4 id="5_3_1_mpeg-2">
|
|
5.3.1. MPEG-2
|
|
</h4>
|
|
<p>
|
|
Android device implementations with MPEG-2 decoders must support the Main
|
|
Profile High Level.
|
|
</p>
|
|
<h4 id="5_3_2_h_263">
|
|
5.3.2. H.263
|
|
</h4>
|
|
<p>
|
|
Android device implementations with H.263 decoders MUST support Baseline Profile
|
|
Level 30 and Level 45.
|
|
</p>
|
|
<h4 id="5_3_3_mpeg-4">
|
|
5.3.3. MPEG-4
|
|
</h4>
|
|
<p>
|
|
Android device implementations with MPEG-4 decoders MUST support Simple Profile
|
|
Level 3.
|
|
</p>
|
|
<h4 id="5_3_4_h_264">
|
|
5.3.4. H.264
|
|
</h4>
|
|
<p>
|
|
Android device implementations with H.264 decoders:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support Main Profile Level 3.1 and Baseline Profile.
|
|
<br/>
|
|
Support for ASO (Arbitrary Slice Ordering), FMO (Flexible Macroblock Ordering)
|
|
and RS (Redundant Slices) is OPTIONAL.
|
|
</li>
|
|
<li>
|
|
MUST be capable of decoding videos with the SD (Standard Definition)
|
|
profiles listed in the following table and encoded with the Baseline Profile and
|
|
Main Profile Level 3.1 (including 720p30).
|
|
</li>
|
|
<li>
|
|
SHOULD be capable of decoding videos with the HD (High Definition) profiles
|
|
as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
In addition, Android Television devices—
|
|
<ul>
|
|
<li>
|
|
MUST support High Profile Level 4.2 and the HD 1080p60 decoding profile.
|
|
</li>
|
|
<li>
|
|
MUST be capable of decoding videos with both HD profiles as indicated
|
|
in the following table and encoded with either the Baseline Profile, Main
|
|
Profile, or the High Profile Level 4.2
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
320 x 240 px
|
|
</td>
|
|
<td>
|
|
720 x 480 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
60 fps
|
|
</td>
|
|
<td>
|
|
30 fps (60 fps
|
|
<sup>
|
|
2
|
|
</sup>
|
|
)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
800 Kbps
|
|
</td>
|
|
<td>
|
|
2 Mbps
|
|
</td>
|
|
<td>
|
|
8 Mbps
|
|
</td>
|
|
<td>
|
|
20 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 REQUIRED for when the height as reported by the
|
|
Display.getSupportedModes() method is equal or greater than the video resolution.
|
|
</p>
|
|
<p class="table_footnote">
|
|
2 REQUIRED for Android Television device
|
|
implementations.
|
|
</p>
|
|
<h4 id="5_3_5_h_265_(hevc)">
|
|
5.3.5. H.265 (HEVC)
|
|
</h4>
|
|
<p>
|
|
Android device implementations, when supporting H.265 codec as described in
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the Main Profile Level 3 Main tier and the SD video decoding profiles
|
|
as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
SHOULD support the HD decoding profiles as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
MUST support the HD decoding profiles as indicated in the following table
|
|
if there is a hardware decoder.
|
|
</li>
|
|
<li>
|
|
In addition, Android Television devices:
|
|
</li>
|
|
<li>
|
|
MUST support the HD 720p decoding profile.
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to support the HD 1080p decoding profile. If the HD 1080p
|
|
decoding profile is supported, it MUST support the Main Profile Level 4.1 Main tier.
|
|
</li>
|
|
<li>
|
|
SHOULD support the UHD decoding profile. If the UHD decoding profile is supported the
|
|
codec MUST support Main10 Level 5 Main Tier profile.
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
</th>
|
|
<th>
|
|
UHD
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
352 x 288 px
|
|
</td>
|
|
<td>
|
|
720 x 480 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
<td>
|
|
3840 x 2160 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps (60 fps
|
|
<sup>
|
|
1
|
|
</sup>
|
|
)
|
|
</td>
|
|
<td>
|
|
60 fps
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
600 Kbps
|
|
</td>
|
|
<td>
|
|
1.6 Mbps
|
|
</td>
|
|
<td>
|
|
4 Mbps
|
|
</td>
|
|
<td>
|
|
5 Mbps
|
|
</td>
|
|
<td>
|
|
20 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 REQUIRED for Android Television device
|
|
implementations with H.265 hardware decoding.
|
|
</p>
|
|
<h4 id="5_3_6_vp8">
|
|
5.3.6. VP8
|
|
</h4>
|
|
<p>
|
|
Android device implementations, when supporting VP8 codec as described in
|
|
<a href="https://source.android.com/compatibility/android-cdd.html#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the SD decoding profiles in the following table.
|
|
</li>
|
|
<li>
|
|
SHOULD support the HD decoding profiles in the following table.
|
|
</li>
|
|
<li>
|
|
Android Television devices MUST support the HD 1080p60 decoding profile.
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
320 x 180 px
|
|
</td>
|
|
<td>
|
|
640 x 360 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps (60 fps
|
|
<sup>
|
|
2
|
|
</sup>
|
|
)
|
|
</td>
|
|
<td>
|
|
30 (60 fps
|
|
<sup>
|
|
2
|
|
</sup>
|
|
)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
800 Kbps
|
|
</td>
|
|
<td>
|
|
2 Mbps
|
|
</td>
|
|
<td>
|
|
8 Mbps
|
|
</td>
|
|
<td>
|
|
20 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 REQUIRED for when the height as reported by the
|
|
Display.getSupportedModes() method is equal or greater than the video resolution.
|
|
</p>
|
|
<p class="table_footnote">
|
|
2 REQUIRED for Android Television device
|
|
implementations.
|
|
</p>
|
|
<h4 id="5_3_7_vp9">
|
|
5.3.7. VP9
|
|
</h4>
|
|
<p>
|
|
Android device implementations, when supporting VP9 codec as described in
|
|
<a href="https://source.android.com/compatibility/android-cdd.html#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the SD video decoding profiles as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
SHOULD support the HD decoding profiles as indicated in the following table.
|
|
</li>
|
|
<li>
|
|
MUST support the HD decoding profiles as indicated in the following table,
|
|
if there is a hardware decoder.
|
|
</li>
|
|
<li>
|
|
<p>
|
|
In addition, Android Television devices:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the HD 720p decoding profile.
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to support the HD 1080p decoding profile.
|
|
</li>
|
|
<li>
|
|
SHOULD support the UHD decoding profile. If the UHD video decoding
|
|
profile is supported, it MUST support 8-bit color depth and SHOULD
|
|
support VP9 Profile 2 (10-bit).
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
</th>
|
|
<th>
|
|
SD (Low quality)
|
|
</th>
|
|
<th>
|
|
SD (High quality)
|
|
</th>
|
|
<th>
|
|
HD 720p
|
|
</th>
|
|
<th>
|
|
HD 1080p
|
|
</th>
|
|
<th>
|
|
UHD
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video resolution
|
|
</th>
|
|
<td>
|
|
320 x 180 px
|
|
</td>
|
|
<td>
|
|
640 x 360 px
|
|
</td>
|
|
<td>
|
|
1280 x 720 px
|
|
</td>
|
|
<td>
|
|
1920 x 1080 px
|
|
</td>
|
|
<td>
|
|
3840 x 2160 px
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video frame rate
|
|
</th>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps
|
|
</td>
|
|
<td>
|
|
30 fps (60 fps
|
|
<sup>
|
|
1
|
|
</sup>
|
|
)
|
|
</td>
|
|
<td>
|
|
60 fps
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Video bitrate
|
|
</th>
|
|
<td>
|
|
600 Kbps
|
|
</td>
|
|
<td>
|
|
1.6 Mbps
|
|
</td>
|
|
<td>
|
|
4 Mbps
|
|
</td>
|
|
<td>
|
|
5 Mbps
|
|
</td>
|
|
<td>
|
|
20 Mbps
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1 REQUIRED for Android Television
|
|
device implementations with VP9 hardware decoding.
|
|
</p>
|
|
<h3 id="5_4_audio_recording">
|
|
5.4. Audio Recording
|
|
</h3>
|
|
<p>
|
|
While some of the requirements outlined in this section are stated as SHOULD
|
|
since Android 4.3, the Compatibility Definition for a future version is planned
|
|
to change these to MUST. Existing and new Android devices are
|
|
<strong>
|
|
STRONGLY
|
|
RECOMMENDED
|
|
</strong>
|
|
to meet these requirements that are stated as SHOULD, or they
|
|
will not be able to attain Android compatibility when upgraded to the future
|
|
version.
|
|
</p>
|
|
<h4 id="5_4_1_raw_audio_capture">
|
|
5.4.1. Raw Audio Capture
|
|
</h4>
|
|
<p>
|
|
Device implementations that declare android.hardware.microphone MUST allow
|
|
capture of raw audio content with the following characteristics:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Format
|
|
</strong>
|
|
: Linear PCM, 16-bit
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Sampling rates
|
|
</strong>
|
|
: 8000, 11025, 16000, 44100
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Channels
|
|
</strong>
|
|
: Mono
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The capture for the above sample rates MUST be done without up-sampling, and
|
|
any down-sampling MUST include an appropriate anti-aliasing filter.
|
|
</p>
|
|
<p>
|
|
Device implementations that declare android.hardware.microphone SHOULD allow
|
|
capture of raw audio content with the following characteristics:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Format
|
|
</strong>
|
|
: Linear PCM, 16-bit
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Sampling rates
|
|
</strong>
|
|
: 22050, 48000
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Channels
|
|
</strong>
|
|
: Stereo
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If capture for the above sample rates is supported, then the capture MUST be
|
|
done without up-sampling at any ratio higher than 16000:22050 or 44100:48000.
|
|
Any up-sampling or down-sampling MUST include an appropriate anti-aliasing
|
|
filter.
|
|
</p>
|
|
<h4 id="5_4_2_capture_for_voice_recognition">
|
|
5.4.2. Capture for Voice Recognition
|
|
</h4>
|
|
<p>
|
|
The android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION audio source MUST
|
|
support capture at one of the sampling rates, 44100 and 48000.
|
|
</p>
|
|
<p>
|
|
In addition to the above recording specifications, when an application has
|
|
started recording an audio stream using the
|
|
android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION audio source:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The device SHOULD exhibit approximately flat amplitude versus frequency
|
|
characteristics: specifically, ±3 dB, from 100 Hz to 4000 Hz.
|
|
</li>
|
|
<li>
|
|
Audio input sensitivity SHOULD be set such that a 90 dB sound power level
|
|
(SPL) source at 1000 Hz yields RMS of 2500 for 16-bit samples.
|
|
</li>
|
|
<li>
|
|
PCM amplitude levels SHOULD linearly track input SPL changes over at least a
|
|
30 dB range from -18 dB to +12 dB re 90 dB SPL at the microphone.
|
|
</li>
|
|
<li>
|
|
Total harmonic distortion SHOULD be less than 1% for 1 kHz at 90 dB SPL
|
|
input level at the microphone.
|
|
</li>
|
|
<li>
|
|
Noise reduction processing, if present, MUST be disabled.
|
|
</li>
|
|
<li>
|
|
Automatic gain control, if present, MUST be disabled.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If the platform supports noise suppression technologies tuned for speech
|
|
recognition, the effect MUST be controllable from the
|
|
android.media.audiofx.NoiseSuppressor API. Moreover, the UUID field for the
|
|
noise suppressor’s effect descriptor MUST uniquely identify each implementation
|
|
of the noise suppression technology.
|
|
</p>
|
|
<h4 id="5_4_3_capture_for_rerouting_of_playback">
|
|
5.4.3. Capture for Rerouting of Playback
|
|
</h4>
|
|
<p>
|
|
The android.media.MediaRecorder.AudioSource class includes the REMOTE_SUBMIX
|
|
audio source. Devices that declare android.hardware.audio.output MUST properly
|
|
implement the REMOTE_SUBMIX audio source so that when an application uses the
|
|
android.media.AudioRecord API to record from this audio source, it can capture
|
|
a mix of all audio streams except for the following:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
STREAM_RING
|
|
</li>
|
|
<li>
|
|
STREAM_ALARM
|
|
</li>
|
|
<li>
|
|
STREAM_NOTIFICATION
|
|
</li>
|
|
</ul>
|
|
<h3 id="5_5_audio_playback">
|
|
5.5. Audio Playback
|
|
</h3>
|
|
<p>
|
|
Device implementations that declare android.hardware.audio.output MUST conform
|
|
to the requirements in this section.
|
|
</p>
|
|
<h4 id="5_5_1_raw_audio_playback">
|
|
5.5.1. Raw Audio Playback
|
|
</h4>
|
|
<p>
|
|
The device MUST allow playback of raw audio content with the following
|
|
characteristics:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Format
|
|
</strong>
|
|
: Linear PCM, 16-bit
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Sampling rates
|
|
</strong>
|
|
: 8000, 11025, 16000, 22050, 32000, 44100
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Channels
|
|
</strong>
|
|
: Mono, Stereo
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The device SHOULD allow playback of raw audio content with the following
|
|
characteristics:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Sampling rates
|
|
</strong>
|
|
: 24000, 48000
|
|
</li>
|
|
</ul>
|
|
<h4 id="5_5_2_audio_effects">
|
|
5.5.2. Audio Effects
|
|
</h4>
|
|
<p>
|
|
Android provides an
|
|
<a href="http://developer.android.com/reference/android/media/audiofx/AudioEffect.html">
|
|
API for audio effects
|
|
</a>
|
|
for device implementations. Device implementations that declare the feature
|
|
android.hardware.audio.output:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support the EFFECT_TYPE_EQUALIZER and EFFECT_TYPE_LOUDNESS_ENHANCER
|
|
implementations controllable through the AudioEffect subclasses Equalizer,
|
|
LoudnessEnhancer.
|
|
</li>
|
|
<li>
|
|
MUST support the visualizer API implementation, controllable through the
|
|
Visualizer class.
|
|
</li>
|
|
<li>
|
|
SHOULD support the EFFECT_TYPE_BASS_BOOST, EFFECT_TYPE_ENV_REVERB,
|
|
EFFECT_TYPE_PRESET_REVERB, and EFFECT_TYPE_VIRTUALIZER implementations
|
|
controllable through the AudioEffect sub-classes BassBoost,
|
|
EnvironmentalReverb, PresetReverb, and Virtualizer.
|
|
</li>
|
|
</ul>
|
|
<h4 id="5_5_3_audio_output_volume">
|
|
5.5.3. Audio Output Volume
|
|
</h4>
|
|
<p>
|
|
Android Television device implementations MUST include support for system
|
|
Master Volume and digital audio output volume attenuation on supported outputs,
|
|
except for compressed audio passthrough output (where no audio decoding is done
|
|
on the device).
|
|
</p>
|
|
<p>
|
|
Android Automotive device implementations SHOULD allow adjusting audio volume
|
|
separately per each audio stream using the content type or usage as defined
|
|
by
|
|
<a href="" title="http://developer.android.com/reference/android/media/AudioAttributes.html">
|
|
AudioAttributes
|
|
</a>
|
|
and car audio usage as publicly defined in
|
|
<code>
|
|
android.car.CarAudioManager
|
|
</code>
|
|
.
|
|
</p>
|
|
<h3 id="5_6_audio_latency">
|
|
5.6. Audio Latency
|
|
</h3>
|
|
<p>
|
|
Audio latency is the time delay as an audio signal passes through a system.
|
|
Many classes of applications rely on short latencies, to achieve real-time
|
|
sound effects.
|
|
</p>
|
|
<p>
|
|
For the purposes of this section, use the following definitions:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
output latency
|
|
</strong>
|
|
. The interval between when an application writes a frame
|
|
of PCM-coded data and when the corresponding sound is presented to environment at an on-device transducer
|
|
or signal leaves the device via a port and can be observed externally.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
cold output latency
|
|
</strong>
|
|
. The output latency for the first frame, when the
|
|
audio output system has been idle and powered down prior to the request.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
continuous output latency
|
|
</strong>
|
|
. The output latency for subsequent frames,
|
|
after the device is playing audio.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
input latency
|
|
</strong>
|
|
. The interval between when a sound is presented by environment to device
|
|
at an on-device transducer or signal enters the device via a port
|
|
and when an application reads the corresponding frame of
|
|
PCM-coded data.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
lost input
|
|
</strong>
|
|
. The initial portion of an input signal that is unusable or unavailable.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
cold input latency
|
|
</strong>
|
|
. The sum of lost input time and the input latency
|
|
for the first frame, when the audio input system has been idle and powered down
|
|
prior to the request.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
continuous input latency
|
|
</strong>
|
|
. The input latency for subsequent frames,
|
|
while the device is capturing audio.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
cold output jitter
|
|
</strong>
|
|
. The variability among separate measurements of cold
|
|
output latency values.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
cold input jitter
|
|
</strong>
|
|
. The variability among separate measurements of cold
|
|
input latency values.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
continuous round-trip latency
|
|
</strong>
|
|
. The sum of continuous input latency plus
|
|
continuous output latency plus one buffer period. The buffer period allows
|
|
time for the app to process the signal and time for the app to mitigate phase difference
|
|
between input and output streams.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
OpenSL ES PCM buffer queue API
|
|
</strong>
|
|
. The set of PCM-related OpenSL ES APIs
|
|
within
|
|
<a href="https://developer.android.com/ndk/index.html">
|
|
Android NDK
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations that declare android.hardware.audio.output are STRONGLY
|
|
RECOMMENDED to meet or exceed these audio output requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
cold output latency of 100 milliseconds or less
|
|
</li>
|
|
<li>
|
|
continuous output latency of 45 milliseconds or less
|
|
</li>
|
|
<li>
|
|
minimize the cold output jitter
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If a device implementation meets the requirements of this section after any
|
|
initial calibration when using the OpenSL ES PCM buffer queue API, for
|
|
continuous output latency and cold output latency over at least one supported
|
|
audio output device, it is STRONGLY RECOMMENDED to report support for
|
|
low-latency audio, by reporting the feature android.hardware.audio.low_latency
|
|
via the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager
|
|
</a>
|
|
class. Conversely, if the device implementation does not meet these
|
|
requirements it MUST NOT report support for low-latency audio.
|
|
</p>
|
|
<p>
|
|
Device implementations that include android.hardware.microphone are STRONGLY
|
|
RECOMMENDED to meet these input audio requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
cold input latency of 100 milliseconds or less
|
|
</li>
|
|
<li>
|
|
continuous input latency of 30 milliseconds or less
|
|
</li>
|
|
<li>
|
|
continuous round-trip latency of 50 milliseconds or less
|
|
</li>
|
|
<li>
|
|
minimize the cold input jitter
|
|
</li>
|
|
</ul>
|
|
<h3 id="5_7_network_protocols">
|
|
5.7. Network Protocols
|
|
</h3>
|
|
<p>
|
|
Devices MUST support the
|
|
<a href="http://developer.android.com/guide/appendix/media-formats.html">
|
|
media network protocols
|
|
</a>
|
|
for audio and video playback as specified in the Android SDK documentation.
|
|
Specifically, devices MUST support the following media network protocols:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
HTTP(S) progressive streaming
|
|
<br/>
|
|
All required codecs and container formats in
|
|
<a href="#5_1_media_codecs">
|
|
section 5.1
|
|
</a>
|
|
MUST
|
|
be supported over HTTP(S)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming-07">
|
|
HTTP Live Streaming draft protocol, Version 7
|
|
</a>
|
|
<br/>
|
|
The following media segment formats MUST be supported:
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Segment formats
|
|
</th>
|
|
<th>
|
|
Reference(s)
|
|
</th>
|
|
<th>
|
|
Required codec support
|
|
</th>
|
|
</tr>
|
|
<tr id="mp2t">
|
|
<td>
|
|
MPEG-2 Transport Stream
|
|
</td>
|
|
<td>
|
|
<a href="http://www.iso.org/iso/catalogue_detail?csnumber=44169">
|
|
ISO 13818
|
|
</a>
|
|
</td>
|
|
<td>
|
|
Video codecs:
|
|
<ul>
|
|
<li class="table_list">
|
|
H264 AVC
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-4 SP
|
|
</li>
|
|
<li class="table_list">
|
|
MPEG-2
|
|
</li>
|
|
</ul>
|
|
See
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>
|
|
for details on H264 AVC, MPEG2-4 SP,
|
|
<br/>
|
|
and MPEG-2.
|
|
<p>
|
|
Audio codecs:
|
|
</p>
|
|
<ul>
|
|
<li class="table_list">
|
|
AAC
|
|
</li>
|
|
</ul>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AAC and its variants.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AAC with ADTS framing and ID3 tags
|
|
</td>
|
|
<td>
|
|
<a href="http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=43345">
|
|
ISO 13818-7
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AAC and its variants
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
WebVTT
|
|
</td>
|
|
<td>
|
|
<a href="http://dev.w3.org/html5/webvtt/">
|
|
WebVTT
|
|
</a>
|
|
</td>
|
|
<td>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
RTSP (RTP, SDP)
|
|
</p>
|
|
<p>
|
|
The following RTP audio video profile and related codecs MUST be supported.
|
|
For exceptions please see the table footnotes in
|
|
<a href="#5_1_media_codecs">
|
|
section 5.1
|
|
</a>.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Profile name
|
|
</th>
|
|
<th>
|
|
Reference(s)
|
|
</th>
|
|
<th>
|
|
Required codec support
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H264 AVC
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc6184">
|
|
RFC 6184
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>
|
|
for details on H264 AVC
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MP4A-LATM
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc6416">
|
|
RFC 6416
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AAC and its variants
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H263-1998
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc3551">
|
|
RFC 3551
|
|
</a>
|
|
<br/>
|
|
<a href="https://tools.ietf.org/html/rfc4629">
|
|
RFC 4629
|
|
</a>
|
|
<br/>
|
|
<a href="https://tools.ietf.org/html/rfc2190">
|
|
RFC 2190
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>
|
|
for details on H263
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
H263-2000
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc4629">
|
|
RFC 4629
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>
|
|
for details on H263
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AMR
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc4867">
|
|
RFC 4867
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AMR-NB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
AMR-WB
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc4867">
|
|
RFC 4867
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AMR-WB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MP4V-ES
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc6416">
|
|
RFC 6416
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_3_video_codecs">
|
|
section 5.1.3
|
|
</a>
|
|
for details on MPEG-4 SP
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
mpeg4-generic
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc3640">
|
|
RFC 3640
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#5_1_1_audio_codecs">
|
|
section 5.1.1
|
|
</a>
|
|
for details on AAC and its variants
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
MP2T
|
|
</td>
|
|
<td>
|
|
<a href="https://tools.ietf.org/html/rfc2250">
|
|
RFC 2250
|
|
</a>
|
|
</td>
|
|
<td>
|
|
See
|
|
<a href="#mp2t">
|
|
MPEG-2 Transport Stream
|
|
</a>
|
|
underneath HTTP Live Streaming for details
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h3 id="5_8_secure_media">
|
|
5.8. Secure Media
|
|
</h3>
|
|
<p>
|
|
Device implementations that support secure video output and are capable of
|
|
supporting secure surfaces MUST declare support for Display.FLAG_SECURE. Device
|
|
implementations that declare support for Display.FLAG_SECURE, if they support a
|
|
wireless display protocol, MUST secure the link with a cryptographically strong
|
|
mechanism such as HDCP 2.x or higher for Miracast wireless displays. Similarly
|
|
if they support a wired external display, the device implementations MUST
|
|
support HDCP 1.2 or higher. Android Television device implementations MUST
|
|
support HDCP 2.2 for devices supporting 4K resolution and HDCP 1.4 or above for
|
|
lower resolutions. The upstream Android open source implementation includes
|
|
support for wireless (Miracast) and wired (HDMI) displays that satisfies this
|
|
requirement.
|
|
</p>
|
|
<h3 id="5_9_musical_instrument_digital_interface_(midi)">
|
|
5.9. Musical Instrument Digital Interface (MIDI)
|
|
</h3>
|
|
<p>
|
|
If a device implementation supports the inter-app MIDI software transport
|
|
(virtual MIDI devices), and it supports MIDI over
|
|
<em>
|
|
all
|
|
</em>
|
|
of the following
|
|
MIDI-capable hardware transports for which it provides generic non-MIDI
|
|
connectivity, it is STRONGLY RECOMMENDED to report support for feature
|
|
android.software.midi via the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager
|
|
</a>
|
|
class.
|
|
</p>
|
|
<p>
|
|
The MIDI-capable hardware transports are:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
USB host mode (section 7.7 USB)
|
|
</li>
|
|
<li>
|
|
USB peripheral mode (section 7.7 USB)
|
|
</li>
|
|
<li>
|
|
MIDI over Bluetooth LE acting in central role (section 7.4.3 Bluetooth)
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Conversely, if the device implementation provides generic non-MIDI connectivity
|
|
over a particular MIDI-capable hardware transport listed above, but does not
|
|
support MIDI over that hardware transport, it MUST NOT report support for
|
|
feature android.software.midi.
|
|
</p>
|
|
<h3 id="5_10_professional_audio">
|
|
5.10. Professional Audio
|
|
</h3>
|
|
<p>
|
|
If a device implementation meets
|
|
<em>
|
|
all
|
|
</em>
|
|
of the following requirements, it is
|
|
STRONGLY RECOMMENDED to report support for feature android.hardware.audio.pro
|
|
via the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager
|
|
</a>
|
|
class.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The device implementation MUST report support for feature
|
|
android.hardware.audio.low_latency.
|
|
</li>
|
|
<li>
|
|
The continuous round-trip audio latency, as defined in section 5.6 Audio
|
|
Latency, MUST be 20 milliseconds or less and SHOULD be 10 milliseconds or less
|
|
over at least one supported path.
|
|
</li>
|
|
<li>
|
|
If the device includes a 4 conductor 3.5mm audio jack, the continuous
|
|
round-trip audio latency MUST be 20 milliseconds or less over the audio jack
|
|
path, and SHOULD be 10 milliseconds or less over at the audio jack path.
|
|
</li>
|
|
<li>
|
|
The device implementation MUST include a USB port(s) supporting USB host
|
|
mode and USB peripheral mode.
|
|
</li>
|
|
<li>
|
|
The USB host mode MUST implement the USB audio class.
|
|
</li>
|
|
<li>
|
|
If the device includes an HDMI port, the device implementation MUST support
|
|
output in stereo and eight channels at 20-bit or 24-bit depth and 192 kHz
|
|
without bit-depth loss or resampling.
|
|
</li>
|
|
<li>
|
|
The device implementation MUST report support for feature
|
|
android.software.midi.
|
|
</li>
|
|
<li>
|
|
If the device includes a 4 conductor 3.5mm audio jack, the device
|
|
implementation is STRONGLY RECOMMENDED to comply with section
|
|
<a href="https://source.android.com/accessories/headset/specification.html#mobile_device_jack_specifications">
|
|
Mobile device
|
|
(jack) specifications
|
|
</a>
|
|
of the
|
|
<a href="https://source.android.com/accessories/headset/specification.html">
|
|
Wired Audio Headset Specification (v1.1)
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Latencies and USB audio requirements MUST be met using the
|
|
<a href="https://developer.android.com/ndk/guides/audio/opensl-for-android.html">
|
|
OpenSL ES
|
|
</a>
|
|
PCM buffer queue API.
|
|
</p>
|
|
<p>
|
|
In addition, a device implementation that reports support for this feature SHOULD:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Provide a sustainable level of CPU performance while audio is active.
|
|
</li>
|
|
<li>
|
|
Minimize audio clock inaccuracy and drift relative to standard time.
|
|
</li>
|
|
<li>
|
|
Minimize audio clock drift relative to the CPU
|
|
<code>
|
|
CLOCK_MONOTONIC
|
|
</code>
|
|
when both are active.
|
|
</li>
|
|
<li>
|
|
Minimize audio latency over on-device transducers.
|
|
</li>
|
|
<li>
|
|
Minimize audio latency over USB digital audio.
|
|
</li>
|
|
<li>
|
|
Document audio latency measurements over all paths.
|
|
</li>
|
|
<li>
|
|
Minimize jitter in audio buffer completion callback entry times, as this affects usable percentage of full CPU bandwidth by the callback.
|
|
</li>
|
|
<li>
|
|
Provide zero audio underruns (output) or overruns (input) under normal use at reported latency.
|
|
</li>
|
|
<li>
|
|
Provide zero inter-channel latency difference.
|
|
</li>
|
|
<li>
|
|
Minimize MIDI mean latency over all transports.
|
|
</li>
|
|
<li>
|
|
Minimize MIDI latency variability under load (jitter) over all transports.
|
|
</li>
|
|
<li>
|
|
Provide accurate MIDI timestamps over all transports.
|
|
</li>
|
|
<li>
|
|
Minimize audio signal noise over on-device transducers, including the period immediately after cold start.
|
|
</li>
|
|
<li>
|
|
Provide zero audio clock difference between the input and output sides of corresponding
|
|
end-points, when both are active. Examples of corresponding end-points include
|
|
the on-device microphone and speaker, or the audio jack input and output.
|
|
</li>
|
|
<li>
|
|
Handle audio buffer completion callbacks for the input and output sides of corresponding
|
|
end-points on the same thread when both are active, and enter the output callback immediately
|
|
after the return from the input callback. Or if it is not feasible to handle the callbacks
|
|
on the same thread, then enter the output callback shortly after entering the input callback
|
|
to permit the application to have a consistent timing of the input and output sides.
|
|
</li>
|
|
<li>
|
|
Minimize the phase difference between HAL audio buffering for the input and output
|
|
sides of corresponding end-points.
|
|
</li>
|
|
<li>
|
|
Minimize touch latency.
|
|
</li>
|
|
<li>
|
|
Minimize touch latency variability under load (jitter).
|
|
</li>
|
|
</ul>
|
|
<h3 id="5_11_capture_for_unprocessed">
|
|
5.11. Capture for Unprocessed
|
|
</h3>
|
|
<p>
|
|
Starting from Android 7.0,
|
|
a new recording source has been added. It can be accessed using
|
|
the
|
|
<code>
|
|
android.media.MediaRecorder.AudioSource.UNPROCESSED
|
|
</code>
|
|
audio
|
|
source. In OpenSL ES, it can be accessed with the record preset
|
|
<code>
|
|
SL_ANDROID_RECORDING_PRESET_UNPROCESSED
|
|
</code>
|
|
.
|
|
</p>
|
|
<p>
|
|
A device MUST satisfy all of the following requirements to report support
|
|
of the unprocessed audio source via the
|
|
<code>
|
|
android.media.AudioManager
|
|
</code>
|
|
property
|
|
<a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED">
|
|
PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED
|
|
</a>:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
The device MUST exhibit approximately flat amplitude-versus-frequency
|
|
characteristics in the mid-frequency range: specifically ±10dB from
|
|
100 Hz to 7000 Hz.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The device MUST exhibit amplitude levels in the low frequency range:
|
|
specifically from ±20 dB from 5 Hz to 100 Hz compared to the mid-frequency range.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The device MUST exhibit amplitude levels in the high frequency range:
|
|
specifically from ±30 dB from 7000 Hz to 22 KHz compared to the mid-frequency range.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Audio input sensitivity MUST be set such that a 1000 Hz sinusoidal tone
|
|
source played at 94 dB Sound Pressure Level (SPL)
|
|
yields a response with RMS of 520 for 16
|
|
bit-samples (or -36 dB Full Scale for floating point/double precision
|
|
samples).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
SNR > 60 dB (difference between 94 dB SPL and equivalent SPL of self
|
|
noise, A-weighted).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Total harmonic distortion MUST be less than 1% for 1 kHZ at 90 dB SPL
|
|
input level at the microphone.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The only signal processing allowed in the path is a level multiplier
|
|
to bring the level to desired range. This level multiplier MUST NOT
|
|
introduce delay or latency to the signal path.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
No other signal processing is allowed in the path, such as Automatic Gain
|
|
Control, High Pass Filter, or Echo Cancellation. If any signal processing
|
|
is present in the architecture for any reason, it MUST be disabled and
|
|
effectively introduce zero delay or extra latency to the signal path.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All SPL measurements are made directly next to the microphone under test.
|
|
</p>
|
|
<p>
|
|
For multiple microphone configurations, these requirements apply to each
|
|
microphone.
|
|
</p>
|
|
<p>
|
|
It is STRONGLY RECOMMENDED that a device satisfy as many of the requirements for the signal
|
|
path for the unprocessed recording source; however, a device must satisfy
|
|
<em>
|
|
all
|
|
</em>
|
|
of these
|
|
requirements, listed above, if it claims to support the unprocessed audio source.
|
|
</p>
|
|
<h2 id="6_developer_tools_and_options_compatibility">
|
|
6. Developer Tools and Options Compatibility
|
|
</h2>
|
|
<h3 id="6_1_developer_tools">
|
|
6.1. Developer Tools
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST support the Android Developer Tools provided in the
|
|
Android SDK. Android compatible devices MUST be compatible with:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<a href="http://developer.android.com/tools/help/adb.html">
|
|
<strong>
|
|
Android Debug Bridge (adb)
|
|
</strong>
|
|
</a>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST support all adb functions as documented in
|
|
the Android SDK including
|
|
<a href="https://source.android.com/devices/input/diagnostics.html">
|
|
dumpsys
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
The device-side adb daemon MUST be inactive by default and there MUST
|
|
be a user-accessible mechanism to turn on the Android Debug Bridge. If a device
|
|
implementation omits USB peripheral mode, it MUST implement the Android Debug
|
|
Bridge via local-area network (such as Ethernet or 802.11).
|
|
</li>
|
|
<li>
|
|
Android includes support for secure adb. Secure adb enables adb on
|
|
known authenticated hosts. Device implementations MUST support secure adb.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="http://developer.android.com/tools/debugging/ddms.html">
|
|
<strong>
|
|
Dalvik Debug Monitor Service (ddms)
|
|
</strong>
|
|
</a>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST support all ddms features as documented in the Android SDK.
|
|
</li>
|
|
<li>
|
|
As ddms uses adb, support for ddms SHOULD be inactive by default, but MUST be supported whenever the user has activated the Android Debug Bridge, as above.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="http://developer.android.com/tools/help/monkey.html">
|
|
<strong>
|
|
Monkey
|
|
</strong>
|
|
</a>
|
|
Device
|
|
implementations MUST include the Monkey framework, and make it available for
|
|
applications to use.
|
|
</li>
|
|
<li>
|
|
<a href="http://developer.android.com/tools/help/systrace.html">
|
|
<strong>
|
|
SysTrace
|
|
</strong>
|
|
</a>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST support systrace tool as documented in the
|
|
Android SDK. Systrace must be inactive by default, and there MUST be a
|
|
user-accessible mechanism to turn on Systrace.
|
|
</li>
|
|
<li>
|
|
Most Linux-based systems and Apple Macintosh systems recognize Android
|
|
devices using the standard Android SDK tools, without additional support;
|
|
however Microsoft Windows systems typically require a driver for new Android
|
|
devices. (For instance, new vendor IDs and sometimes new device IDs require
|
|
custom USB drivers for Windows systems.)
|
|
</li>
|
|
<li>
|
|
If a device implementation is unrecognized by the adb tool as provided
|
|
in the standard Android SDK, device implementers MUST provide Windows drivers
|
|
allowing developers to connect to the device using the adb protocol. These
|
|
drivers MUST be provided for Windows XP, Windows Vista, Windows 7, Windows 8,
|
|
and Windows 10 in both 32-bit and 64-bit versions.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="6_2_developer_options">
|
|
6.2. Developer Options
|
|
</h3>
|
|
<p>
|
|
Android includes support for developers to configure application
|
|
development-related settings. Device implementations MUST honor the
|
|
<a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_DEVELOPMENT_SETTINGS">
|
|
android.settings.APPLICATION_DEVELOPMENT_SETTINGS
|
|
</a>
|
|
intent to show application development-related settings The upstream Android
|
|
implementation hides the Developer Options menu by default and enables users to
|
|
launch Developer Options after pressing seven (7) times on the
|
|
<strong>
|
|
Settings
|
|
</strong>
|
|
>
|
|
<strong>
|
|
About Device
|
|
</strong>
|
|
>
|
|
<strong>
|
|
Build Number
|
|
</strong>
|
|
menu item. Device implementations MUST
|
|
provide a consistent experience for Developer Options. Specifically, device
|
|
implementations MUST hide Developer Options by default and MUST provide a
|
|
mechanism to enable Developer Options that is consistent with the upstream
|
|
Android implementation.
|
|
</p>
|
|
<div class="note">
|
|
Android Automotive implementations MAY limit access to the Developer Options
|
|
menu by visually hiding or disabling the menu when the vehicle is in motion.
|
|
</div>
|
|
<h2 id="7_hardware_compatibility">
|
|
7. Hardware Compatibility
|
|
</h2>
|
|
<p>
|
|
If a device includes a particular hardware component that has a corresponding
|
|
API for third-party developers, the device implementation MUST implement that
|
|
API as described in the Android SDK documentation. If an API in the SDK
|
|
interacts with a hardware component that is stated to be optional and the
|
|
device implementation does not possess that component:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Complete class definitions (as documented by the SDK) for the component
|
|
APIs MUST still be presented.
|
|
</li>
|
|
<li>
|
|
The API’s behaviors MUST be implemented as no-ops in some reasonable
|
|
fashion.
|
|
</li>
|
|
<li>
|
|
API methods MUST return null values where permitted by the SDK
|
|
documentation.
|
|
</li>
|
|
<li>
|
|
API methods MUST return no-op implementations of classes where null values
|
|
are not permitted by the SDK documentation.
|
|
</li>
|
|
<li>
|
|
API methods MUST NOT throw exceptions not documented by the SDK
|
|
documentation.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
A typical example of a scenario where these requirements apply is the telephony
|
|
API: Even on non-phone devices, these APIs must be implemented as reasonable
|
|
no-ops.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST consistently report accurate hardware configuration
|
|
information via the getSystemAvailableFeatures() and hasSystemFeature(String)
|
|
methods on the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager
|
|
</a>
|
|
class for the same build fingerprint.
|
|
</p>
|
|
<h3 id="7_1_display_and_graphics">
|
|
7.1. Display and Graphics
|
|
</h3>
|
|
<p>
|
|
Android includes facilities that automatically adjust application assets and UI
|
|
layouts appropriately for the device to ensure that third-party applications
|
|
run well on a
|
|
<a href="http://developer.android.com/guide/practices/screens_support.html">
|
|
variety of hardware configurations
|
|
</a>.
|
|
Devices MUST properly implement these APIs and behaviors, as detailed in this
|
|
section.
|
|
</p>
|
|
<p>
|
|
The units referenced by the requirements in this section are defined as follows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
physical diagonal size
|
|
</strong>
|
|
. The distance in inches between two opposing
|
|
corners of the illuminated portion of the display.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
dots per inch (dpi)
|
|
</strong>
|
|
. The number of pixels encompassed by a linear
|
|
horizontal or vertical span of 1”. Where dpi values are listed, both horizontal
|
|
and vertical dpi must fall within the range.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
aspect ratio
|
|
</strong>
|
|
. The ratio of the pixels of the longer dimension to the
|
|
shorter dimension of the screen. For example, a display of 480x854 pixels would
|
|
be 854/480 = 1.779, or roughly “16:9”.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
density-independent pixel (dp)
|
|
</strong>
|
|
. The virtual pixel unit normalized to a
|
|
160 dpi screen, calculated as: pixels = dps * (density/160).
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_1_1_screen_configuration">
|
|
7.1.1. Screen Configuration
|
|
</h4>
|
|
<h5 id="7_1_1_1_screen_size">
|
|
7.1.1.1. Screen Size
|
|
</h5>
|
|
<div class="note">
|
|
Android Watch devices (detailed in
|
|
<a href="#2_device_types">
|
|
section 2
|
|
</a>
|
|
) MAY have
|
|
smaller screen sizes as described in this section.
|
|
</div>
|
|
<p>
|
|
The Android UI framework supports a variety of different screen sizes, and
|
|
allows applications to query the device screen size (aka “screen layout") via
|
|
android.content.res.Configuration.screenLayout with the SCREENLAYOUT_SIZE_MASK.
|
|
Device implementations MUST report the correct
|
|
<a href="http://developer.android.com/guide/practices/screens_support.html">
|
|
screen size
|
|
</a>
|
|
as
|
|
defined in the Android SDK documentation and determined by the upstream Android
|
|
platform. Specifically, device implementations MUST report the correct screen
|
|
size according to the following logical density-independent pixel (dp) screen
|
|
dimensions.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Devices MUST have screen sizes of at least 426 dp x 320 dp (‘small’),
|
|
unless it is an Android Watch device.
|
|
</li>
|
|
<li>
|
|
Devices that report screen size ‘normal’ MUST have screen sizes of at least
|
|
480 dp x 320 dp.
|
|
</li>
|
|
<li>
|
|
Devices that report screen size ‘large’ MUST have screen sizes of at least
|
|
640 dp x 480 dp.
|
|
</li>
|
|
<li>
|
|
Devices that report screen size ‘xlarge’ MUST have screen sizes of at least
|
|
960 dp x 720 dp.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
In addition:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Android Watch devices MUST have a screen with the physical diagonal size in
|
|
the range from 1.1 to 2.5 inches.
|
|
</li>
|
|
<li>
|
|
Android Automotive devices MUST have a screen with the physical diagonal
|
|
size greater than or equal to 6 inches.
|
|
</li>
|
|
<li>
|
|
Android Automotive devices MUST have a screen size of at least 750 dp x
|
|
480 dp.
|
|
</li>
|
|
<li>
|
|
Other types of Android device implementations, with a physically integrated
|
|
screen, MUST have a screen at least 2.5 inches in physical diagonal size.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Devices MUST NOT change their reported screen size at any time.
|
|
</p>
|
|
<p>
|
|
Applications optionally indicate which screen sizes they support via the
|
|
<supports-screens> attribute in the AndroidManifest.xml file. Device
|
|
implementations MUST correctly honor applications' stated support for small,
|
|
normal, large, and xlarge screens, as described in the Android SDK
|
|
documentation.
|
|
</p>
|
|
<h5 id="7_1_1_2_screen_aspect_ratio">
|
|
7.1.1.2. Screen Aspect Ratio
|
|
</h5>
|
|
<p>
|
|
While there is no restriction to the screen aspect ratio value of the physical
|
|
screen display, the screen aspect ratio of the surface that third-party apps
|
|
are rendered on and which can be derived from the values reported via the
|
|
<a href="https://developer.android.com/reference/android/util/DisplayMetrics.html">
|
|
DisplayMetrics
|
|
</a>
|
|
MUST meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
If the
|
|
<a href="https://developer.android.com/reference/android/content/res/Configuration.html#uiMode">
|
|
uiMode
|
|
</a>
|
|
is configured as UI_MODE_TYPE_WATCH, the aspect ratio value MAY be set as
|
|
1.0 (1:1).
|
|
</li>
|
|
<li>
|
|
If the third-party app indicates that it is resizeable via the
|
|
<a href="https://developer.android.com/guide/topics/ui/multi-window.html#configuring">
|
|
android:resizeableActivity
|
|
</a>
|
|
attribute, there are no restrictions to the aspect ratio value.
|
|
</li>
|
|
<li>
|
|
For all other cases, the aspect ratio MUST be a value between 1.3333 (4:3)
|
|
and 1.86 (roughly 16:9) unless the app has indicated explicitly that it
|
|
supports a higher screen aspect ratio through the
|
|
<a href="https://developer.android.com/guide/practices/screens_support.html#MaxAspectRatio">
|
|
maxAspectRatio
|
|
</a>
|
|
metadata value.
|
|
</li>
|
|
</ul>
|
|
<h5 id="7_1_1_3_screen_density">
|
|
7.1.1.3. Screen Density
|
|
</h5>
|
|
<p>
|
|
The Android UI framework defines a set of standard logical densities to help
|
|
application developers target application resources. By default, device
|
|
implementations MUST report only one of the following logical Android framework
|
|
densities through the
|
|
<a href="https://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_DEVICE_STABLE">
|
|
DENSITY_DEVICE_STABLE
|
|
</a>
|
|
API and this value MUST NOT change at any time; however, the device MAY report
|
|
a different arbitrary density according to the display configuration changes
|
|
made by the user (for example, display size) set after initial boot.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
120 dpi (ldpi)
|
|
</li>
|
|
<li>
|
|
160 dpi (mdpi)
|
|
</li>
|
|
<li>
|
|
213 dpi (tvdpi)
|
|
</li>
|
|
<li>
|
|
240 dpi (hdpi)
|
|
</li>
|
|
<li>
|
|
260 dpi (260dpi)
|
|
</li>
|
|
<li>
|
|
280 dpi (280dpi)
|
|
</li>
|
|
<li>
|
|
300 dpi (300dpi)
|
|
</li>
|
|
<li>
|
|
320 dpi (xhdpi)
|
|
</li>
|
|
<li>
|
|
340 dpi (340dpi)
|
|
</li>
|
|
<li>
|
|
360 dpi (360dpi)
|
|
</li>
|
|
<li>
|
|
400 dpi (400dpi)
|
|
</li>
|
|
<li>
|
|
420 dpi (420dpi)
|
|
</li>
|
|
<li>
|
|
480 dpi (xxhdpi)
|
|
</li>
|
|
<li>
|
|
560 dpi (560dpi)
|
|
</li>
|
|
<li>
|
|
640 dpi (xxxhdpi)
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations SHOULD define the standard Android framework density
|
|
that is numerically closest to the physical density of the screen, unless that
|
|
logical density pushes the reported screen size below the minimum supported. If
|
|
the standard Android framework density that is numerically closest to the
|
|
physical density results in a screen size that is smaller than the smallest
|
|
supported compatible screen size (320 dp width), device implementations SHOULD
|
|
report the next lowest standard Android framework density.
|
|
</p>
|
|
<p>
|
|
Device implementations are STRONGLY RECOMMENDED to provide users a setting to change
|
|
the display size. If there is an implementation to change the display size of the device,
|
|
it MUST align with the AOSP implementation as indicated below:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The display size MUST NOT be scaled any larger than 1.5 times the native density or
|
|
produce an effective minimum screen dimension smaller than 320dp (equivalent
|
|
to resource qualifier sw320dp), whichever comes first.
|
|
</li>
|
|
<li>
|
|
Display size MUST NOT be scaled any smaller than 0.85 times the native density.
|
|
</li>
|
|
<li>
|
|
To ensure good usability and consistent font sizes, it is RECOMMENDED that the
|
|
following scaling of Native Display options be provided (while complying with the limits
|
|
specified above)
|
|
</li>
|
|
<li>
|
|
Small: 0.85x
|
|
</li>
|
|
<li>
|
|
Default: 1x (Native display scale)
|
|
</li>
|
|
<li>
|
|
Large: 1.15x
|
|
</li>
|
|
<li>
|
|
Larger: 1.3x
|
|
</li>
|
|
<li>
|
|
Largest 1.45x
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_1_2_display_metrics">
|
|
7.1.2. Display Metrics
|
|
</h4>
|
|
<p>
|
|
Device implementations MUST report correct values for all display metrics
|
|
defined in
|
|
<a href="http://developer.android.com/reference/android/util/DisplayMetrics.html">
|
|
android.util.DisplayMetrics
|
|
</a>
|
|
and MUST report the same values regardless of whether the embedded or external
|
|
screen is used as the default display.
|
|
</p>
|
|
<h4 id="7_1_3_screen_orientation">
|
|
7.1.3. Screen Orientation
|
|
</h4>
|
|
<p>
|
|
Devices MUST report which screen orientations they support
|
|
(android.hardware.screen.portrait and/or android.hardware.screen.landscape) and
|
|
MUST report at least one supported orientation. For example, a device with a
|
|
fixed orientation landscape screen, such as a television or laptop, SHOULD only
|
|
report android.hardware.screen.landscape.
|
|
</p>
|
|
<p>
|
|
Devices that report both screen orientations MUST support dynamic orientation
|
|
by applications to either portrait or landscape screen orientation. That is,
|
|
the device must respect the application’s request for a specific screen
|
|
orientation. Device implementations MAY select either portrait or landscape
|
|
orientation as the default.
|
|
</p>
|
|
<p>
|
|
Devices MUST report the correct value for the device’s current orientation,
|
|
whenever queried via the android.content.res.Configuration.orientation,
|
|
android.view.Display.getOrientation(), or other APIs.
|
|
</p>
|
|
<p>
|
|
Devices MUST NOT change the reported screen size or density when changing orientation.
|
|
</p>
|
|
<h4 id="7_1_4_2d_and_3d_graphics_acceleration">
|
|
7.1.4. 2D and 3D Graphics Acceleration
|
|
</h4>
|
|
<p>
|
|
Device implementations MUST support both OpenGL ES 1.0 and 2.0, as embodied and
|
|
detailed in the Android SDK documentations. Device implementations SHOULD
|
|
support OpenGL ES 3.0, 3.1, or 3.2 on devices capable of supporting it. Device
|
|
implementations MUST also support
|
|
<a href="http://developer.android.com/guide/topics/renderscript/">
|
|
Android RenderScript
|
|
</a>,
|
|
as detailed in the Android SDK documentation.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST also correctly identify themselves as supporting
|
|
OpenGL ES 1.0, OpenGL ES 2.0, OpenGL ES 3.0, OpenGL 3.1, or OpenGL 3.2. That is:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The managed APIs (such as via the GLES10.getString() method) MUST report
|
|
support for OpenGL ES 1.0 and OpenGL ES 2.0.
|
|
</li>
|
|
<li>
|
|
The native C/C++ OpenGL APIs (APIs available to apps via libGLES_v1CM.so,
|
|
libGLES_v2.so, or libEGL.so) MUST report support for OpenGL ES 1.0 and OpenGL
|
|
ES 2.0.
|
|
</li>
|
|
<li>
|
|
Device implementations that declare support for OpenGL ES 3.0, 3.1, or 3.2 MUST
|
|
support the corresponding managed APIs and include support for native C/C++
|
|
APIs. On device implementations that declare support for OpenGL ES 3.0, 3.1, or
|
|
3.2 libGLESv2.so MUST export the corresponding function symbols in addition to
|
|
the OpenGL ES 2.0 function symbols.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Android provides an OpenGL ES
|
|
<a href="https://developer.android.com/reference/android/opengl/GLES31Ext.html">
|
|
extension pack
|
|
</a>
|
|
with Java interfaces and native support for advanced graphics functionality
|
|
such as tessellation and the ASTC texture compression format. Android device
|
|
implementations MUST support the extension pack if the device supports OpenGL
|
|
ES 3.2 and MAY support it otherwise. If the extension pack is supported in its
|
|
entirety, the device MUST identify the support through the
|
|
<code>
|
|
android.hardware.opengles.aep
|
|
</code>
|
|
feature flag.
|
|
</p>
|
|
<p>
|
|
Also, device implementations MAY implement any desired OpenGL ES extensions.
|
|
However, device implementations MUST report via the OpenGL ES managed and
|
|
native APIs all extension strings that they do support, and conversely MUST NOT
|
|
report extension strings that they do not support.
|
|
</p>
|
|
<p>
|
|
Note that Android includes support for applications to optionally specify that
|
|
they require specific OpenGL texture compression formats. These formats are
|
|
typically vendor-specific. Device implementations are not required by Android
|
|
to implement any specific texture compression format. However, they SHOULD
|
|
accurately report any texture compression formats that they do support, via the
|
|
getString() method in the OpenGL API.
|
|
</p>
|
|
<p>
|
|
Android includes a mechanism for applications to declare that they want to
|
|
enable hardware acceleration for 2D graphics at the Application, Activity,
|
|
Window, or View level through the use of a manifest tag
|
|
<a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html">
|
|
android:hardwareAccelerated
|
|
</a>
|
|
or direct API calls.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST enable hardware acceleration by default, and MUST
|
|
disable hardware acceleration if the developer so requests by setting
|
|
android:hardwareAccelerated="false” or disabling hardware acceleration directly
|
|
through the Android View APIs.
|
|
</p>
|
|
<p>
|
|
In addition, device implementations MUST exhibit behavior consistent with the
|
|
Android SDK documentation on
|
|
<a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html">
|
|
hardware
|
|
acceleration
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Android includes a TextureView object that lets developers directly integrate
|
|
hardware-accelerated OpenGL ES textures as rendering targets in a UI hierarchy.
|
|
Device implementations MUST support the TextureView API, and MUST exhibit
|
|
consistent behavior with the upstream Android implementation.
|
|
</p>
|
|
<p>
|
|
Android includes support for EGL_ANDROID_RECORDABLE, an EGLConfig attribute
|
|
that indicates whether the EGLConfig supports rendering to an ANativeWindow
|
|
that records images to a video. Device implementations MUST support
|
|
<a href="https://www.khronos.org/registry/egl/extensions/ANDROID/EGL_ANDROID_recordable.txt">
|
|
EGL_ANDROID_RECORDABLE
|
|
</a>
|
|
extension.
|
|
</p>
|
|
<h4 id="7_1_5_legacy_application_compatibility_mode">
|
|
7.1.5. Legacy Application Compatibility Mode
|
|
</h4>
|
|
<p>
|
|
Android specifies a “compatibility mode” in which the framework operates in a
|
|
'normal' screen size equivalent (320dp width) mode for the benefit of legacy
|
|
applications not developed for old versions of Android that pre-date
|
|
screen-size independence.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Android Automotive does not support legacy compatibility mode.
|
|
</li>
|
|
<li>
|
|
All other device implementations MUST include support for legacy
|
|
application compatibility mode as implemented by the upstream Android open
|
|
source code. That is, device implementations MUST NOT alter the triggers or
|
|
thresholds at which compatibility mode is activated, and MUST NOT alter the
|
|
behavior of the compatibility mode itself.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_1_6_screen_technology">
|
|
7.1.6. Screen Technology
|
|
</h4>
|
|
<p>
|
|
The Android platform includes APIs that allow applications to render rich
|
|
graphics to the display. Devices MUST support all of these APIs as defined by
|
|
the Android SDK unless specifically allowed in this document.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Devices MUST support displays capable of rendering 16-bit color graphics
|
|
and SHOULD support displays capable of 24-bit color graphics.
|
|
</li>
|
|
<li>
|
|
Devices MUST support displays capable of rendering animations.
|
|
</li>
|
|
<li>
|
|
The display technology used MUST have a pixel aspect ratio (PAR) between
|
|
0.9 and 1.15. That is, the pixel aspect ratio MUST be near square (1.0) with a
|
|
10 ~ 15% tolerance.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_1_7_secondary_displays">
|
|
7.1.7. Secondary Displays
|
|
</h4>
|
|
<p>
|
|
Android includes support for secondary display to enable media sharing
|
|
capabilities and developer APIs for accessing external displays. If a device
|
|
supports an external display either via a wired, wireless, or an embedded
|
|
additional display connection then the device implementation MUST implement the
|
|
<a href="http://developer.android.com/reference/android/hardware/display/DisplayManager.html">
|
|
display manager
|
|
API
|
|
</a>
|
|
as described in the Android SDK documentation.
|
|
</p>
|
|
<h3 id="7_2_input_devices">
|
|
7.2. Input Devices
|
|
</h3>
|
|
<p>
|
|
Devices MUST support a touchscreen or meet the requirements listed in 7.2.2 for
|
|
non-touch navigation.
|
|
</p>
|
|
<h4 id="7_2_1_keyboard">
|
|
7.2.1. Keyboard
|
|
</h4>
|
|
<div class="note">
|
|
Android Watch and Android Automotive implementations MAY implement a soft
|
|
keyboard. All other device implementations MUST implement a soft keyboard and:
|
|
</div>
|
|
<p>
|
|
Device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST include support for the Input Management Framework (which allows
|
|
third-party developers to create Input Method Editors—i.e. soft keyboard) as
|
|
detailed at
|
|
<a href="http://developer.android.com">
|
|
http://developer.android.com
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST provide at least one soft keyboard implementation (regardless of
|
|
whether a hard keyboard is present) except for Android Watch devices where the
|
|
screen size makes it less reasonable to have a soft keyboard.
|
|
</li>
|
|
<li>
|
|
MAY include additional soft keyboard implementations.
|
|
</li>
|
|
<li>
|
|
MAY include a hardware keyboard.
|
|
</li>
|
|
<li>
|
|
MUST NOT include a hardware keyboard that does not match one of the formats
|
|
specified in
|
|
<a href="http://developer.android.com/reference/android/content/res/Configuration.html">
|
|
android.content.res.Configuration.keyboard
|
|
</a>
|
|
(QWERTY or 12-key).
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_2_2_non-touch_navigation">
|
|
7.2.2. Non-touch Navigation
|
|
</h4>
|
|
<div class="note">
|
|
Android Television devices MUST support D-pad.
|
|
</div>
|
|
<p>
|
|
Device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MAY omit a non-touch navigation option (trackball, d-pad, or wheel) if the
|
|
device implementation is not an Android Television device.
|
|
</li>
|
|
<li>
|
|
MUST report the correct value for
|
|
<a href="http://developer.android.com/reference/android/content/res/Configuration.html">
|
|
android.content.res.Configuration.navigation
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST provide a reasonable alternative user interface mechanism for the
|
|
selection and editing of text, compatible with Input Management Engines. The
|
|
upstream Android open source implementation includes a selection mechanism
|
|
suitable for use with devices that lack non-touch navigation inputs.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_2_3_navigation_keys">
|
|
7.2.3. Navigation Keys
|
|
</h4>
|
|
<div class="note">
|
|
The availability and visibility requirement of the Home, Recents, and Back
|
|
functions differ between device types as described in this section.
|
|
</div>
|
|
<p>
|
|
The Home, Recents, and Back functions (mapped to the key events KEYCODE_HOME,
|
|
KEYCODE_APP_SWITCH, KEYCODE_BACK, respectively) are essential to the Android
|
|
navigation paradigm and therefore:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Android Handheld device implementations MUST provide the Home, Recents, and
|
|
Back functions.
|
|
</li>
|
|
<li>
|
|
Android Television device implementations MUST provide the Home and Back
|
|
functions.
|
|
</li>
|
|
<li>
|
|
Android Watch device implementations MUST have the Home function available
|
|
to the user, and the Back function except for when it is in
|
|
<code>
|
|
UI_MODE_TYPE_WATCH
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
Android Watch device implementations, and no other Android device types,
|
|
MAY consume the long press event on the key event
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK">
|
|
<code>
|
|
KEYCODE_BACK
|
|
</code>
|
|
</a>
|
|
and omit it from being sent to the foreground application.
|
|
</li>
|
|
<li>
|
|
Android Automotive implementations MUST provide the Home function and MAY
|
|
provide Back and Recent functions.
|
|
</li>
|
|
<li>
|
|
All other types of device implementations MUST provide the Home and Back
|
|
functions.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
These functions MAY be implemented via dedicated physical buttons (such as
|
|
mechanical or capacitive touch buttons), or MAY be implemented using dedicated
|
|
software keys on a distinct portion of the screen, gestures, touch panel, etc.
|
|
Android supports both implementations. All of these functions MUST be accessible
|
|
with a single action (e.g. tap, double-click or gesture) when visible.
|
|
</p>
|
|
<p>
|
|
Recents function, if provided, MUST have a visible button or icon unless hidden
|
|
together with other navigation functions in full-screen mode. This does not
|
|
apply to devices upgrading from earlier Android versions that have physical
|
|
buttons for navigation and no recents key.
|
|
</p>
|
|
<p>
|
|
The Home and Back functions, if provided, MUST each have a visible button or
|
|
icon unless hidden together with other navigation functions in full-screen mode
|
|
or when the uiMode UI_MODE_TYPE_MASK is set to UI_MODE_TYPE_WATCH.
|
|
</p>
|
|
<p>
|
|
The Menu function is deprecated in favor of action bar since Android 4.0.
|
|
Therefore the new device implementations shipping with Android 7.1
|
|
and later MUST NOT implement a dedicated physical button for the Menu function.
|
|
Older device implementations SHOULD NOT implement a dedicated physical button
|
|
for the Menu function, but if the physical Menu button is implemented and the
|
|
device is running applications with targetSdkVersion > 10, the device
|
|
implementation:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST display the action overflow button on the action bar when it is visible
|
|
and the resulting action overflow menu popup is not empty. For a device
|
|
implementation launched before Android 4.4 but upgrading to Android
|
|
7.1, this is RECOMMENDED.
|
|
</li>
|
|
<li>
|
|
MUST NOT modify the position of the action overflow popup displayed by
|
|
selecting the overflow button in the action bar.
|
|
</li>
|
|
<li>
|
|
MAY render the action overflow popup at a modified position on the screen
|
|
when it is displayed by selecting the physical menu button.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
For backwards compatibility, device implementations MUST make the Menu function
|
|
available to applications when targetSdkVersion is less than 10, either by a
|
|
physical button, a software key, or gestures. This Menu function should be
|
|
presented unless hidden together with other navigation functions.
|
|
</p>
|
|
<p>
|
|
Android device implementations supporting the
|
|
<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST">
|
|
Assist action
|
|
</a>
|
|
and/or
|
|
<a href="https://developer.android.com/reference/android/service/voice/VoiceInteractionService.html">
|
|
<code>
|
|
VoiceInteractionService
|
|
</code>
|
|
</a>
|
|
MUST be able to launch an assist app with a single interaction (e.g. tap,
|
|
double-click, or gesture) when other navigation keys are visible. It is STRONGLY
|
|
RECOMMENDED to use long press on home as this interaction. The designated
|
|
interaction MUST launch the user-selected assist app, in other words the app
|
|
that implements a VoiceInteractionService, or an activity handling the ACTION_ASSIST intent.
|
|
</p>
|
|
<p>
|
|
Device implementations MAY use a distinct portion of the screen to display the
|
|
navigation keys, but if so, MUST meet these requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device implementation navigation keys MUST use a distinct portion of the
|
|
screen, not available to applications, and MUST NOT obscure or otherwise
|
|
interfere with the portion of the screen available to applications.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST make available a portion of the display to
|
|
applications that meets the requirements defined in
|
|
<a href="#7_1_1_screen_configuration">
|
|
section
|
|
7.1.1
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST display the navigation keys when applications do
|
|
not specify a system UI mode, or specify SYSTEM_UI_FLAG_VISIBLE.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST present the navigation keys in an unobtrusive
|
|
“low profile” (eg. dimmed) mode when applications specify
|
|
SYSTEM_UI_FLAG_LOW_PROFILE.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST hide the navigation keys when applications
|
|
specify SYSTEM_UI_FLAG_HIDE_NAVIGATION.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_2_4_touchscreen_input">
|
|
7.2.4. Touchscreen Input
|
|
</h4>
|
|
<div class="note">
|
|
Android Handhelds and Watch Devices MUST support touchscreen input.
|
|
</div>
|
|
<p>
|
|
Device implementations SHOULD have a pointer input system of some kind (either
|
|
mouse-like or touch). However, if a device implementation does not support a
|
|
pointer input system, it MUST NOT report the android.hardware.touchscreen or
|
|
android.hardware.faketouch feature constant. Device implementations that do
|
|
include a pointer input system:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD support fully independently tracked pointers, if the device input
|
|
system supports multiple pointers.
|
|
</li>
|
|
<li>
|
|
MUST report the value of
|
|
<a href="http://developer.android.com/reference/android/content/res/Configuration.html">
|
|
android.content.res.Configuration.touchscreen
|
|
</a>
|
|
corresponding to the type of the specific touchscreen on the device.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Android includes support for a variety of touchscreens, touch pads, and fake
|
|
touch input devices.
|
|
<a href="http://source.android.com/devices/tech/input/touch-devices.html">
|
|
Touchscreen-based device implementations
|
|
</a>
|
|
are associated with a display such that the user has the impression of directly
|
|
manipulating items on screen. Since the user is directly touching the screen,
|
|
the system does not require any additional affordances to indicate the objects
|
|
being manipulated. In contrast, a fake touch interface provides a user input
|
|
system that approximates a subset of touchscreen capabilities. For example, a
|
|
mouse or remote control that drives an on-screen cursor approximates touch, but
|
|
requires the user to first point or focus then click. Numerous input devices
|
|
like the mouse, trackpad, gyro-based air mouse, gyro-pointer, joystick, and
|
|
multi-touch trackpad can support fake touch interactions. Android includes the
|
|
feature constant android.hardware.faketouch, which corresponds to a
|
|
high-fidelity non-touch (pointer-based) input device such as a mouse or trackpad
|
|
that can adequately emulate touch-based input (including basic gesture support),
|
|
and indicates that the device supports an emulated subset of touchscreen
|
|
functionality. Device implementations that declare the fake touch feature MUST
|
|
meet the fake touch requirements in
|
|
<a href="#7_2_5_fake_touch_input">
|
|
section 7.2.5
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST report the correct feature corresponding to the type
|
|
of input used. Device implementations that include a touchscreen (single-touch
|
|
or better) MUST report the platform feature constant
|
|
android.hardware.touchscreen. Device implementations that report the platform
|
|
feature constant android.hardware.touchscreen MUST also report the platform
|
|
feature constant android.hardware.faketouch. Device implementations that do not
|
|
include a touchscreen (and rely on a pointer device only) MUST NOT report any
|
|
touchscreen feature, and MUST report only android.hardware.faketouch if they
|
|
meet the fake touch requirements in
|
|
<a href="#7_2_5_fake_touch_input">
|
|
section 7.2.5
|
|
</a>.
|
|
</p>
|
|
<h4 id="7_2_5_fake_touch_input">
|
|
7.2.5. Fake Touch Input
|
|
</h4>
|
|
<p>
|
|
Device implementations that declare support for android.hardware.faketouch:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html">
|
|
absolute X and Y screen positions
|
|
</a>
|
|
of the pointer location and display a visual pointer on the screen.
|
|
</li>
|
|
<li>
|
|
MUST report touch event with the action code that specifies the state change
|
|
that occurs on the pointer
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html">
|
|
going down or up on the
|
|
screen
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST support pointer down and up on an object on the screen, which allows
|
|
users to emulate tap on an object on the screen.
|
|
</li>
|
|
<li>
|
|
MUST support pointer down, pointer up, pointer down then pointer up in the
|
|
same place on an object on the screen within a time threshold, which allows
|
|
users to
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html">
|
|
emulate double tap
|
|
</a>
|
|
on an object on the screen.
|
|
</li>
|
|
<li>
|
|
MUST support pointer down on an arbitrary point on the screen, pointer move
|
|
to any other arbitrary point on the screen, followed by a pointer up, which
|
|
allows users to emulate a touch drag.
|
|
</li>
|
|
<li>
|
|
MUST support pointer down then allow users to quickly move the object to a
|
|
different position on the screen and then pointer up on the screen, which allows
|
|
users to fling an object on the screen.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Devices that declare support for android.hardware.faketouch.multitouch.distinct
|
|
MUST meet the requirements for faketouch above, and MUST also support distinct
|
|
tracking of two or more independent pointer inputs.
|
|
</p>
|
|
<h4 id="7_2_6_game_controller_support">
|
|
7.2.6. Game Controller Support
|
|
</h4>
|
|
<p>
|
|
Android Television device implementations MUST support button mappings for game
|
|
controllers as listed below. The upstream Android implementation includes
|
|
implementation for game controllers that satisfies this requirement.
|
|
</p>
|
|
<h5 id="7_2_6_1_button_mappings">
|
|
7.2.6.1. Button Mappings
|
|
</h5>
|
|
<p>
|
|
Android Television device implementations MUST support the following key mappings:
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Button
|
|
</th>
|
|
<th>
|
|
HID Usage
|
|
<sup>
|
|
2
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
Android Button
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_A">
|
|
A
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0001
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_A (96)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_B">
|
|
B
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0002
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_B (97)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_X">
|
|
X
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0004
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_X (99)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_Y">
|
|
Y
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0005
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_Y (100)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_UP">
|
|
D-pad up
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
<br/>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_DOWN">
|
|
D-pad down
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x01 0x0039
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_HAT_Y">
|
|
AXIS_HAT_Y
|
|
</a>
|
|
<sup>
|
|
4
|
|
</sup>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_LEFT">
|
|
D-pad left
|
|
</a>
|
|
1
|
|
<br/>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_RIGHT">
|
|
D-pad right
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x01 0x0039
|
|
<sup>
|
|
3
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_HAT_X">
|
|
AXIS_HAT_X
|
|
</a>
|
|
<sup>
|
|
4
|
|
</sup>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_L1">
|
|
Left shoulder button
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0007
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_L1 (102)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_R1">
|
|
Right shoulder button
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x0008
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_R1 (103)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_THUMBL">
|
|
Left stick click
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x000E
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_THUMBL (106)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_THUMBR">
|
|
Right stick click
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x09 0x000F
|
|
</td>
|
|
<td>
|
|
KEYCODE_BUTTON_THUMBR (107)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME">
|
|
Home
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x0c 0x0223
|
|
</td>
|
|
<td>
|
|
KEYCODE_HOME (3)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK">
|
|
Back
|
|
</a>
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</td>
|
|
<td>
|
|
0x0c 0x0224
|
|
</td>
|
|
<td>
|
|
KEYCODE_BACK (4)
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html">
|
|
KeyEvent
|
|
</a>
|
|
</p>
|
|
<p class="table_footnote">
|
|
2 The above HID usages must be declared within a Game
|
|
pad CA (0x01 0x0005).
|
|
</p>
|
|
<p class="table_footnote">
|
|
3 This usage must have a Logical Minimum of 0, a
|
|
Logical Maximum of 7, a Physical Minimum of 0, a Physical Maximum of 315, Units
|
|
in Degrees, and a Report Size of 4. The logical value is defined to be the
|
|
clockwise rotation away from the vertical axis; for example, a logical value of
|
|
0 represents no rotation and the up button being pressed, while a logical value
|
|
of 1 represents a rotation of 45 degrees and both the up and left keys being
|
|
pressed.
|
|
</p>
|
|
<p class="table_footnote">
|
|
4
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html">
|
|
MotionEvent
|
|
</a>
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Analog Controls
|
|
<sup>
|
|
1
|
|
</sup>
|
|
</th>
|
|
<th>
|
|
HID Usage
|
|
</th>
|
|
<th>
|
|
Android Button
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_LTRIGGER">
|
|
Left Trigger
|
|
</a>
|
|
</td>
|
|
<td>
|
|
0x02 0x00C5
|
|
</td>
|
|
<td>
|
|
AXIS_LTRIGGER
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_THROTTLE">
|
|
Right Trigger
|
|
</a>
|
|
</td>
|
|
<td>
|
|
0x02 0x00C4
|
|
</td>
|
|
<td>
|
|
AXIS_RTRIGGER
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_Y">
|
|
Left Joystick
|
|
</a>
|
|
</td>
|
|
<td>
|
|
0x01 0x0030
|
|
<br/>
|
|
0x01 0x0031
|
|
</td>
|
|
<td>
|
|
AXIS_X
|
|
<br/>
|
|
AXIS_Y
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_Z">
|
|
Right Joystick
|
|
</a>
|
|
</td>
|
|
<td>
|
|
0x01 0x0032
|
|
<br/>
|
|
0x01 0x0035
|
|
</td>
|
|
<td>
|
|
AXIS_Z
|
|
<br/>
|
|
AXIS_RZ
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="table_footnote">
|
|
1
|
|
<a href="http://developer.android.com/reference/android/view/MotionEvent.html">
|
|
MotionEvent
|
|
</a>
|
|
</p>
|
|
<h4 id="7_2_7_remote_control">
|
|
7.2.7. Remote Control
|
|
</h4>
|
|
<p>
|
|
Android Television device implementations SHOULD provide a remote control to
|
|
allow users to access the TV interface. The remote control MAY be a physical
|
|
remote or can be a software-based remote that is accessible from a mobile phone
|
|
or tablet. The remote control MUST meet the requirements defined below.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Search affordance
|
|
</strong>
|
|
. Device implementations MUST fire KEYCODE_SEARCH
|
|
(or KEYCODE_ASSIST if the device supports an assistant) when the user
|
|
invokes voice search on either the physical or software-based remote.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Navigation
|
|
</strong>
|
|
. All Android Television remotes MUST include
|
|
<a href="http://developer.android.com/reference/android/view/KeyEvent.html">
|
|
Back, Home, and Select buttons and support for D-pad events
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<h3 id="7_3_sensors">
|
|
7.3. Sensors
|
|
</h3>
|
|
<p>
|
|
Android includes APIs for accessing a variety of sensor types. Devices
|
|
implementations generally MAY omit these sensors, as provided for in the
|
|
following subsections. If a device includes a particular sensor type that has a
|
|
corresponding API for third-party developers, the device implementation MUST
|
|
implement that API as described in the Android SDK documentation and the
|
|
Android Open Source documentation on
|
|
<a href="http://source.android.com/devices/sensors/">
|
|
sensors
|
|
</a>. For example, device
|
|
implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST accurately report the presence or absence of sensors per the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager
|
|
</a>
|
|
class.
|
|
</li>
|
|
<li>
|
|
MUST return an accurate list of supported sensors via the
|
|
SensorManager.getSensorList() and similar methods.
|
|
</li>
|
|
<li>
|
|
MUST behave reasonably for all other sensor APIs (for example, by returning
|
|
true or false as appropriate when applications attempt to register listeners,
|
|
not calling sensor listeners when the corresponding sensors are not present;
|
|
etc.).
|
|
</li>
|
|
<li>
|
|
MUST
|
|
<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">
|
|
report all sensor measurements
|
|
</a>
|
|
using the relevant International System of Units (metric) values for each
|
|
sensor type as defined in the Android SDK documentation.
|
|
</li>
|
|
<li>
|
|
SHOULD
|
|
<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html#timestamp">
|
|
report the event time
|
|
</a>
|
|
in nanoseconds as defined in the Android SDK documentation, representing the
|
|
time the event happened and synchronized with the
|
|
SystemClock.elapsedRealtimeNano() clock. Existing and new Android devices are
|
|
<strong>
|
|
STRONGLY RECOMMENDED
|
|
</strong>
|
|
to meet these requirements so they will be able to
|
|
upgrade to the future platform releases where this might become a REQUIRED
|
|
component. The synchronization error SHOULD be below 100 milliseconds.
|
|
</li>
|
|
<li>
|
|
MUST report sensor data with a maximum latency of 100 milliseconds + 2 *
|
|
sample_time for the case of a sensor streamed with a minimum required latency
|
|
of 5 ms + 2 * sample_time when the application processor is active. This delay
|
|
does not include any filtering delays.
|
|
</li>
|
|
<li>
|
|
MUST report the first sensor sample within 400 milliseconds + 2 *
|
|
sample_time of the sensor being activated. It is acceptable for this sample to
|
|
have an accuracy of 0.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The list above is not comprehensive; the documented behavior of the Android SDK
|
|
and the Android Open Source Documentations on
|
|
<a href="http://source.android.com/devices/sensors/">
|
|
sensors
|
|
</a>
|
|
is to be considered
|
|
authoritative.
|
|
</p>
|
|
<p>
|
|
Some sensor types are composite, meaning they can be derived from data provided
|
|
by one or more other sensors. (Examples include the orientation sensor and the
|
|
linear acceleration sensor.) Device implementations SHOULD implement these
|
|
sensor types, when they include the prerequisite physical sensors as described
|
|
in
|
|
<a href="https://source.android.com/devices/sensors/sensor-types.html">
|
|
sensor types
|
|
</a>. If a
|
|
device implementation includes a composite sensor it MUST implement the sensor
|
|
as described in the Android Open Source documentation on
|
|
<a href="https://source.android.com/devices/sensors/sensor-types.html#composite_sensor_type_summary">
|
|
composite sensors
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Some Android sensors support a
|
|
<a href="https://source.android.com/devices/sensors/report-modes.html#continuous">
|
|
“continuous” trigger mode
|
|
</a>,
|
|
which returns data continuously. For any API indicated by the Android SDK
|
|
documentation to be a continuous sensor, device implementations MUST
|
|
continuously provide periodic data samples that SHOULD have a jitter below 3%,
|
|
where jitter is defined as the standard deviation of the difference of the
|
|
reported timestamp values between consecutive events.
|
|
</p>
|
|
<p>
|
|
Note that the device implementations MUST ensure that the sensor event stream
|
|
MUST NOT prevent the device CPU from entering a suspend state or waking up from
|
|
a suspend state.
|
|
</p>
|
|
<p>
|
|
Finally, when several sensors are activated, the power consumption SHOULD NOT
|
|
exceed the sum of the individual sensor’s reported power consumption.
|
|
</p>
|
|
<h4 id="7_3_1_accelerometer">
|
|
7.3.1. Accelerometer
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a 3-axis accelerometer. Android Handheld
|
|
devices, Android Automotive implementations, and Android Watch devices are STRONGLY
|
|
RECOMMENDED to include this sensor. If a device implementation does include a
|
|
3-axis accelerometer, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement and report
|
|
<a href="http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ACCELEROMETER">
|
|
TYPE_ACCELEROMETER sensor
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST be able to report events up to a frequency of at least 50 Hz for
|
|
Android Watch devices as such devices have a stricter power constraint and 100
|
|
Hz for all other device types.
|
|
</li>
|
|
<li>
|
|
SHOULD report events up to at least 200 Hz.
|
|
</li>
|
|
<li>
|
|
MUST comply with the
|
|
<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">
|
|
Android sensor coordinate system
|
|
</a>
|
|
as detailed in the Android APIs. Android Automotive implementations MUST comply
|
|
with the Android
|
|
<a href="http://source.android.com/devices/sensors/sensor-types.html#auto_axes">
|
|
car sensor coordinate system
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST be capable of measuring from freefall up to four times the gravity
|
|
(4g) or more on any axis.
|
|
</li>
|
|
<li>
|
|
MUST have a resolution of at least 12-bits and SHOULD have a resolution of
|
|
at least 16-bits.
|
|
</li>
|
|
<li>
|
|
SHOULD be calibrated while in use if the characteristics changes over the
|
|
life cycle and compensated, and preserve the compensation parameters between
|
|
device reboots.
|
|
</li>
|
|
<li>
|
|
SHOULD be temperature compensated.
|
|
</li>
|
|
<li>
|
|
MUST have a standard deviation no greater than 0.05 m/s^, where the
|
|
standard deviation should be calculated on a per axis basis on samples
|
|
collected over a period of at least 3 seconds at the fastest sampling rate.
|
|
</li>
|
|
<li>
|
|
SHOULD implement the TYPE_SIGNIFICANT_MOTION, TYPE_TILT_DETECTOR,
|
|
TYPE_STEP_DETECTOR, TYPE_STEP_COUNTER composite sensors as described in the
|
|
Android SDK document. Existing and new Android devices are
|
|
<strong>
|
|
STRONGLY
|
|
RECOMMENDED
|
|
</strong>
|
|
to implement the TYPE_SIGNIFICANT_MOTION composite sensor. If any
|
|
of these sensors are implemented, the sum of their power consumption MUST
|
|
always be less than 4 mW and SHOULD each be below 2 mW and 0.5 mW for when the
|
|
device is in a dynamic or static condition.
|
|
</li>
|
|
<li>
|
|
If a gyroscope sensor is included, MUST implement the TYPE_GRAVITY and
|
|
TYPE_LINEAR_ACCELERATION composite sensors and SHOULD implement the
|
|
TYPE_GAME_ROTATION_VECTOR composite sensor. Existing and new Android devices
|
|
are STRONGLY RECOMMENDED to implement the TYPE_GAME_ROTATION_VECTOR sensor.
|
|
</li>
|
|
<li>
|
|
MUST implement a TYPE_ROTATION_VECTOR composite sensor, if a gyroscope
|
|
sensor and a magnetometer sensor is also included.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_2_magnetometer">
|
|
7.3.2. Magnetometer
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a 3-axis magnetometer (compass). If a
|
|
device does include a 3-axis magnetometer, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement the TYPE_MAGNETIC_FIELD sensor and SHOULD also implement
|
|
TYPE_MAGNETIC_FIELD_UNCALIBRATED sensor. Existing and new Android devices are
|
|
STRONGLY RECOMMENDED to implement the TYPE_MAGNETIC_FIELD_UNCALIBRATED sensor.
|
|
</li>
|
|
<li>
|
|
MUST be able to report events up to a frequency of at least 10 Hz and
|
|
SHOULD report events up to at least 50 Hz.
|
|
</li>
|
|
<li>
|
|
MUST comply with the
|
|
<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">
|
|
Android sensor coordinate system
|
|
</a>
|
|
as detailed in the Android APIs.
|
|
</li>
|
|
<li>
|
|
MUST be capable of measuring between -900 µT and +900 µT on each axis
|
|
before saturating.
|
|
</li>
|
|
<li>
|
|
MUST have a hard iron offset value less than 700 µT and SHOULD have a value
|
|
below 200 µT, by placing the magnetometer far from dynamic (current-induced)
|
|
and static (magnet-induced) magnetic fields.
|
|
</li>
|
|
<li>
|
|
MUST have a resolution equal or denser than 0.6 µT and SHOULD have a
|
|
resolution equal or denser than 0.2 µT.
|
|
</li>
|
|
<li>
|
|
SHOULD be temperature compensated.
|
|
</li>
|
|
<li>
|
|
MUST support online calibration and compensation of the hard iron bias, and
|
|
preserve the compensation parameters between device reboots.
|
|
</li>
|
|
<li>
|
|
MUST have the soft iron compensation applied—the calibration can be done
|
|
either while in use or during the production of the device.
|
|
</li>
|
|
<li>
|
|
SHOULD have a standard deviation, calculated on a per axis basis on samples
|
|
collected over a period of at least 3 seconds at the fastest sampling rate, no
|
|
greater than 0.5 µT.
|
|
</li>
|
|
<li>
|
|
MUST implement a TYPE_ROTATION_VECTOR composite sensor, if an accelerometer
|
|
sensor and a gyroscope sensor is also included.
|
|
</li>
|
|
<li>
|
|
MAY implement the TYPE_GEOMAGNETIC_ROTATION_VECTOR sensor if an
|
|
accelerometer sensor is also implemented. However if implemented, it MUST
|
|
consume less than 10 mW and SHOULD consume less than 3 mW when the sensor is
|
|
registered for batch mode at 10 Hz.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_3_gps">
|
|
7.3.3. GPS
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a GPS/GNSS receiver. If a device implementation
|
|
does include a GPS/GNSS receiver and reports the capability to applications through the
|
|
<code>
|
|
android.hardware.location.gps
|
|
</code>
|
|
feature flag:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
It is STRONGLY RECOMMENDED that the device continue to deliver normal GPS/GNSS
|
|
outputs to applications during an emergency phone call and that location output
|
|
not be blocked during an emergency phone call.
|
|
</li>
|
|
<li>
|
|
It MUST support location outputs at a rate of at least 1 Hz when requested via
|
|
<code>
|
|
LocationManager#requestLocationUpdate
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
It MUST be able to determine the location in open-sky conditions (strong signals,
|
|
negligible multipath, HDOP < 2) within 10 seconds (fast time to first fix), when
|
|
connected to a 0.5 Mbps or faster data speed internet connection. This requirement
|
|
is typically met by the use of some form of Assisted or Predicted GPS/GNSS technique
|
|
to minimize GPS/GNSS lock-on time (Assistance data includes Reference Time, Reference
|
|
Location and Satellite Ephemeris/Clock).
|
|
<ul>
|
|
<li>
|
|
After making such a location calculation, it is STRONGLY RECOMMENDED for the device to
|
|
be able to determine its location, in open sky, within 10 seconds, when location
|
|
requests are restarted, up to an hour after the initial location calculation,
|
|
even when the subsequent request is made without a data connection, and/or after a power
|
|
cycle.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
In open sky conditions after determining the location, while stationary or moving with less
|
|
than 1 meter per second squared of acceleration:
|
|
<ul>
|
|
<li>
|
|
It MUST be able to determine location within 20 meters, and speed within 0.5 meters
|
|
per second, at least 95% of the time.
|
|
</li>
|
|
<li>
|
|
It MUST simultaneously track and report via
|
|
<a href="https://developer.android.com/reference/android/location/GnssStatus.Callback.html#GnssStatus.Callback()'">
|
|
GnssStatus.Callback
|
|
</a>
|
|
at least 8 satellites from one constellation.
|
|
</li>
|
|
<li>
|
|
It SHOULD be able to simultaneously track at least 24 satellites, from multiple
|
|
constellations (e.g. GPS + at least one of Glonass, Beidou, Galileo).
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
It MUST report the GNSS technology generation through the test API ‘getGnssYearOfHardware’.
|
|
</li>
|
|
<li>
|
|
It is STRONGLY RECOMMENDED to meet and MUST meet all requirements below if the GNSS technology
|
|
generation is reported as the year "2016" or newer.
|
|
<ul>
|
|
<li>
|
|
It MUST report GPS measurements, as soon as they are found, even if a location calculated
|
|
from GPS/GNSS is not yet reported.
|
|
</li>
|
|
<li>
|
|
It MUST report GPS pseudoranges and pseudorange rates, that, in open-sky conditions
|
|
after determining the location, while stationary or moving with less than 0.2 meter
|
|
per second squared of acceleration, are sufficient to calculate position within
|
|
20 meters, and speed within 0.2 meters per second, at least 95% of the time.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Note that while some of the GPS requirements above are stated as STRONGLY RECOMMENDED, the
|
|
Compatibility Definition for the next major version is expected to change these to a MUST.
|
|
</p>
|
|
<h4 id="7_3_4_gyroscope">
|
|
7.3.4. Gyroscope
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a gyroscope (angular change sensor).
|
|
Devices SHOULD NOT include a gyroscope sensor unless a 3-axis accelerometer is
|
|
also included. If a device implementation includes a gyroscope, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement the TYPE_GYROSCOPE sensor and SHOULD also implement
|
|
TYPE_GYROSCOPE_UNCALIBRATED sensor. Existing and new Android devices are
|
|
STRONGLY RECOMMENDED to implement the SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
|
|
sensor.
|
|
</li>
|
|
<li>
|
|
MUST be capable of measuring orientation changes up to 1,000 degrees per
|
|
second.
|
|
</li>
|
|
<li>
|
|
MUST be able to report events up to a frequency of at least 50 Hz for
|
|
Android Watch devices as such devices have a stricter power constraint and 100
|
|
Hz for all other device types.
|
|
</li>
|
|
<li>
|
|
SHOULD report events up to at least 200 Hz.
|
|
</li>
|
|
<li>
|
|
MUST have a resolution of 12-bits or more and SHOULD have a resolution of
|
|
16-bits or more.
|
|
</li>
|
|
<li>
|
|
MUST be temperature compensated.
|
|
</li>
|
|
<li>
|
|
MUST be calibrated and compensated while in use, and preserve the
|
|
compensation parameters between device reboots.
|
|
</li>
|
|
<li>
|
|
MUST have a variance no greater than 1e-7 rad^2 / s^2 per Hz (variance per
|
|
Hz, or rad^2 / s). The variance is allowed to vary with the sampling rate, but
|
|
must be constrained by this value. In other words, if you measure the variance
|
|
of the gyro at 1 Hz sampling rate it should be no greater than 1e-7 rad^2/s^2.
|
|
</li>
|
|
<li>
|
|
MUST implement a TYPE_ROTATION_VECTOR composite sensor, if an accelerometer
|
|
sensor and a magnetometer sensor is also included.
|
|
</li>
|
|
<li>
|
|
If an accelerometer sensor is included, MUST implement the TYPE_GRAVITY and
|
|
TYPE_LINEAR_ACCELERATION composite sensors and SHOULD implement the
|
|
TYPE_GAME_ROTATION_VECTOR composite sensor. Existing and new Android devices
|
|
are STRONGLY RECOMMENDED to implement the TYPE_GAME_ROTATION_VECTOR sensor.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_5_barometer">
|
|
7.3.5. Barometer
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a barometer (ambient air pressure
|
|
sensor). If a device implementation includes a barometer, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement and report TYPE_PRESSURE sensor.
|
|
</li>
|
|
<li>
|
|
MUST be able to deliver events at 5 Hz or greater.
|
|
</li>
|
|
<li>
|
|
MUST have adequate precision to enable estimating altitude.
|
|
</li>
|
|
<li>
|
|
MUST be temperature compensated.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_6_thermometer">
|
|
7.3.6. Thermometer
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY include an ambient thermometer (temperature sensor).
|
|
If present, it MUST be defined as SENSOR_TYPE_AMBIENT_TEMPERATURE and it MUST
|
|
measure the ambient (room) temperature in degrees Celsius.
|
|
</p>
|
|
<p>
|
|
Device implementations MAY but SHOULD NOT include a CPU temperature sensor. If
|
|
present, it MUST be defined as SENSOR_TYPE_TEMPERATURE, it MUST measure the
|
|
temperature of the device CPU, and it MUST NOT measure any other temperature.
|
|
Note the SENSOR_TYPE_TEMPERATURE sensor type was deprecated in Android 4.0.
|
|
</p>
|
|
<div class="note">
|
|
For Android Automotive implementations, SENSOR_TYPE_AMBIENT_TEMPERATURE MUST
|
|
measure the temperature inside the vehicle cabin.
|
|
</div>
|
|
<h4 id="7_3_7_photometer">
|
|
7.3.7. Photometer
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY include a photometer (ambient light sensor).
|
|
</p>
|
|
<h4 id="7_3_8_proximity_sensor">
|
|
7.3.8. Proximity Sensor
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY include a proximity sensor. Devices that can make a
|
|
voice call and indicate any value other than PHONE_TYPE_NONE in getPhoneType
|
|
SHOULD include a proximity sensor. If a device implementation does include a
|
|
proximity sensor, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST measure the proximity of an object in the same direction as the
|
|
screen. That is, the proximity sensor MUST be oriented to detect objects close
|
|
to the screen, as the primary intent of this sensor type is to detect a phone
|
|
in use by the user. If a device implementation includes a proximity sensor with
|
|
any other orientation, it MUST NOT be accessible through this API.
|
|
</li>
|
|
<li>
|
|
MUST have 1-bit of accuracy or more.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_9_high_fidelity_sensors">
|
|
7.3.9. High Fidelity Sensors
|
|
</h4>
|
|
<p>
|
|
Device implementations supporting a set of higher quality sensors that can meet
|
|
all the requirements listed in this section MUST identify the support through
|
|
the
|
|
<code>
|
|
android.hardware.sensor.hifi_sensors
|
|
</code>
|
|
feature flag.
|
|
</p>
|
|
<p>
|
|
A device declaring android.hardware.sensor.hifi_sensors MUST support all of the
|
|
following sensor types meeting the quality requirements as below:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SENSOR_TYPE_ACCELEROMETER
|
|
<ul>
|
|
<li>
|
|
MUST have a measurement range between at least -8g and +8g.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement resolution of at least 1024 LSB/G.
|
|
</li>
|
|
<li>
|
|
MUST have a minimum measurement frequency of 12.5 Hz or lower.
|
|
</li>
|
|
<li>
|
|
MUST have a maximum measurement frequency of 400 Hz or higher.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement noise not above 400 uG/√Hz.
|
|
</li>
|
|
<li>
|
|
MUST implement a non-wake-up form of this sensor with a buffering
|
|
capability of at least 3000 sensor events.
|
|
</li>
|
|
<li>
|
|
MUST have a batching power consumption not worse than 3 mW.
|
|
</li>
|
|
<li>
|
|
SHOULD have a stationary noise bias stability of \<15 μg √Hz from 24hr static
|
|
dataset.
|
|
</li>
|
|
<li>
|
|
SHOULD have a bias change vs. temperature of ≤ +/- 1mg / °C.
|
|
</li>
|
|
<li>
|
|
SHOULD have a best-fit line non-linearity of ≤ 0.5%, and sensitivity change vs. temperature of ≤
|
|
0.03%/C°.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
SENSOR_TYPE_GYROSCOPE
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST have a measurement range between at least -1000 and +1000 dps.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement resolution of at least 16 LSB/dps.
|
|
</li>
|
|
<li>
|
|
MUST have a minimum measurement frequency of 12.5 Hz or lower.
|
|
</li>
|
|
<li>
|
|
MUST have a maximum measurement frequency of 400 Hz or higher.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement noise not above 0.014°/s/√Hz.
|
|
</li>
|
|
<li>
|
|
SHOULD have a stationary bias stability of < 0.0002 °/s √Hz from 24-hour static dataset.
|
|
</li>
|
|
<li>
|
|
SHOULD have a bias change vs. temperature of ≤ +/- 0.05 °/ s / °C.
|
|
</li>
|
|
<li>
|
|
SHOULD have a sensitivity change vs. temperature of ≤ 0.02% / °C.
|
|
</li>
|
|
<li>
|
|
SHOULD have a best-fit line non-linearity of ≤ 0.2%.
|
|
</li>
|
|
<li>
|
|
SHOULD have a noise density of ≤ 0.007 °/s/√Hz.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED with the same quality requirements as
|
|
SENSOR_TYPE_GYROSCOPE.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_GEOMAGNETIC_FIELD
|
|
<ul>
|
|
<li>
|
|
MUST have a measurement range between at least -900 and +900 uT.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement resolution of at least 5 LSB/uT.
|
|
</li>
|
|
<li>
|
|
MUST have a minimum measurement frequency of 5 Hz or lower.
|
|
</li>
|
|
<li>
|
|
MUST have a maximum measurement frequency of 50 Hz or higher.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement noise not above 0.5 uT.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED with the same quality requirements
|
|
as SENSOR_TYPE_GEOMAGNETIC_FIELD and in addition:
|
|
<ul>
|
|
<li>
|
|
MUST implement a non-wake-up form of this sensor with a buffering
|
|
capability of at least 600 sensor events.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_PRESSURE
|
|
<ul>
|
|
<li>
|
|
MUST have a measurement range between at least 300 and 1100 hPa.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement resolution of at least 80 LSB/hPa.
|
|
</li>
|
|
<li>
|
|
MUST have a minimum measurement frequency of 1 Hz or lower.
|
|
</li>
|
|
<li>
|
|
MUST have a maximum measurement frequency of 10 Hz or higher.
|
|
</li>
|
|
<li>
|
|
MUST have a measurement noise not above 2 Pa/√Hz.
|
|
</li>
|
|
<li>
|
|
MUST implement a non-wake-up form of this sensor with a buffering
|
|
capability of at least 300 sensor events.
|
|
</li>
|
|
<li>
|
|
MUST have a batching power consumption not worse than 2 mW.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_GAME_ROTATION_VECTOR
|
|
<ul>
|
|
<li>
|
|
MUST implement a non-wake-up form of this sensor with a buffering
|
|
capability of at least 300 sensor events.
|
|
</li>
|
|
<li>
|
|
MUST have a batching power consumption not worse than 4 mW.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_SIGNIFICANT_MOTION
|
|
<ul>
|
|
<li>
|
|
MUST have a power consumption not worse than 0.5 mW when device is
|
|
static and 1.5 mW when device is moving.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_STEP_DETECTOR
|
|
<ul>
|
|
<li>
|
|
MUST implement a non-wake-up form of this sensor with a buffering
|
|
capability of at least 100 sensor events.
|
|
</li>
|
|
<li>
|
|
MUST have a power consumption not worse than 0.5 mW when device is
|
|
static and 1.5 mW when device is moving.
|
|
</li>
|
|
<li>
|
|
MUST have a batching power consumption not worse than 4 mW.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_STEP_COUNTER
|
|
<ul>
|
|
<li>
|
|
MUST have a power consumption not worse than 0.5 mW when device is
|
|
static and 1.5 mW when device is moving.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SENSOR_TILT_DETECTOR
|
|
<ul>
|
|
<li>
|
|
MUST have a power consumption not worse than 0.5 mW when device is
|
|
static and 1.5 mW when device is moving.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Also such a device MUST meet the following sensor subsystem requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The event timestamp of the same physical event reported by the
|
|
Accelerometer, Gyroscope sensor and Magnetometer MUST be within 2.5
|
|
milliseconds of each other.
|
|
</li>
|
|
<li>
|
|
The Gyroscope sensor event timestamps MUST be on the same time base as the
|
|
camera subsystem and within 1 milliseconds of error.
|
|
</li>
|
|
<li>
|
|
High Fidelity sensors MUST deliver samples to applications within 5
|
|
milliseconds from the time when the data is available on the physical sensor
|
|
to the application.
|
|
</li>
|
|
<li>
|
|
The power consumption MUST not be higher than 0.5 mW when device is static
|
|
and 2.0 mW when device is moving when any combination of the following sensors
|
|
are enabled:
|
|
<ul>
|
|
<li>
|
|
SENSOR_TYPE_SIGNIFICANT_MOTION
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_STEP_DETECTOR
|
|
</li>
|
|
<li>
|
|
SENSOR_TYPE_STEP_COUNTER
|
|
</li>
|
|
<li>
|
|
SENSOR_TILT_DETECTORS
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Note that all power consumption requirements in this section do not include the
|
|
power consumption of the Application Processor. It is inclusive of the power
|
|
drawn by the entire sensor chain—the sensor, any supporting circuitry, any
|
|
dedicated sensor processing system, etc.
|
|
</p>
|
|
<p>
|
|
The following sensor types MAY also be supported on a device implementation
|
|
declaring android.hardware.sensor.hifi_sensors, but if these sensor types are
|
|
present they MUST meet the following minimum buffering capability requirement:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SENSOR_TYPE_PROXIMITY: 100 sensor events
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_10_fingerprint_sensor">
|
|
7.3.10. Fingerprint Sensor
|
|
</h4>
|
|
<p>
|
|
Device implementations with a secure lock screen SHOULD include a fingerprint
|
|
sensor. If a device implementation includes a fingerprint sensor and has a
|
|
corresponding API for third-party developers, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST declare support for the android.hardware.fingerprint feature.
|
|
</li>
|
|
<li>
|
|
MUST fully implement the
|
|
<a href="https://developer.android.com/reference/android/hardware/fingerprint/package-summary.html">
|
|
corresponding API
|
|
</a>
|
|
as described in the Android SDK documentation.
|
|
</li>
|
|
<li>
|
|
MUST have a false acceptance rate not higher than 0.002%.
|
|
</li>
|
|
<li>
|
|
Is STRONGLY RECOMMENDED to have a false rejection rate of less than 10%, as
|
|
measured on the device
|
|
</li>
|
|
<li>
|
|
Is STRONGLY RECOMMENDED to have a latency below 1 second, measured from
|
|
when the fingerprint sensor is touched until the screen is unlocked, for one
|
|
enrolled finger.
|
|
</li>
|
|
<li>
|
|
MUST rate limit attempts for at least 30 seconds after five false trials
|
|
for fingerprint verification.
|
|
</li>
|
|
<li>
|
|
MUST have a hardware-backed keystore implementation, and perform the
|
|
fingerprint matching in a Trusted Execution Environment (TEE) or on a chip with
|
|
a secure channel to the TEE.
|
|
</li>
|
|
<li>
|
|
MUST have all identifiable fingerprint data encrypted and cryptographically
|
|
authenticated such that they cannot be acquired, read or altered outside of the
|
|
Trusted Execution Environment (TEE) as documented in the
|
|
<a href="https://source.android.com/devices/tech/security/authentication/fingerprint-hal.html">
|
|
implementation guidelines
|
|
</a>
|
|
on the Android Open Source Project site.
|
|
</li>
|
|
<li>
|
|
MUST prevent adding a fingerprint without first establishing a chain of
|
|
trust by having the user confirm existing or add a new device credential
|
|
(PIN/pattern/password) that's secured by TEE; the Android Open Source Project
|
|
implementation provides the mechanism in the framework to do so.
|
|
</li>
|
|
<li>
|
|
MUST NOT enable 3rd-party applications to distinguish between individual
|
|
fingerprints.
|
|
</li>
|
|
<li>
|
|
MUST honor the DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT flag.
|
|
</li>
|
|
<li>
|
|
MUST, when upgraded from a version earlier than Android 6.0, have the
|
|
fingerprint data securely migrated to meet the above requirements or removed.
|
|
</li>
|
|
<li>
|
|
SHOULD use the Android Fingerprint icon provided in the Android Open Source
|
|
Project.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_3_11_android_automotive-only_sensors">
|
|
7.3.11. Android Automotive-only sensors
|
|
</h4>
|
|
<p>
|
|
Automotive-specific sensors are defined in the
|
|
<code>
|
|
android.car.CarSensorManager API
|
|
</code>
|
|
.
|
|
</p>
|
|
<h5 id="7_3_11_1_current_gear">
|
|
7.3.11.1. Current Gear
|
|
</h5>
|
|
<p>
|
|
Android Automotive implementations SHOULD provide current gear as SENSOR_TYPE_GEAR.
|
|
</p>
|
|
<h5 id="7_3_11_2_day_night_mode">
|
|
7.3.11.2. Day Night Mode
|
|
</h5>
|
|
<p>
|
|
Android Automotive implementations MUST support day/night mode defined as
|
|
SENSOR_TYPE_NIGHT. The value of this flag MUST be consistent with dashboard
|
|
day/night mode and SHOULD be based on ambient light sensor input. The
|
|
underlying ambient light sensor MAY be the same as
|
|
<a href="#7_3_7_photometer">
|
|
Photometer
|
|
</a>.
|
|
</p>
|
|
<h5 id="7_3_11_3_driving_status">
|
|
7.3.11.3. Driving Status
|
|
</h5>
|
|
<p>
|
|
Android Automotive implementations MUST support driving status defined as
|
|
SENSOR_TYPE_DRIVING_STATUS, with a default value of DRIVE_STATUS_UNRESTRICTED
|
|
when the vehicle is fully stopped and parked. It is the responsibility of device
|
|
manufacturers to configure SENSOR_TYPE_DRIVING_STATUS in compliance with all
|
|
laws and regulations that apply to markets where the product is shipping.
|
|
</p>
|
|
<h5 id="7_3_11_4_wheel_speed">
|
|
7.3.11.4. Wheel Speed
|
|
</h5>
|
|
<p>
|
|
Android Automotive implementations MUST provide vehicle speed defined as
|
|
SENSOR_TYPE_CAR_SPEED.
|
|
</p>
|
|
<h3 id="7_3_12_pose_sensor">
|
|
7.3.12. Pose Sensor
|
|
</h3>
|
|
<p>
|
|
Device implementations MAY support pose sensor with 6 degrees of freedom. Android Handheld
|
|
devices are RECOMMENDED to support this sensor. If a device implementation does support pose
|
|
sensor with 6 degrees of freedom, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement and report
|
|
<a href="https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_POSE_6DOF">
|
|
<code>
|
|
TYPE_POSE_6DOF
|
|
</code>
|
|
</a>
|
|
sensor.
|
|
</li>
|
|
<li>
|
|
MUST be more accurate than the rotation vector alone.
|
|
</li>
|
|
</ul>
|
|
<h3 id="7_4_data_connectivity">
|
|
7.4. Data Connectivity
|
|
</h3>
|
|
<h4 id="7_4_1_telephony">
|
|
7.4.1. Telephony
|
|
</h4>
|
|
<p>
|
|
“Telephony” as used by the Android APIs and this document refers specifically
|
|
to hardware related to placing voice calls and sending SMS messages via a GSM
|
|
or CDMA network. While these voice calls may or may not be packet-switched,
|
|
they are for the purposes of Android considered independent of any data
|
|
connectivity that may be implemented using the same network. In other words,
|
|
the Android “telephony” functionality and APIs refer specifically to voice
|
|
calls and SMS. For instance, device implementations that cannot place calls or
|
|
send/receive SMS messages MUST NOT report the android.hardware.telephony
|
|
feature or any subfeatures, regardless of whether they use a cellular network
|
|
for data connectivity.
|
|
</p>
|
|
<p>
|
|
Android MAY be used on devices that do not include telephony hardware. That is,
|
|
Android is compatible with devices that are not phones. However, if a device
|
|
implementation does include GSM or CDMA telephony, it MUST implement full
|
|
support for the API for that technology. Device implementations that do not
|
|
include telephony hardware MUST implement the full APIs as no-ops.
|
|
</p>
|
|
<h5 id="7_4_1_1_number_blocking_compatibility">
|
|
7.4.1.1. Number Blocking Compatibility
|
|
</h5>
|
|
<p>
|
|
Android Telephony device implementations MUST include number blocking support
|
|
and:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST fully implement
|
|
<a href="http://developer.android.com/reference/android/provider/BlockedNumberContract.html">
|
|
BlockedNumberContract
|
|
</a>
|
|
and the corresponding API as described in the SDK documentation.
|
|
</li>
|
|
<li>
|
|
MUST block all calls and messages from a phone number in
|
|
'BlockedNumberProvider' without any interaction with apps. The only exception
|
|
is when number blocking is temporarily lifted as described in the SDK
|
|
documentation.
|
|
</li>
|
|
<li>
|
|
MUST NOT write to the
|
|
<a href="http://developer.android.com/reference/android/provider/CallLog.html">
|
|
platform call log provider
|
|
</a>
|
|
for a blocked call.
|
|
</li>
|
|
<li>
|
|
MUST NOT write to the
|
|
<a href="http://developer.android.com/reference/android/provider/Telephony.html">
|
|
Telephony provider
|
|
</a>
|
|
for a blocked message.
|
|
</li>
|
|
<li>
|
|
MUST implement a blocked numbers management UI, which is opened with the
|
|
intent returned by TelecomManager.createManageBlockedNumbersIntent() method.
|
|
</li>
|
|
<li>
|
|
MUST NOT allow secondary users to view or edit the blocked numbers on the
|
|
device as the Android platform assumes the primary user to have full control
|
|
of the telephony services, a single instance, on the device. All blocking
|
|
related UI MUST be hidden for secondary users and the blocked list MUST still
|
|
be respected.
|
|
</li>
|
|
<li>
|
|
SHOULD migrate the blocked numbers into the provider when a device updates
|
|
to Android 7.0.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_4_2_ieee_802_11_(wi-fi)">
|
|
7.4.2. IEEE 802.11 (Wi-Fi)
|
|
</h4>
|
|
<p>
|
|
All Android device implementations SHOULD include support for one or more forms
|
|
of 802.11. If a device implementation does include support for 802.11 and exposes the
|
|
functionality to a third-party application, it MUST implement the corresponding
|
|
Android API and:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the hardware feature flag android.hardware.wifi.
|
|
</li>
|
|
<li>
|
|
MUST implement the
|
|
<a href="http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html">
|
|
multicast API
|
|
</a>
|
|
as described in the SDK documentation.
|
|
</li>
|
|
<li>
|
|
MUST support multicast DNS (mDNS) and MUST NOT filter mDNS packets
|
|
(224.0.0.251) at any time of operation including:
|
|
<ul>
|
|
<li>
|
|
Even when the screen is not in an active state.
|
|
</li>
|
|
<li>
|
|
For Android Television device implementations, even when in standby
|
|
power states.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h5 id="7_4_2_1_wi-fi_direct">
|
|
7.4.2.1. Wi-Fi Direct
|
|
</h5>
|
|
<p>
|
|
Device implementations SHOULD include support for Wi-Fi Direct (Wi-Fi
|
|
peer-to-peer). If a device implementation does include support for Wi-Fi
|
|
Direct, it MUST implement the
|
|
<a href="http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html">
|
|
corresponding Android API
|
|
</a>
|
|
as described in the SDK documentation. If a device implementation includes
|
|
support for Wi-Fi Direct, then it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the hardware feature android.hardware.wifi.direct.
|
|
</li>
|
|
<li>
|
|
MUST support regular Wi-Fi operation.
|
|
</li>
|
|
<li>
|
|
SHOULD support concurrent Wi-Fi and Wi-Fi Direct operation.
|
|
</li>
|
|
</ul>
|
|
<h5 id="7_4_2_2_wi-fi_tunneled_direct_link_setup">
|
|
7.4.2.2. Wi-Fi Tunneled Direct Link Setup
|
|
</h5>
|
|
<p>
|
|
Device implementations SHOULD include support for
|
|
<a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html">
|
|
Wi-Fi
|
|
Tunneled Direct Link Setup (TDLS)
|
|
</a>
|
|
as described in the Android SDK Documentation. If a device
|
|
implementation does include support for TDLS and TDLS is enabled by the
|
|
WiFiManager API, the device:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD use TDLS only when it is possible AND beneficial.
|
|
</li>
|
|
<li>
|
|
SHOULD have some heuristic and NOT use TDLS when its performance might be
|
|
worse than going through the Wi-Fi access point.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_4_3_bluetooth">
|
|
7.4.3. Bluetooth
|
|
</h4>
|
|
<div class="note">
|
|
Android Watch implementations MUST support Bluetooth. Android Television
|
|
implementations MUST support Bluetooth and Bluetooth LE. Android Automotive
|
|
implementations MUST support Bluetooth and SHOULD support Bluetooth LE.
|
|
</div>
|
|
<p>
|
|
Device implementations that support
|
|
<code>
|
|
android.hardware.vr.high_performance
|
|
</code>
|
|
feature MUST
|
|
support Bluetooth 4.2 and Bluetooth LE Data Length Extension.
|
|
</p>
|
|
<p>
|
|
Android includes support for
|
|
<a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">
|
|
Bluetooth and Bluetooth Low Energy
|
|
</a>.
|
|
Device implementations that include support for Bluetooth and Bluetooth Low
|
|
Energy MUST declare the relevant platform features (android.hardware.bluetooth
|
|
and android.hardware.bluetooth_le respectively) and implement the platform APIs.
|
|
Device implementations SHOULD implement relevant Bluetooth profiles such as
|
|
A2DP, AVCP, OBEX, etc. as appropriate for the device.
|
|
</p>
|
|
<p>
|
|
Android Automotive implementations SHOULD support Message Access Profile (MAP).
|
|
Android Automotive implementations MUST support the following Bluetooth
|
|
profiles:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Phone calling over Hands-Free Profile (HFP).
|
|
</li>
|
|
<li>
|
|
Media playback over Audio Distribution Profile (A2DP).
|
|
</li>
|
|
<li>
|
|
Media playback control over Remote Control Profile (AVRCP).
|
|
</li>
|
|
<li>
|
|
Contact sharing using the Phone Book Access Profile (PBAP).
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations including support for Bluetooth Low Energy:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST declare the hardware feature android.hardware.bluetooth_le.
|
|
</li>
|
|
<li>
|
|
MUST enable the GATT (generic attribute profile) based Bluetooth APIs as
|
|
described in the SDK documentation and
|
|
<a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">
|
|
android.bluetooth
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
are STRONGLY RECOMMENDED to implement a Resolvable Private Address (RPA)
|
|
timeout no longer than 15 minutes and rotate the address at timeout to protect
|
|
user privacy.
|
|
</li>
|
|
<li>
|
|
SHOULD support offloading of the filtering logic to the bluetooth chipset
|
|
when implementing the
|
|
<a href="https://developer.android.com/reference/android/bluetooth/le/ScanFilter.html">
|
|
ScanFilter API
|
|
</a>,
|
|
and MUST report the correct value of where the filtering logic is implemented
|
|
whenever queried via the
|
|
android.bluetooth.BluetoothAdapter.isOffloadedFilteringSupported() method.
|
|
</li>
|
|
<li>
|
|
SHOULD support offloading of the batched scanning to the bluetooth chipset,
|
|
but if not supported, MUST report ‘false’ whenever queried via the
|
|
android.bluetooth.BluetoothAdapter.isOffloadedScanBatchingSupported() method.
|
|
</li>
|
|
<li>
|
|
SHOULD support multi advertisement with at least 4 slots, but if not
|
|
supported, MUST report ‘false’ whenever queried via the
|
|
android.bluetooth.BluetoothAdapter.isMultipleAdvertisementSupported() method.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_4_4_near-field_communications">
|
|
7.4.4. Near-Field Communications
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a transceiver and related hardware for
|
|
Near-Field Communications (NFC). If a device implementation does include NFC
|
|
hardware and plans to make it available to third-party apps, then it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the android.hardware.nfc feature from the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager.hasSystemFeature() method
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST be capable of reading and writing NDEF messages via the following NFC
|
|
standards:
|
|
<ul>
|
|
<li>
|
|
MUST be capable of acting as an NFC Forum reader/writer (as defined by
|
|
the NFC Forum technical specification NFCForum-TS-DigitalProtocol-1.0) via the
|
|
following NFC standards:
|
|
<ul>
|
|
<li>
|
|
NfcA (ISO14443-3A)
|
|
</li>
|
|
<li>
|
|
NfcB (ISO14443-3B)
|
|
</li>
|
|
<li>
|
|
NfcF (JIS X 6319-4)
|
|
</li>
|
|
<li>
|
|
IsoDep (ISO 14443-4)
|
|
</li>
|
|
<li>
|
|
NFC Forum Tag Types 1, 2, 3, 4 (defined by the NFC Forum)
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to be capable of reading and writing NDEF messages
|
|
as well as raw data via the following NFC standards. Note that while the NFC
|
|
standards below are stated as STRONGLY RECOMMENDED, the Compatibility
|
|
Definition for a future version is planned to change these to MUST. These
|
|
standards are optional in this version but will be required in future versions.
|
|
Existing and new devices that run this version of Android are very strongly
|
|
encouraged to meet these requirements now so they will be able to upgrade to
|
|
the future platform releases.
|
|
<ul>
|
|
<li>
|
|
NfcV (ISO 15693)
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
SHOULD be capable of reading the barcode and URL (if encoded) of
|
|
<a href="http://developer.android.com/reference/android/nfc/tech/NfcBarcode.html">
|
|
Thinfilm NFC Barcode
|
|
</a>
|
|
products.
|
|
</li>
|
|
<li>
|
|
MUST be capable of transmitting and receiving data via the following
|
|
peer-to-peer standards and protocols:
|
|
<ul>
|
|
<li>
|
|
ISO 18092
|
|
</li>
|
|
<li>
|
|
LLCP 1.2 (defined by the NFC Forum)
|
|
</li>
|
|
<li>
|
|
SDP 1.0 (defined by the NFC Forum)
|
|
</li>
|
|
<li>
|
|
<a href="http://static.googleusercontent.com/media/source.android.com/en/us/compatibility/ndef-push-protocol.pdf">
|
|
NDEF Push Protocol
|
|
</a>
|
|
</li>
|
|
<li>
|
|
SNEP 1.0 (defined by the NFC Forum)
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
MUST include support for
|
|
<a href="http://developer.android.com/guide/topics/connectivity/nfc/nfc.html">
|
|
Android Beam
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST implement the SNEP default server. Valid NDEF messages
|
|
received by the default SNEP server MUST be dispatched to applications using
|
|
the android.nfc.ACTION_NDEF_DISCOVERED intent. Disabling Android Beam in
|
|
settings MUST NOT disable dispatch of incoming NDEF message.
|
|
</li>
|
|
<li>
|
|
MUST honor the android.settings.NFCSHARING_SETTINGS intent to show
|
|
<a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFCSHARING_SETTINGS">
|
|
NFC sharing settings
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST implement the NPP server. Messages received by the NPP server
|
|
MUST be processed the same way as the SNEP default server.
|
|
</li>
|
|
<li>
|
|
MUST implement a SNEP client and attempt to send outbound P2P NDEF
|
|
to the default SNEP server when Android Beam is enabled. If no default SNEP
|
|
server is found then the client MUST attempt to send to an NPP server.
|
|
</li>
|
|
<li>
|
|
MUST allow foreground activities to set the outbound P2P NDEF
|
|
message using android.nfc.NfcAdapter.setNdefPushMessage, and
|
|
android.nfc.NfcAdapter.setNdefPushMessageCallback, and
|
|
android.nfc.NfcAdapter.enableForegroundNdefPush.
|
|
</li>
|
|
<li>
|
|
SHOULD use a gesture or on-screen confirmation, such as 'Touch to
|
|
Beam', before sending outbound P2P NDEF messages.
|
|
</li>
|
|
<li>
|
|
SHOULD enable Android Beam by default and MUST be able to send and
|
|
receive using Android Beam, even when another proprietary NFC P2p mode is
|
|
turned on.
|
|
</li>
|
|
<li>
|
|
MUST support NFC Connection handover to Bluetooth when the device
|
|
supports Bluetooth Object Push Profile. Device implementations MUST support
|
|
connection handover to Bluetooth when using
|
|
android.nfc.NfcAdapter.setBeamPushUris, by implementing the
|
|
“
|
|
<a href="http://members.nfc-forum.org/specs/spec_list/#conn_handover">
|
|
Connection Handover version 1.2
|
|
</a>
|
|
” and
|
|
“
|
|
<a href="http://members.nfc-forum.org/apps/group_public/download.php/18688/NFCForum-AD-BTSSP_1_1.pdf">
|
|
Bluetooth Secure Simple Pairing Using NFC version 1.0
|
|
</a>
|
|
”
|
|
specs from the NFC Forum. Such an implementation MUST implement the handover
|
|
LLCP service with service name “urn:nfc:sn:handover” for exchanging the
|
|
handover request/select records over NFC, and it MUST use the Bluetooth Object
|
|
Push Profile for the actual Bluetooth data transfer. For legacy reasons (to
|
|
remain compatible with Android 4.1 devices), the implementation SHOULD still
|
|
accept SNEP GET requests for exchanging the handover request/select records
|
|
over NFC. However an implementation itself SHOULD NOT send SNEP GET requests
|
|
for performing connection handover.
|
|
</li>
|
|
<li>
|
|
MUST poll for all supported technologies while in NFC discovery mode.
|
|
</li>
|
|
<li>
|
|
SHOULD be in NFC discovery mode while the device is awake with the
|
|
screen active and the lock-screen unlocked.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
(Note that publicly available links are not available for the JIS, ISO, and NFC
|
|
Forum specifications cited above.)
|
|
</p>
|
|
<p>
|
|
Android includes support for NFC Host Card Emulation (HCE) mode. If a device
|
|
implementation does include an NFC controller chipset capable of HCE (for NfcA
|
|
and/or NfcB) and it supports Application ID (AID) routing, then it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the android.hardware.nfc.hce feature constant.
|
|
</li>
|
|
<li>
|
|
MUST support
|
|
<a href="http://developer.android.com/guide/topics/connectivity/nfc/hce.html">
|
|
NFC HCE
|
|
APIs
|
|
</a>
|
|
as
|
|
defined in the Android SDK.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If a device implementation does include an NFC controller chipset capable of HCE
|
|
for NfcF, and it implements the feature for third-party applications, then it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the android.hardware.nfc.hcef feature constant.
|
|
</li>
|
|
<li>
|
|
MUST implement the [NfcF Card Emulation APIs]
|
|
(https://developer.android.com/reference/android/nfc/cardemulation/NfcFCardEmulation.html)
|
|
as defined in the Android SDK.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Additionally, device implementations MAY include reader/writer support for the
|
|
following MIFARE technologies.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MIFARE Classic
|
|
</li>
|
|
<li>
|
|
MIFARE Ultralight
|
|
</li>
|
|
<li>
|
|
NDEF on MIFARE Classic
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Note that Android includes APIs for these MIFARE types. If a device
|
|
implementation supports MIFARE in the reader/writer role, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement the corresponding Android APIs as documented by the Android SDK.
|
|
</li>
|
|
<li>
|
|
MUST report the feature com.nxp.mifare from the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager.hasSystemFeature()
|
|
</a>
|
|
method. Note that this is not a standard Android feature and as such does not
|
|
appear as a constant in the android.content.pm.PackageManager class.
|
|
</li>
|
|
<li>
|
|
MUST NOT implement the corresponding Android APIs nor report the
|
|
com.nxp.mifare feature unless it also implements general NFC support as
|
|
described in this section.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If a device implementation does not include NFC hardware, it MUST NOT declare
|
|
the android.hardware.nfc feature from the
|
|
<a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">
|
|
android.content.pm.PackageManager.hasSystemFeature()
|
|
</a>
|
|
method, and MUST implement the Android NFC API as a no-op.
|
|
</p>
|
|
<p>
|
|
As the classes android.nfc.NdefMessage and android.nfc.NdefRecord represent a
|
|
protocol-independent data representation format, device implementations MUST
|
|
implement these APIs even if they do not include support for NFC or declare the
|
|
android.hardware.nfc feature.
|
|
</p>
|
|
<h4 id="7_4_5_minimum_network_capability">
|
|
7.4.5. Minimum Network Capability
|
|
</h4>
|
|
<p>
|
|
Device implementations MUST include support for one or more forms of data
|
|
networking. Specifically, device implementations MUST include support for at
|
|
least one data standard capable of 200Kbit/sec or greater. Examples of
|
|
technologies that satisfy this requirement include EDGE, HSPA, EV-DO, 802.11g,
|
|
Ethernet, Bluetooth PAN, etc.
|
|
</p>
|
|
<p>
|
|
Device implementations where a physical networking standard (such as Ethernet)
|
|
is the primary data connection SHOULD also include support for at least one
|
|
common wireless data standard, such as 802.11 (Wi-Fi).
|
|
</p>
|
|
<p>
|
|
Devices MAY implement more than one form of data connectivity.
|
|
</p>
|
|
<p>
|
|
Devices MUST include an IPv6 networking stack and support IPv6 communication
|
|
using the managed APIs, such as
|
|
<code>
|
|
java.net.Socket
|
|
</code>
|
|
and
|
|
<code>
|
|
java.net.URLConnection
|
|
</code>
|
|
,
|
|
as well as the native APIs, such as
|
|
<code>
|
|
AF_INET6
|
|
</code>
|
|
sockets. The required level of
|
|
IPv6 support depends on the network type, as follows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Devices that support Wi-Fi networks MUST support dual-stack and IPv6-only
|
|
operation on Wi-Fi.
|
|
</li>
|
|
<li>
|
|
Devices that support Ethernet networks MUST support dual-stack operation on
|
|
Ethernet.
|
|
</li>
|
|
<li>
|
|
Devices that support cellular data SHOULD support IPv6 operation (IPv6-only
|
|
and possibly dual-stack) on cellular data.
|
|
</li>
|
|
<li>
|
|
When a device is simultaneously connected to more than one network (e.g.,
|
|
Wi-Fi and cellular data), it MUST simultaneously meet these requirements on
|
|
each network to which it is connected.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
IPv6 MUST be enabled by default.
|
|
</p>
|
|
<p>
|
|
In order to ensure that IPv6 communication is as reliable as IPv4, unicast IPv6
|
|
packets sent to the device MUST NOT be dropped, even when the screen is not in
|
|
an active state. Redundant multicast IPv6 packets, such as repeated identical
|
|
Router Advertisements, MAY be rate-limited in hardware or firmware if doing so
|
|
is necessary to save power. In such cases, rate-limiting MUST NOT cause the
|
|
device to lose IPv6 connectivity on any IPv6-compliant network that uses RA
|
|
lifetimes of at least 180 seconds.
|
|
</p>
|
|
<p>
|
|
IPv6 connectivity MUST be maintained in doze mode.
|
|
</p>
|
|
<h4 id="7_4_6_sync_settings">
|
|
7.4.6. Sync Settings
|
|
</h4>
|
|
<p>
|
|
Device implementations MUST have the master auto-sync setting on by default so
|
|
that the method
|
|
<a href="http://developer.android.com/reference/android/content/ContentResolver.html">
|
|
getMasterSyncAutomatically()
|
|
</a>
|
|
returns “true”.
|
|
</p>
|
|
<h4 id="7_4_7_data_saver">
|
|
7.4.7. Data Saver
|
|
</h4>
|
|
<p>
|
|
Device implementations with a metered connection are STRONGLY RECOMMENDED to provide the
|
|
data saver mode.
|
|
</p>
|
|
<p>
|
|
If a device implementation provides the data saver mode, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
MUST support all the APIs in the
|
|
<code>
|
|
ConnectivityManager
|
|
</code>
|
|
class as described in the
|
|
<a href="https://developer.android.com/training/basics/network-ops/data-saver.html">
|
|
SDK documentation
|
|
</a>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST provide a user interface in the settings, allowing users to add
|
|
applications to or remove applications from the whitelist.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Conversely if a device implementation does not provide the data saver mode, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
MUST return the value
|
|
<code>
|
|
RESTRICT_BACKGROUND_STATUS_DISABLED
|
|
</code>
|
|
for
|
|
<a href="https://developer.android.com/reference/android/net/ConnectivityManager.html#getRestrictBackgroundStatus%28%29">
|
|
<code>
|
|
ConnectivityManager.getRestrictBackgroundStatus()
|
|
</code>
|
|
</a>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST not broadcast
|
|
<code>
|
|
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
|
|
</code>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
MUST have an activity that handles the
|
|
<code>
|
|
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
|
|
</code>
|
|
intent but MAY implement it as a no-op.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<h3 id="7_5_cameras">
|
|
7.5. Cameras
|
|
</h3>
|
|
<p>
|
|
Device implementations SHOULD include a rear-facing camera and MAY include a
|
|
front-facing camera. A rear-facing camera is a camera located on the side of
|
|
the device opposite the display; that is, it images scenes on the far side of
|
|
the device, like a traditional camera. A front-facing camera is a camera
|
|
located on the same side of the device as the display; that is, a camera
|
|
typically used to image the user, such as for video conferencing and similar
|
|
applications.
|
|
</p>
|
|
<p>
|
|
If a device implementation includes at least one camera, it MUST be possible for
|
|
an application to simultaneously allocate 3 RGBA_8888 bitmaps equal to the size
|
|
of the images produced by the largest-resolution camera sensor on the device,
|
|
while camera is open for the purpose of basic preview and still capture.
|
|
</p>
|
|
<h4 id="7_5_1_rear-facing_camera">
|
|
7.5.1. Rear-Facing Camera
|
|
</h4>
|
|
<p>
|
|
Device implementations SHOULD include a rear-facing camera. If a device
|
|
implementation includes at least one rear-facing camera, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the feature flag android.hardware.camera and
|
|
android.hardware.camera.any.
|
|
</li>
|
|
<li>
|
|
MUST have a resolution of at least 2 megapixels.
|
|
</li>
|
|
<li>
|
|
SHOULD have either hardware auto-focus or software auto-focus implemented
|
|
in the camera driver (transparent to application software).
|
|
</li>
|
|
<li>
|
|
MAY have fixed-focus or EDOF (extended depth of field) hardware.
|
|
</li>
|
|
<li>
|
|
MAY include a flash. If the Camera includes a flash, the flash lamp MUST
|
|
NOT be lit while an android.hardware.Camera.PreviewCallback instance has been
|
|
registered on a Camera preview surface, unless the application has explicitly
|
|
enabled the flash by enabling the FLASH_MODE_AUTO or FLASH_MODE_ON attributes
|
|
of a Camera.Parameters object. Note that this constraint does not apply to the
|
|
device’s built-in system camera application, but only to third-party
|
|
applications using Camera.PreviewCallback.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_5_2_front-facing_camera">
|
|
7.5.2. Front-Facing Camera
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY include a front-facing camera. If a device
|
|
implementation includes at least one front-facing camera, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the feature flag android.hardware.camera.any and
|
|
android.hardware.camera.front.
|
|
</li>
|
|
<li>
|
|
MUST have a resolution of at least VGA (640x480 pixels).
|
|
</li>
|
|
<li>
|
|
MUST NOT use a front-facing camera as the default for the Camera API. The
|
|
camera API in Android has specific support for front-facing cameras and device
|
|
implementations MUST NOT configure the API to to treat a front-facing camera as
|
|
the default rear-facing camera, even if it is the only camera on the device.
|
|
</li>
|
|
<li>
|
|
MAY include features (such as auto-focus, flash, etc.) available to
|
|
rear-facing cameras as described in
|
|
<a href="#7_5_1_rear-facing_camera">
|
|
section 7.5.1
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST horizontally reflect (i.e. mirror) the stream displayed by an app in a
|
|
CameraPreview, as follows:
|
|
<ul>
|
|
<li>
|
|
If the device implementation is capable of being rotated by user (such
|
|
as automatically via an accelerometer or manually via user input), the camera
|
|
preview MUST be mirrored horizontally relative to the device’s current
|
|
orientation.
|
|
</li>
|
|
<li>
|
|
If the current application has explicitly requested that the Camera
|
|
display be rotated via a call to the
|
|
<a href="http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)">
|
|
android.hardware.Camera.setDisplayOrientation()
|
|
</a>
|
|
method, the camera preview MUST be mirrored horizontally relative to the
|
|
orientation specified by the application.
|
|
</li>
|
|
<li>
|
|
Otherwise, the preview MUST be mirrored along the device’s default
|
|
horizontal axis.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
MUST mirror the image displayed by the postview in the same manner as the
|
|
camera preview image stream. If the device implementation does not support
|
|
postview, this requirement obviously does not apply.
|
|
</li>
|
|
<li>
|
|
MUST NOT mirror the final captured still image or video streams returned to
|
|
application callbacks or committed to media storage.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_5_3_external_camera">
|
|
7.5.3. External Camera
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY include support for an external camera that is not
|
|
necessarily always connected. If a device includes support for an external camera,
|
|
it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST declare the platform feature flag
|
|
<code>
|
|
android.hardware.camera.external
|
|
</code>
|
|
and
|
|
<code>
|
|
android.hardware camera.any
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
MAY support multiple cameras.
|
|
</li>
|
|
<li>
|
|
MUST support USB Video Class (UVC 1.0 or higher) if the external camera
|
|
connects through the USB port.
|
|
</li>
|
|
<li>
|
|
SHOULD support video compressions such as MJPEG to enable transfer of
|
|
high-quality unencoded streams (i.e. raw or independently compressed picture
|
|
streams).
|
|
</li>
|
|
<li>
|
|
MAY support camera-based video encoding. If supported, a simultaneous
|
|
unencoded / MJPEG stream (QVGA or greater resolution) MUST be accessible to
|
|
the device implementation.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_5_4_camera_api_behavior">
|
|
7.5.4. Camera API Behavior
|
|
</h4>
|
|
<p>
|
|
Android includes two API packages to access the camera, the newer
|
|
android.hardware.camera2 API expose lower-level camera control to the app,
|
|
including efficient zero-copy burst/streaming flows and per-frame controls of
|
|
exposure, gain, white balance gains, color conversion, denoising, sharpening,
|
|
and more.
|
|
</p>
|
|
<p>
|
|
The older API package, android.hardware.Camera, is marked as deprecated in
|
|
Android 5.0 but as it should still be available for apps to use Android device
|
|
implementations MUST ensure the continued support of the API as described in
|
|
this section and in the Android SDK.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST implement the following behaviors for the
|
|
camera-related APIs, for all available cameras:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
If an application has never called
|
|
android.hardware.Camera.Parameters.setPreviewFormat(int), then the device MUST
|
|
use android.hardware.PixelFormat.YCbCr_420_SP for preview data provided to
|
|
application callbacks.
|
|
</li>
|
|
<li>
|
|
If an application registers an android.hardware.Camera.PreviewCallback
|
|
instance and the system calls the onPreviewFrame() method when the preview
|
|
format is YCbCr_420_SP, the data in the byte[] passed into onPreviewFrame()
|
|
must further be in the NV21 encoding format. That is, NV21 MUST be the default.
|
|
</li>
|
|
<li>
|
|
For android.hardware.Camera, device implementations MUST support the YV12
|
|
format (as denoted by the android.graphics.ImageFormat.YV12 constant) for
|
|
camera previews for both front- and rear-facing cameras. (The hardware video
|
|
encoder and camera may use any native pixel format, but the device
|
|
implementation MUST support conversion to YV12.)
|
|
</li>
|
|
<li>
|
|
For android.hardware.camera2, device implementations must support the
|
|
android.hardware.ImageFormat.YUV_420_888 and android.hardware.ImageFormat.JPEG
|
|
formats as outputs through the android.media.ImageReader API.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations MUST still implement the full
|
|
<a href="http://developer.android.com/reference/android/hardware/Camera.html">
|
|
Camera
|
|
API
|
|
</a>
|
|
included in the Android SDK documentation, regardless of whether the device
|
|
includes hardware autofocus or other capabilities. For instance, cameras that
|
|
lack autofocus MUST still call any registered
|
|
android.hardware.Camera.AutoFocusCallback instances (even though this has no
|
|
relevance to a non-autofocus camera.) Note that this does apply to front-facing
|
|
cameras; for instance, even though most front-facing cameras do not support
|
|
autofocus, the API callbacks must still be “faked” as described.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST recognize and honor each parameter name defined as
|
|
a constant on the
|
|
<a href="http://developer.android.com/reference/android/hardware/Camera.Parameters.html">
|
|
android.hardware.Camera.Parameters
|
|
</a>
|
|
class, if the underlying hardware supports the feature. If the device hardware
|
|
does not support a feature, the API must behave as documented. Conversely,
|
|
device implementations MUST NOT honor or recognize string constants passed to
|
|
the android.hardware.Camera.setParameters() method other than those documented
|
|
as constants on the android.hardware.Camera.Parameters. That is, device
|
|
implementations MUST support all standard Camera parameters if the hardware
|
|
allows, and MUST NOT support custom Camera parameter types. For instance,
|
|
device implementations that support image capture using high dynamic range
|
|
(HDR) imaging techniques MUST support camera parameter Camera.SCENE_MODE_HDR.
|
|
</p>
|
|
<p>
|
|
Because not all device implementations can fully support all the features of
|
|
the android.hardware.camera2 API, device implementations MUST report the proper
|
|
level of support with the
|
|
<a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL">
|
|
android.info.supportedHardwareLevel
|
|
</a>
|
|
property as described in the Android SDK and report the appropriate
|
|
<a href="http://source.android.com/devices/camera/versioning.html">
|
|
framework feature flags
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST also declare its Individual camera capabilities of
|
|
android.hardware.camera2 via the android.request.availableCapabilities property
|
|
and declare the appropriate
|
|
<a href="http://source.android.com/devices/camera/versioning.html">
|
|
feature flags
|
|
</a>;
|
|
a device must define the feature flag if any of its attached camera devices
|
|
supports the feature.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST broadcast the Camera.ACTION_NEW_PICTURE intent
|
|
whenever a new picture is taken by the camera and the entry of the picture has
|
|
been added to the media store.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST broadcast the Camera.ACTION_NEW_VIDEO intent
|
|
whenever a new video is recorded by the camera and the entry of the picture has
|
|
been added to the media store.
|
|
</p>
|
|
<h4 id="7_5_5_camera_orientation">
|
|
7.5.5. Camera Orientation
|
|
</h4>
|
|
<p>
|
|
Both front- and rear-facing cameras, if present, MUST be oriented so that the
|
|
long dimension of the camera aligns with the screen’s long dimension. That is,
|
|
when the device is held in the landscape orientation, cameras MUST capture
|
|
images in the landscape orientation. This applies regardless of the device’s
|
|
natural orientation; that is, it applies to landscape-primary devices as well
|
|
as portrait-primary devices.
|
|
</p>
|
|
<h3 id="7_6_memory_and_storage">
|
|
7.6. Memory and Storage
|
|
</h3>
|
|
<h4 id="7_6_1_minimum_memory_and_storage">
|
|
7.6.1. Minimum Memory and Storage
|
|
</h4>
|
|
<div class="note">
|
|
Android Television devices MUST have at least 4GB of non-volatile storage
|
|
available for application private data.
|
|
</div>
|
|
<p>
|
|
The memory available to the kernel and userspace on device implementations MUST
|
|
be at least equal or larger than the minimum values specified by the following
|
|
table. (See
|
|
<a href="#7_1_1_screen_configuration">
|
|
section 7.1.1
|
|
</a>
|
|
for screen size and
|
|
density definitions.)
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<th>
|
|
Density and screen size
|
|
</th>
|
|
<th>
|
|
32-bit device
|
|
</th>
|
|
<th>
|
|
64-bit device
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
Android Watch devices (due to smaller screens)
|
|
</td>
|
|
<td>
|
|
416MB
|
|
</td>
|
|
<td>
|
|
Not applicable
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
280dpi or lower on small/normal screens
|
|
</li>
|
|
<li class="table_list">
|
|
mdpi or lower on large screens
|
|
</li>
|
|
<li class="table_list">
|
|
ldpi or lower on extra large screens
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
512MB
|
|
</td>
|
|
<td>
|
|
816MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
xhdpi or higher on small/normal screens
|
|
</li>
|
|
<li class="table_list">
|
|
hdpi or higher on large screens
|
|
</li>
|
|
<li class="table_list">
|
|
mdpi or higher on extra large screens
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
608MB
|
|
</td>
|
|
<td>
|
|
944MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
400dpi or higher on small/normal screens
|
|
</li>
|
|
<li class="table_list">
|
|
xhdpi or higher on large screens
|
|
</li>
|
|
<li class="table_list">
|
|
tvdpi or higher on extra large screens
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
896MB
|
|
</td>
|
|
<td>
|
|
1280MB
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<ul>
|
|
<li class="table_list">
|
|
560dpi or higher on small/normal screens
|
|
</li>
|
|
<li class="table_list">
|
|
400dpi or higher on large screens
|
|
</li>
|
|
<li class="table_list">
|
|
xhdpi or higher on extra large screens
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
1344MB
|
|
</td>
|
|
<td>
|
|
1824MB
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p>
|
|
The minimum memory values MUST be in addition to any memory space already
|
|
dedicated to hardware components such as radio, video, and so on that is not
|
|
under the kernel’s control.
|
|
</p>
|
|
<p>
|
|
Device implementations with less than 512MB of memory available to the kernel
|
|
and userspace, unless an Android Watch, MUST return the value "true" for
|
|
ActivityManager.isLowRamDevice().
|
|
</p>
|
|
<p>
|
|
Android Television devices MUST have at least 4GB and other device
|
|
implementations MUST have at least 3GB of non-volatile storage available for
|
|
application private data. That is, the /data partition MUST be at least 4GB for
|
|
Android Television devices and at least 3GB for other device implementations.
|
|
Device implementations that run Android are
|
|
<strong>
|
|
STRONGLY RECOMMENDED
|
|
</strong>
|
|
to have at
|
|
least 4GB of non-volatile storage for application private data so they will be
|
|
able to upgrade to the future platform releases.
|
|
</p>
|
|
<p>
|
|
The Android APIs include a
|
|
<a href="http://developer.android.com/reference/android/app/DownloadManager.html">
|
|
Download Manager
|
|
</a>
|
|
that applications MAY use to download data files. The device implementation of
|
|
the Download Manager MUST be capable of downloading individual files of at
|
|
least 100MB in size to the default “cache” location.
|
|
</p>
|
|
<h4 id="7_6_2_application_shared_storage">
|
|
7.6.2. Application Shared Storage
|
|
</h4>
|
|
<p>
|
|
Device implementations MUST offer shared storage for applications also often
|
|
referred as “shared external storage”.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST be configured with shared storage mounted by
|
|
default, “out of the box”. If the shared storage is not mounted on the
|
|
Linuxpath /sdcard, then the device MUST include a Linux symbolic link from
|
|
/sdcard to the actual mount point.
|
|
</p>
|
|
<p>
|
|
Device implementations MAY have hardware for user-accessible removable storage,
|
|
such as a Secure Digital (SD) card slot. If this slot is used to satisfy the
|
|
shared storage requirement, the device implementation:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST implement a toast or pop-up user interface warning the user when there
|
|
is no SD card.
|
|
</li>
|
|
<li>
|
|
MUST include a FAT-formatted SD card 1GB in size or larger OR show on the
|
|
box and other material available at time of purchase that the SD card has to be
|
|
separately purchased.
|
|
</li>
|
|
<li>
|
|
MUST mount the SD card by default.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Alternatively, device implementations MAY allocate internal (non-removable)
|
|
storage as shared storage for apps as included in the upstream Android Open
|
|
Source Project; device implementations SHOULD use this configuration and
|
|
software implementation. If a device implementation uses internal
|
|
(non-removable) storage to satisfy the shared storage requirement, while that
|
|
storage MAY share space with the application private data, it MUST be at least
|
|
1GB in size and mounted on /sdcard (or /sdcard MUST be a symbolic link to the
|
|
physical location if it is mounted elsewhere).
|
|
</p>
|
|
<p>
|
|
Device implementations MUST enforce as documented the
|
|
android.permission.WRITE_EXTERNAL_STORAGE permission on this shared storage.
|
|
Shared storage MUST otherwise be writable by any application that obtains that
|
|
permission.
|
|
</p>
|
|
<p>
|
|
Device implementations that include multiple shared storage paths (such as both
|
|
an SD card slot and shared internal storage) MUST allow only pre-installed &
|
|
privileged Android applications with the WRITE_EXTERNAL_STORAGE permission to
|
|
write to the secondary external storage, except when writing to their
|
|
package-specific directories or within the
|
|
<code>
|
|
URI
|
|
</code>
|
|
returned by firing the
|
|
<code>
|
|
ACTION_OPEN_DOCUMENT_TREE
|
|
</code>
|
|
intent.
|
|
</p>
|
|
<p>
|
|
However, device implementations SHOULD expose content from both storage paths
|
|
transparently through Android’s media scanner service and
|
|
android.provider.MediaStore.
|
|
</p>
|
|
<p>
|
|
Regardless of the form of shared storage used, if the device implementation has
|
|
a USB port with USB peripheral mode support, it MUST provide some mechanism to
|
|
access the contents of shared storage from a host computer. Device
|
|
implementations MAY use USB mass storage, but SHOULD use Media Transfer
|
|
Protocol to satisfy this requirement. If the device implementation supports
|
|
Media Transfer Protocol, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD be compatible with the reference Android MTP host,
|
|
<a href="http://www.android.com/filetransfer">
|
|
Android File Transfer
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
SHOULD report a USB device class of 0x00.
|
|
</li>
|
|
<li>
|
|
SHOULD report a USB interface name of 'MTP'.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_6_3_adoptable_storage">
|
|
7.6.3. Adoptable Storage
|
|
</h4>
|
|
<p>
|
|
Device implementations are STRONGLY RECOMMENDED to implement
|
|
<a href="http://source.android.com/devices/storage/adoptable.html">
|
|
adoptable storage
|
|
</a>
|
|
if the
|
|
removable storage device port is in a long-term stable location, such as within
|
|
the battery compartment or other protective cover.
|
|
</p>
|
|
<p>
|
|
Device implementations such as a television, MAY enable adoption through USB
|
|
ports as the device is expected to be static and not mobile. But for other
|
|
device implementations that are mobile in nature, it is STRONGLY RECOMMENDED to
|
|
implement the adoptable storage in a long-term stable location, since
|
|
accidentally disconnecting them can cause data loss/corruption.
|
|
</p>
|
|
<h3 id="7_7_usb">
|
|
7.7. USB
|
|
</h3>
|
|
<p>
|
|
Device implementations SHOULD support USB peripheral mode and SHOULD support USB
|
|
host mode.
|
|
</p>
|
|
<h4 id="7_7_1_usb_peripheral_mode">
|
|
7.7.1. USB peripheral mode
|
|
</h4>
|
|
<p>
|
|
If a device implementation includes a USB port supporting peripheral mode:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The port MUST be connectable to a USB host that has a standard type-A or
|
|
type-C USB port.
|
|
</li>
|
|
<li>
|
|
The port SHOULD use micro-B, micro-AB or Type-C USB form factor. Existing
|
|
and new Android devices are
|
|
<strong>
|
|
STRONGLY RECOMMENDED to meet these
|
|
requirements
|
|
</strong>
|
|
so they will be able to upgrade to the future platform
|
|
releases.
|
|
</li>
|
|
<li>
|
|
The port SHOULD be located on the bottom of the device
|
|
(according to natural orientation) or enable software screen rotation for
|
|
all apps (including home screen), so that the display draws correctly when
|
|
the device is oriented with the port at bottom. Existing and new Android
|
|
devices are
|
|
<strong>
|
|
STRONGLY RECOMMENDED to meet these requirements
|
|
</strong>
|
|
so they will
|
|
be able to upgrade to future platform releases.
|
|
</li>
|
|
<li>
|
|
It MUST allow a USB host connected with the Android device to access the
|
|
contents of the shared storage volume using either USB mass storage or Media
|
|
Transfer Protocol.
|
|
</li>
|
|
<li>
|
|
It SHOULD implement the Android Open Accessory (AOA) API and specification
|
|
as documented in the Android SDK documentation, and if it is an Android
|
|
Handheld device it MUST implement the AOA API. Device implementations
|
|
implementing the AOA specification:
|
|
<ul>
|
|
<li>
|
|
MUST declare support for the hardware feature
|
|
<a href="http://developer.android.com/guide/topics/connectivity/usb/accessory.html">
|
|
android.hardware.usb.accessory
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST implement the
|
|
<a href="http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_AUDIO">
|
|
USB audio class
|
|
</a>
|
|
as documented in the Android SDK documentation.
|
|
</li>
|
|
<li>
|
|
The USB mass storage class MUST include the string "android" at the end
|
|
of the interface description
|
|
<code>
|
|
iInterface
|
|
</code>
|
|
string of the USB mass storage
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
It SHOULD implement support to draw 1.5 A current during HS chirp and
|
|
traffic as specified in the
|
|
<a href="http://www.usb.org/developers/docs/devclass_docs/BCv1.2_070312.zip">
|
|
USB Battery Charging specification, revision 1.2
|
|
</a>.
|
|
Existing and new Android devices are
|
|
<strong>
|
|
STRONGLY RECOMMENDED to meet these
|
|
requirements
|
|
</strong>
|
|
so they will be able to upgrade to the future platform
|
|
releases.
|
|
</li>
|
|
<li>
|
|
Type-C devices MUST detect 1.5A and 3.0A chargers per the Type-C resistor
|
|
standard and it must detect changes in the advertisement.
|
|
</li>
|
|
<li>
|
|
Type-C devices also supporting USB host mode are STRONGLY RECOMMENDED to
|
|
support Power Delivery for data and power role swapping.
|
|
</li>
|
|
<li>
|
|
Type-C devices SHOULD support Power Delivery for high-voltage charging and
|
|
support for Alternate Modes such as display out.
|
|
</li>
|
|
<li>
|
|
The value of iSerialNumber in USB standard device descriptor MUST be equal
|
|
to the value of android.os.Build.SERIAL.
|
|
</li>
|
|
<li>
|
|
Type-C devices are STRONGLY RECOMMENDED to not support proprietary charging
|
|
methods that modify Vbus voltage beyond default levels, or alter sink/source
|
|
roles as such may result in interoperability issues with the chargers or
|
|
devices that support the standard USB Power Delivery methods. While this is
|
|
called out as "STRONGLY RECOMMENDED", in future Android versions we might
|
|
REQUIRE all type-C devices to support full interoperability with standard
|
|
type-C chargers.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_7_2_usb_host_mode">
|
|
7.7.2. USB host mode
|
|
</h4>
|
|
<p>
|
|
If a device implementation includes a USB port supporting host mode, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD use a type-C USB port, if the device implementation supports USB 3.1.
|
|
</li>
|
|
<li>
|
|
MAY use a non-standard port form factor, but if so MUST ship with a cable or
|
|
cables adapting the port to a standard type-A or type-C USB port.
|
|
</li>
|
|
<li>
|
|
MAY use a micro-AB USB port, but if so SHOULD ship with a cable or cables adapting the port to a standard type-A or type-C USB port.
|
|
</li>
|
|
<li>
|
|
is
|
|
<strong>
|
|
STRONGLY RECOMMENDED
|
|
</strong>
|
|
to implement the
|
|
<a href="http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_AUDIO">
|
|
USB audio class
|
|
</a>
|
|
as documented in the Android SDK documentation.
|
|
</li>
|
|
<li>
|
|
MUST implement the Android USB host API as documented in the Android SDK,
|
|
and MUST declare support for the hardware feature
|
|
<a href="http://developer.android.com/guide/topics/connectivity/usb/host.html">
|
|
android.hardware.usb.host
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
SHOULD support device charging while in host mode; advertising a source
|
|
current of at least 1.5A as specified in the Termination Parameters section
|
|
of the [USB Type-C Cable and Connector Specification Revision 1.2] (http://www.usb.org/developers/docs/usb_31_021517.zip)
|
|
for USB Type-C connectors or using Charging Downstream Port(CDP) output
|
|
current range as specified in the
|
|
<a href="http://www.usb.org/developers/docs/devclass_docs/BCv1.2_070312.zip">
|
|
USB Battery Charging specifications, revision 1.2
|
|
</a>
|
|
for Micro-AB connectors.
|
|
</li>
|
|
<li>
|
|
USB Type-C devices are STRONGLY RECOMMENDED to support DisplayPort, SHOULD
|
|
support USB SuperSpeed Data Rates, and are STRONGLY RECOMMENDED to support
|
|
Power Delivery for data and power role swapping.
|
|
</li>
|
|
<li>
|
|
Devices with any type-A or type-AB ports MUST NOT ship with an adapter converting
|
|
from this port to a type-C receptacle.
|
|
</li>
|
|
<li>
|
|
MUST recognize any remotely connected MTP (Media Transfer Protocol) devices
|
|
and make their contents accessible through the
|
|
<code>
|
|
ACTION_GET_CONTENT
|
|
</code>
|
|
,
|
|
<code>
|
|
ACTION_OPEN_DOCUMENT
|
|
</code>
|
|
, and
|
|
<code>
|
|
ACTION_CREATE_DOCUMENT
|
|
</code>
|
|
intents, if the Storage Access
|
|
Framework (SAF) is supported.
|
|
</li>
|
|
<li>
|
|
MUST, if using a Type-C USB port and including support for peripheral mode,
|
|
implement Dual Role Port functionality as defined by the USB Type-C
|
|
specification (section 4.5.1.3.3).
|
|
</li>
|
|
<li>
|
|
SHOULD, if the Dual Role Port functionality is supported, implement the
|
|
Try.* model that is most appropriate for the device form factor. For
|
|
example a handheld device SHOULD implement the Try.SNK model.
|
|
</li>
|
|
</ul>
|
|
<h3 id="7_8_audio">
|
|
7.8. Audio
|
|
</h3>
|
|
<h4 id="7_8_1_microphone">
|
|
7.8.1. Microphone
|
|
</h4>
|
|
<div class="note">
|
|
Android Handheld, Watch, and Automotive implementations MUST include a
|
|
microphone.
|
|
</div>
|
|
<p>
|
|
Device implementations MAY omit a microphone. However, if a device
|
|
implementation omits a microphone, it MUST NOT report the
|
|
android.hardware.microphone feature constant, and MUST implement the audio
|
|
recording API at least as no-ops, per
|
|
<a href="#7_hardware_compatibility">
|
|
section 7
|
|
</a>.
|
|
Conversely, device implementations that do possess a microphone:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the android.hardware.microphone feature constant.
|
|
</li>
|
|
<li>
|
|
MUST meet the audio recording requirements in
|
|
<a href="#5_4_audio_recording">
|
|
section 5.4
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST meet the audio latency requirements in
|
|
<a href="#5_6_audio_latency">
|
|
section 5.6
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to support near-ultrasound recording as described in
|
|
<a href="#7_8_3_near_ultrasound">
|
|
section 7.8.3
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_8_2_audio_output">
|
|
7.8.2. Audio Output
|
|
</h4>
|
|
<div class="note">
|
|
Android Watch devices MAY include an audio output.
|
|
</div>
|
|
<p>
|
|
Device implementations including a speaker or with an audio/multimedia output
|
|
port for an audio output peripheral as a headset or an external speaker:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST report the android.hardware.audio.output feature constant.
|
|
</li>
|
|
<li>
|
|
MUST meet the audio playback requirements in
|
|
<a href="#5_5_audio_playback">
|
|
section 5.5
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST meet the audio latency requirements in
|
|
<a href="#5_6_audio_latency">
|
|
section 5.6
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to support near-ultrasound playback as described in
|
|
<a href="#7_8_3_near_ultrasound">
|
|
section 7.8.3
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Conversely, if a device implementation does not include a speaker or audio
|
|
output port, it MUST NOT report the android.hardware.audio output feature, and
|
|
MUST implement the Audio Output related APIs as no-ops at least.
|
|
</p>
|
|
<p>
|
|
Android Watch device implementation MAY but SHOULD NOT have audio output, but
|
|
other types of Android device implementations MUST have an audio output and
|
|
declare android.hardware.audio.output.
|
|
</p>
|
|
<h5 id="7_8_2_1_analog_audio_ports">
|
|
7.8.2.1. Analog Audio Ports
|
|
</h5>
|
|
<p>
|
|
In order to be compatible with the
|
|
<a href="http://source.android.com/accessories/headset-spec.html">
|
|
headsets and other audio accessories
|
|
</a>
|
|
using the 3.5mm audio plug across the Android ecosystem, if a device
|
|
implementation includes one or more analog audio ports, at least one of the
|
|
audio port(s) SHOULD be a 4 conductor 3.5mm audio jack. If a device
|
|
implementation has a 4 conductor 3.5mm audio jack, it:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST support audio playback to stereo headphones and stereo headsets with a
|
|
microphone, and SHOULD support audio recording from stereo headsets with a
|
|
microphone.
|
|
</li>
|
|
<li>
|
|
MUST support TRRS audio plugs with the CTIA pin-out order, and SHOULD
|
|
support audio plugs with the OMTP pin-out order.
|
|
</li>
|
|
<li>
|
|
MUST support the detection of microphone on the plugged in audio accessory,
|
|
if the device implementation supports a microphone, and broadcast the
|
|
android.intent.action.HEADSET_PLUG with the extra value microphone set as 1.
|
|
</li>
|
|
<li>
|
|
MUST support the detection and mapping to the keycodes for the following
|
|
3 ranges of equivalent impedance between the microphone and ground conductors
|
|
on the audio plug:
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
70 ohm or less
|
|
</strong>
|
|
: KEYCODE_HEADSETHOOK
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
210-290 Ohm
|
|
</strong>
|
|
: KEYCODE_VOLUME_UP
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
360-680 Ohm
|
|
</strong>
|
|
: KEYCODE_VOLUME_DOWN
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
STRONGLY RECOMMENDED to detect and map to the keycode for the following
|
|
range of equivalent impedance between the microphone and ground conductors
|
|
on the audio plug:
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
110-180 Ohm:
|
|
</strong>
|
|
KEYCODE_VOICE_ASSIST
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
MUST trigger ACTION_HEADSET_PLUG upon a plug insert, but only after all
|
|
contacts on plug are touching their relevant segments on the jack.
|
|
</li>
|
|
<li>
|
|
MUST be capable of driving at least 150mV ± 10% of output voltage on a 32
|
|
Ohm speaker impedance.
|
|
</li>
|
|
<li>
|
|
MUST have a microphone bias voltage between 1.8V ~ 2.9V.
|
|
</li>
|
|
</ul>
|
|
<h4 id="7_8_3_near-ultrasound">
|
|
7.8.3. Near-Ultrasound
|
|
</h4>
|
|
<p>
|
|
Near-Ultrasound audio is the 18.5 kHz to 20 kHz band. Device implementations
|
|
MUST correctly report the support of near-ultrasound audio capability via the
|
|
<a href="http://developer.android.com/reference/android/media/AudioManager.html#getProperty%28java.lang.String%29">
|
|
AudioManager.getProperty
|
|
</a>
|
|
API as follows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
If
|
|
<a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND">
|
|
PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND
|
|
</a>
|
|
is "true", then the following requirements must be met by the
|
|
VOICE_RECOGNITION and UNPROCESSED audio sources:
|
|
<ul>
|
|
<li>
|
|
The microphone's mean power response in the 18.5 kHz to 20 kHz band
|
|
MUST be no more than 15 dB below the response at 2 kHz.
|
|
</li>
|
|
<li>
|
|
The microphone's unweighted signal to noise ratio over 18.5 kHz to 20 kHz
|
|
for a 19 kHz tone at -26 dBFS MUST be no lower than 50 dB.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
If
|
|
<a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND">
|
|
PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND
|
|
</a>
|
|
is "true", then the speaker's mean response in 18.5 kHz - 20 kHz MUST be no
|
|
lower than 40 dB below the response at 2 kHz.
|
|
</li>
|
|
</ul>
|
|
<h3 id="7_9_virtual_reality">
|
|
7.9. Virtual Reality
|
|
</h3>
|
|
<p>
|
|
Android includes APIs and facilities to build "Virtual Reality" (VR) applications including high
|
|
quality mobile VR experiences. Device implementations MUST properly implement these APIs and
|
|
behaviors, as detailed in this section.
|
|
</p>
|
|
<h4 id="7_9_1_virtual_reality_mode">
|
|
7.9.1. Virtual Reality Mode
|
|
</h4>
|
|
<p>
|
|
Android handheld device implementations that support a mode for VR applications that handles
|
|
stereoscopic rendering of notifications and disable monocular system UI components while a VR
|
|
application has user focus MUST declare
|
|
<code>
|
|
android.software.vr.mode
|
|
</code>
|
|
feature. Devices declaring this
|
|
feature MUST include an application implementing
|
|
<code>
|
|
android.service.vr.VrListenerService
|
|
</code>
|
|
that can be
|
|
enabled by VR applications via
|
|
<code>
|
|
android.app.Activity#setVrModeEnabled
|
|
</code>
|
|
.
|
|
</p>
|
|
<h4 id="7_9_2_virtual_reality_high_performance">
|
|
7.9.2. Virtual Reality High Performance
|
|
</h4>
|
|
<p>
|
|
Android handheld device implementations MUST identify the support of high performance virtual
|
|
reality for longer user periods through the
|
|
<code>
|
|
android.hardware.vr.high_performance
|
|
</code>
|
|
feature flag and
|
|
meet the following requirements.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Device implementations MUST have at least 2 physical cores.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST declare android.software.vr.mode feature.
|
|
</li>
|
|
<li>
|
|
Device implementations MAY provide an exclusive core to the foreground
|
|
application and MAY support the Process.getExclusiveCores API to return
|
|
the numbers of the cpu cores that are exclusive to the top foreground
|
|
application. If exclusive core is supported then the core MUST not allow
|
|
any other userspace processes to run on it (except device drivers used
|
|
by the application), but MAY allow some kernel processes to run as
|
|
necessary.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support sustained performance mode.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support OpenGL ES 3.2.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support Vulkan Hardware Level 0 and SHOULD support
|
|
Vulkan Hardware Level 1.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST implement EGL_KHR_mutable_render_buffer and
|
|
EGL_ANDROID_front_buffer_auto_refresh, EGL_ANDROID_create_native_client_buffer,
|
|
EGL_KHR_fence_sync and EGL_KHR_wait_sync so that they may be used for Shared Buffer Mode, and
|
|
expose the extensions in the list of available EGL extensions.
|
|
</li>
|
|
<li>
|
|
The GPU and display MUST be able to synchronize access to the shared front buffer such that
|
|
alternating-eye rendering of VR content at 60fps with two render contexts will be displayed with
|
|
no visible tearing artifacts.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST implement EGL_IMG_context_priority, and expose the extension in the
|
|
list of available EGL extensions.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST implement GL_EXT_multisampled_render_to_texture, GL_OVR_multiview,
|
|
GL_OVR_multiview2 and GL_OVR_multiview_multisampled_render_to_texture, and expose the extensions
|
|
in the list of available GL extensions.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST implement EGL_EXT_protected_content and GL_EXT_protected_textures so
|
|
that it may be used for Secure Texture Video Playback, and expose the extensions in the list of
|
|
available EGL and GL extensions.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support H.264 decoding at least 3840x2160@30fps-40Mbps (equivalent
|
|
to 4 instances of 1920x1080@30fps-10Mbps or 2 instances of 1920x1080@60fps-20Mbps).
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support HEVC and VP9, MUST be capable to decode at least
|
|
1920x1080@30fps-10Mbps and SHOULD be capable to decode 3840x2160@30fps-20Mbps (equivalent to
|
|
4 instances of 1920x1080@30fps-5Mbps).
|
|
</li>
|
|
<li>
|
|
The device implementations are STRONGLY RECOMMENDED to support
|
|
android.hardware.sensor.hifi_sensors feature and MUST meet the gyroscope, accelerometer, and
|
|
magnetometer related requirements for android.hardware.hifi_sensors.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support HardwarePropertiesManager.getDeviceTemperatures API and
|
|
return accurate values for skin temperature.
|
|
</li>
|
|
<li>
|
|
The device implementation MUST have an embedded screen, and its resolution MUST be at least be
|
|
FullHD(1080p) and STRONGLY RECOMMENDED TO BE be QuadHD (1440p) or higher.
|
|
</li>
|
|
<li>
|
|
The display MUST measure between 4.7" and 6" diagonal.
|
|
</li>
|
|
<li>
|
|
The display MUST update at least 60 Hz while in VR Mode.
|
|
</li>
|
|
<li>
|
|
The display latency on Gray-to-Gray, White-to-Black, and Black-to-White switching time MUST
|
|
be ≤ 3 ms.
|
|
</li>
|
|
<li>
|
|
The display MUST support a low-persistence mode with ≤5 ms persistence,persistence being
|
|
defined as the amount of time for which a pixel is emitting light.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST support Bluetooth 4.2 and Bluetooth LE Data Length Extension
|
|
<a href="#7_4_3_bluetooth">
|
|
section 7.4.3
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
<h2 id="8_performance_and_power">
|
|
8. Performance and Power
|
|
</h2>
|
|
<p>
|
|
Some minimum performance and power criteria are critical to the user experience
|
|
and impact the baseline assumptions developers would have when developing an
|
|
app. Android Watch devices SHOULD and other type of device implementations MUST
|
|
meet the following criteria.
|
|
</p>
|
|
<h3 id="8_1_user_experience_consistency">
|
|
8.1. User Experience Consistency
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST provide a smooth user interface by ensuring a
|
|
consistent frame rate and response times for applications and games. Device
|
|
implementations MUST meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Consistent frame latency
|
|
</strong>
|
|
. Inconsistent frame latency or a delay to
|
|
render frames MUST NOT happen more often than 5 frames in a second, and SHOULD
|
|
be below 1 frames in a second.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
User interface latency
|
|
</strong>
|
|
. Device implementations MUST ensure low latency
|
|
user experience by scrolling a list of 10K list entries as defined by the
|
|
Android Compatibility Test Suite (CTS) in less than 36 secs.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Task switching
|
|
</strong>
|
|
. When multiple applications have been launched,
|
|
re-launching an already-running application after it has been launched MUST
|
|
take less than 1 second.
|
|
</li>
|
|
</ul>
|
|
<h3 id="8_2_file_i/o_access_performance">
|
|
8.2. File I/O Access Performance
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST ensure internal storage file access performance
|
|
consistency for read and write operations.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>
|
|
Sequential write
|
|
</strong>
|
|
. Device implementations MUST ensure a sequential write
|
|
performance of at least 5MB/s for a 256MB file using 10MB write buffer.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Random write
|
|
</strong>
|
|
. Device implementations MUST ensure a random write
|
|
performance of at least 0.5MB/s for a 256MB file using 4KB write buffer.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Sequential read
|
|
</strong>
|
|
. Device implementations MUST ensure a sequential read
|
|
performance of at least 15MB/s for a 256MB file using 10MB write buffer.
|
|
</li>
|
|
<li>
|
|
<strong>
|
|
Random read
|
|
</strong>
|
|
. Device implementations MUST ensure a random read
|
|
performance of at least 3.5MB/s for a 256MB file using 4KB write buffer.
|
|
</li>
|
|
</ul>
|
|
<h3 id="8_3_power-saving_modes">
|
|
8.3. Power-Saving Modes
|
|
</h3>
|
|
<p>
|
|
Android 6.0 introduced App Standby and Doze power-saving modes to optimize
|
|
battery usage. All Apps exempted from these modes MUST be made visible to the
|
|
end user. Further, the triggering, maintenance, wakeup algorithms and the use of
|
|
global system settings of these power-saving modes MUST not deviate from the
|
|
Android Open Source Project.
|
|
</p>
|
|
<p>
|
|
In addition to the power-saving modes, Android device implementations MAY
|
|
implement any or all of the 4 sleeping power states as defined by the Advanced
|
|
Configuration and Power Interface (ACPI), but if it implements S3 and S4
|
|
power states, it can only enter these states when closing a lid that is
|
|
physically part of the device.
|
|
</p>
|
|
<h3 id="8_4_power_consumption_accounting">
|
|
8.4. Power Consumption Accounting
|
|
</h3>
|
|
<p>
|
|
A more accurate accounting and reporting of the power consumption provides the
|
|
app developer both the incentives and the tools to optimize the power usage
|
|
pattern of the application. Therefore, device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST be able to track hardware component power usage and attribute that
|
|
power usage to specific applications. Specifically, implementations:
|
|
<ul>
|
|
<li>
|
|
MUST provide a per-component power profile that defines the
|
|
<a href="http://source.android.com/devices/tech/power/values.html">
|
|
current consumption value
|
|
</a>
|
|
for each hardware component and the approximate battery drain caused by the
|
|
components over time as documented in the Android Open Source Project site.
|
|
</li>
|
|
<li>
|
|
MUST report all power consumption values in milliampere hours (mAh).
|
|
</li>
|
|
<li>
|
|
SHOULD be attributed to the hardware component itself if unable to
|
|
attribute hardware component power usage to an application.
|
|
</li>
|
|
<li>
|
|
MUST report CPU power consumption per each process's UID. The Android
|
|
Open Source Project meets the requirement through the
|
|
<code>
|
|
uid_cputime
|
|
</code>
|
|
kernel
|
|
module implementation.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
MUST make this power usage available via the
|
|
<a href="http://source.android.com/devices/tech/power/batterystats.html">
|
|
<code>
|
|
adb shell dumpsys batterystats
|
|
</code>
|
|
</a>
|
|
shell command to the app developer.
|
|
</li>
|
|
<li>
|
|
MUST honor the
|
|
<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_POWER_USAGE_SUMMARY">
|
|
android.intent.action.POWER_USAGE_SUMMARY
|
|
</a>
|
|
intent and display a settings menu that shows this power usage.
|
|
</li>
|
|
</ul>
|
|
<h3 id="8_5_consistent_performance">
|
|
8.5. Consistent Performance
|
|
</h3>
|
|
<p>
|
|
Performance can fluctuate dramatically for high-performance long-running apps,
|
|
either because of the other apps running in the background or the CPU throttling
|
|
due to temperature limits. Android includes programmatic interfaces so that when
|
|
the device is capable, the top foreground application can request that the system
|
|
optimize the allocation of the resources to address such fluctuations.
|
|
</p>
|
|
<p>
|
|
Device implementations SHOULD support Sustained Performance Mode which can
|
|
provide the top foreground application a consistent level of performance for a
|
|
prolonged amount of time when requested through the
|
|
<a href="https://developer.android.com/reference/android/view/Window.html#setSustainedPerformanceMode%28boolean%29">
|
|
<code>
|
|
Window.setSustainedPerformanceMode()
|
|
</code>
|
|
</a>
|
|
API method. A Device implementation MUST report the support of Sustained
|
|
Performance Mode accurately through the
|
|
<a href="https://developer.android.com/reference/android/os/PowerManager.html#isSustainedPerformanceModeSupported%28%29">
|
|
<code>
|
|
PowerManager.isSustainedPerformanceModeSupported()
|
|
</code>
|
|
</a>
|
|
API method.
|
|
</p>
|
|
<p>
|
|
Device implementations with two or more CPU cores SHOULD provide at least one exclusive core that
|
|
can be reserved by the top foreground application. If provided, implementations MUST meet the
|
|
following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Implementations MUST report through the
|
|
<a href="https://developer.android.com/reference/android/os/Process.html#getExclusiveCores%28%29">
|
|
<code>
|
|
Process.getExclusiveCores()
|
|
</code>
|
|
</a>
|
|
API method the id numbers of the exclusive cores that can be reserved by the top foreground
|
|
application.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST not allow any user space processes except the device drivers used
|
|
by the application to run on the exclusive cores, but MAY allow some kernel processes to run
|
|
as necessary.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If a device implementation does not support an exclusive core, it MUST return an
|
|
empty list through the
|
|
<a href="https://developer.android.com/reference/android/os/Process.html#getExclusiveCores%28%29">
|
|
<code>
|
|
Process.getExclusiveCores()
|
|
</code>
|
|
</a>
|
|
API method.
|
|
</p>
|
|
<h2 id="9_security_model_compatibility">
|
|
9. Security Model Compatibility
|
|
</h2>
|
|
<p>
|
|
Device implementations MUST implement a security model consistent with the
|
|
Android platform security model as defined in
|
|
<a href="http://developer.android.com/guide/topics/security/permissions.html">
|
|
Security and Permissions reference document
|
|
</a>
|
|
in the APIs in the Android developer documentation. Device implementations MUST
|
|
support installation of self-signed applications without requiring any
|
|
additional permissions/certificates from any third parties/authorities.
|
|
Specifically, compatible devices MUST support the security mechanisms described
|
|
in the follow subsections.
|
|
</p>
|
|
<h3 id="9_1_permissions">
|
|
9.1. Permissions
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST support the
|
|
<a href="http://developer.android.com/guide/topics/security/permissions.html">
|
|
Android permissions model
|
|
</a>
|
|
as
|
|
defined in the Android developer documentation. Specifically, implementations
|
|
MUST enforce each permission defined as described in the SDK documentation; no
|
|
permissions may be omitted, altered, or ignored. Implementations MAY add
|
|
additional permissions, provided the new permission ID strings are not in the
|
|
android.* namespace.
|
|
</p>
|
|
<p>
|
|
Permissions with a
|
|
<code>
|
|
protectionLevel
|
|
</code>
|
|
of
|
|
<a href="https://developer.android.com/reference/android/content/pm/PermissionInfo.html#PROTECTION_FLAG_PRIVILEGED">
|
|
'PROTECTION_FLAG_PRIVILEGED'
|
|
</a>
|
|
MUST only be granted to apps preloaded in the whitelisted privileged path(s)
|
|
of the system image, such as the
|
|
<code>
|
|
system/priv-app
|
|
</code>
|
|
path in the AOSP
|
|
implementation.
|
|
</p>
|
|
<p>
|
|
Permissions with a protection level of dangerous are runtime permissions.
|
|
Applications with targetSdkVersion > 22 request them at runtime. Device
|
|
implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST show a dedicated interface for the user to decide whether to grant the
|
|
requested runtime permissions and also provide an interface for the user to
|
|
manage runtime permissions.
|
|
</li>
|
|
<li>
|
|
MUST have one and only one implementation of both user interfaces.
|
|
</li>
|
|
<li>
|
|
MUST NOT grant any runtime permissions to preinstalled apps unless:
|
|
<ul>
|
|
<li>
|
|
the user's consent can be obtained before the application uses it
|
|
</li>
|
|
<li>
|
|
the runtime permissions are associated with an intent pattern for which
|
|
the preinstalled application is set as the default handler
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="9_2_uid_and_process_isolation">
|
|
9.2. UID and Process Isolation
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST support the Android application sandbox model, in
|
|
which each application runs as a unique Unixstyle UID and in a separate
|
|
process. Device implementations MUST support running multiple applications as
|
|
the same Linux user ID, provided that the applications are properly signed and
|
|
constructed, as defined in the
|
|
<a href="http://developer.android.com/guide/topics/security/permissions.html">
|
|
Security and Permissions reference
|
|
</a>.
|
|
</p>
|
|
<h3 id="9_3_filesystem_permissions">
|
|
9.3. Filesystem Permissions
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST support the Android file access permissions model
|
|
as defined in the
|
|
<a href="http://developer.android.com/guide/topics/security/permissions.html">
|
|
Security and Permissions reference
|
|
</a>.
|
|
</p>
|
|
<h3 id="9_4_alternate_execution_environments">
|
|
9.4. Alternate Execution Environments
|
|
</h3>
|
|
<p>
|
|
Device implementations MAY include runtime environments that execute
|
|
applications using some other software or technology than the Dalvik Executable
|
|
Format or native code. However, such alternate execution environments MUST NOT
|
|
compromise the Android security model or the security of installed Android
|
|
applications, as described in this section.
|
|
</p>
|
|
<p>
|
|
Alternate runtimes MUST themselves be Android applications, and abide by the
|
|
standard Android security model, as described elsewhere in
|
|
<a href="#9_security_model_compatibility">
|
|
section 9
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Alternate runtimes MUST NOT be granted access to resources protected by
|
|
permissions not requested in the runtime’s AndroidManifest.xml file via the
|
|
<uses-permission> mechanism.
|
|
</p>
|
|
<p>
|
|
Alternate runtimes MUST NOT permit applications to make use of features
|
|
protected by Android permissions restricted to system applications.
|
|
</p>
|
|
<p>
|
|
Alternate runtimes MUST abide by the Android sandbox model. Specifically,
|
|
alternate runtimes:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD install apps via the PackageManager into separate Android sandboxes
|
|
(Linux user IDs, etc.).
|
|
</li>
|
|
<li>
|
|
MAY provide a single Android sandbox shared by all applications using the
|
|
alternate runtime.
|
|
</li>
|
|
<li>
|
|
Installed applications using an alternate runtime MUST NOT reuse the
|
|
sandbox of any other app installed on the device, except through the standard
|
|
Android mechanisms of shared user ID and signing certificate.
|
|
</li>
|
|
<li>
|
|
MUST NOT launch with, grant, or be granted access to the sandboxes
|
|
corresponding to other Android applications.
|
|
</li>
|
|
<li>
|
|
MUST NOT be launched with, be granted, or grant to other applications any
|
|
privileges of the superuser (root), or of any other user ID.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The .apk files of alternate runtimes MAY be included in the system image of a
|
|
device implementation, but MUST be signed with a key distinct from the key used
|
|
to sign other applications included with the device implementation.
|
|
</p>
|
|
<p>
|
|
When installing applications, alternate runtimes MUST obtain user consent for
|
|
the Android permissions used by the application. If an application needs to
|
|
make use of a device resource for which there is a corresponding Android
|
|
permission (such as Camera, GPS, etc.), the alternate runtime MUST inform the
|
|
user that the application will be able to access that resource. If the runtime
|
|
environment does not record application capabilities in this manner, the
|
|
runtime environment MUST list all permissions held by the runtime itself when
|
|
installing any application using that runtime.
|
|
</p>
|
|
<h3 id="9_5_multi-user_support">
|
|
9.5. Multi-User Support
|
|
</h3>
|
|
<div class="note">
|
|
This feature is optional for all device types.
|
|
</div>
|
|
<p>
|
|
Android includes
|
|
<a href="http://developer.android.com/reference/android/os/UserManager.html">
|
|
support for multiple users
|
|
</a>
|
|
and
|
|
provides support for full user isolation. Device implementations MAY enable
|
|
multiple users, but when enabled MUST meet the following requirements related
|
|
to
|
|
<a href="http://source.android.com/devices/storage/traditional.html">
|
|
multi-user support
|
|
</a>:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Android Automotive device implementations with multi-user support enabled
|
|
MUST include a guest account that allows all functions provided by the vehicle
|
|
system without requiring a user to log in.
|
|
</li>
|
|
<li>
|
|
Device implementations that do not declare the android.hardware.telephony
|
|
feature flag MUST support restricted profiles, a feature that allows device
|
|
owners to manage additional users and their capabilities on the device. With
|
|
restricted profiles, device owners can quickly set up separate environments for
|
|
additional users to work in, with the ability to manage finer-grained
|
|
restrictions in the apps that are available in those environments.
|
|
</li>
|
|
<li>
|
|
Conversely device implementations that declare the
|
|
android.hardware.telephony feature flag MUST NOT support restricted profiles
|
|
but MUST align with the AOSP implementation of controls to enable /disable
|
|
other users from accessing the voice calls and SMS.
|
|
</li>
|
|
<li>
|
|
Device implementations MUST, for each user, implement a security model
|
|
consistent with the Android platform security model as defined in
|
|
<a href="http://developer.android.com/guide/topics/security/permissions.html">
|
|
Security and Permissions reference document
|
|
</a>
|
|
in the APIs.
|
|
</li>
|
|
<li>
|
|
Each user instance on an Android device MUST have separate and isolated
|
|
external storage directories. Device implementations MAY store multiple users'
|
|
data on the same volume or filesystem. However, the device implementation MUST
|
|
ensure that applications owned by and running on behalf a given user cannot
|
|
list, read, or write to data owned by any other user. Note that removable
|
|
media, such as SD card slots, can allow one user to access another’s data by
|
|
means of a host PC. For this reason, device implementations that use removable
|
|
media for the external storage APIs MUST encrypt the contents of the SD card if
|
|
multiuser is enabled using a key stored only on non-removable media accessible
|
|
only to the system. As this will make the media unreadable by a host PC, device
|
|
implementations will be required to switch to MTP or a similar system to
|
|
provide host PCs with access to the current user’s data. Accordingly, device
|
|
implementations MAY but SHOULD NOT enable multi-user if they use
|
|
<a href="http://developer.android.com/reference/android/os/Environment.html">
|
|
removable media
|
|
</a>
|
|
for
|
|
primary external storage.
|
|
</li>
|
|
</ul>
|
|
<h3 id="9_6_premium_sms_warning">
|
|
9.6. Premium SMS Warning
|
|
</h3>
|
|
<p>
|
|
Android includes support for warning users of any outgoing
|
|
<a href="http://en.wikipedia.org/wiki/Short_code">
|
|
premium SMS message
|
|
</a>. Premium SMS
|
|
messages are text messages sent to a service registered with a carrier that may
|
|
incur a charge to the user. Device implementations that declare support for
|
|
android.hardware.telephony MUST warn users before sending a SMS message to
|
|
numbers identified by regular expressions defined in /data/misc/sms/codes.xml
|
|
file in the device. The upstream Android Open Source Project provides an
|
|
implementation that satisfies this requirement.
|
|
</p>
|
|
<h3 id="9_7_kernel_security_features">
|
|
9.7. Kernel Security Features
|
|
</h3>
|
|
<p>
|
|
The Android Sandbox includes features that use the Security-Enhanced Linux
|
|
(SELinux) mandatory access control (MAC) system, seccomp sandboxing, and other
|
|
security features in the Linux kernel. SELinux or any other security features
|
|
implemented below the Android framework:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST maintain compatibility with existing applications.
|
|
</li>
|
|
<li>
|
|
MUST NOT have a visible user interface when a security violation is
|
|
detected and successfully blocked, but MAY have a visible user interface when
|
|
an unblocked security violation occurs resulting in a successful exploit.
|
|
</li>
|
|
<li>
|
|
SHOULD NOT be user or developer configurable.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
If any API for configuration of policy is exposed to an application that can
|
|
affect another application (such as a Device Administration API), the API MUST
|
|
NOT allow configurations that break compatibility.
|
|
</p>
|
|
<p>
|
|
Devices MUST implement SELinux or, if using a kernel other than Linux, an
|
|
equivalent mandatory access control system. Devices MUST also meet the
|
|
following requirements, which are satisfied by the reference implementation in
|
|
the upstream Android Open Source Project.
|
|
</p>
|
|
<p>
|
|
Device implementations:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST set SELinux to global enforcing mode.
|
|
</li>
|
|
<li>
|
|
MUST configure all domains in enforcing mode. No permissive mode domains
|
|
are allowed, including domains specific to a device/vendor.
|
|
</li>
|
|
<li>
|
|
MUST NOT modify, omit, or replace the neverallow rules present within the
|
|
system/sepolicy folder provided in the upstream Android Open Source Project
|
|
(AOSP) and the policy MUST compile with all neverallow rules present, for both
|
|
AOSP SELinux domains as well as device/vendor specific domains.
|
|
</li>
|
|
<li>
|
|
MUST split the media framework into multiple processes so that it
|
|
is possible to more narrowly grant access for each process as
|
|
<a href="https://source.android.com/devices/media/framework-hardening.html#arch_changes">
|
|
described
|
|
</a>
|
|
in the Android Open Source Project site.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Device implementations SHOULD retain the default SELinux policy provided in the
|
|
system/sepolicy folder of the upstream Android Open Source Project and only
|
|
further add to this policy for their own device-specific configuration. Device
|
|
implementations MUST be compatible with the upstream Android Open Source
|
|
Project.
|
|
</p>
|
|
<p>
|
|
Devices MUST implement a kernel application sandboxing mechanism which allows
|
|
filtering of system calls using a configurable policy from multithreaded
|
|
programs. The upstream Android Open Source Project meets this requirement
|
|
through enabling the seccomp-BPF with threadgroup synchronization (TSYNC) as
|
|
described
|
|
<a href="http://source.android.com/devices/tech/config/kernel.html#Seccomp-BPF-TSYNC">
|
|
in the Kernel Configuration section of source.android.com
|
|
</a>.
|
|
</p>
|
|
<h3 id="9_8_privacy">
|
|
9.8. Privacy
|
|
</h3>
|
|
<p>
|
|
If the device implements functionality in the system that captures the contents
|
|
displayed on the screen and/or records the audio stream played on the device,
|
|
it MUST continuously notify the user whenever this functionality is enabled and
|
|
actively capturing/recording.
|
|
</p>
|
|
<p>
|
|
If a device implementation has a mechanism that routes network data traffic
|
|
through a proxy server or VPN gateway by default (for example, preloading a VPN
|
|
service with android.permission.CONTROL_VPN granted), the device implementation
|
|
MUST ask for the user's consent before enabling that mechanism, unless that
|
|
VPN is enabled by the Device Policy Controller via the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean)">
|
|
<code>
|
|
DevicePolicyManager.setAlwaysOnVpnPackage()
|
|
</code>
|
|
</a>, in which case the user does not need to provide a separate consent, but MUST
|
|
only be notified.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST ship with an empty user-added Certificate Authority
|
|
(CA) store, and MUST preinstall the same root certificates for the system-trusted
|
|
CA store as
|
|
<a href="https://source.android.com/security/overview/app-security.html#certificate-authorities">
|
|
provided
|
|
</a>
|
|
in the upstream Android Open Source Project.
|
|
</p>
|
|
<p>
|
|
When devices are routed through a VPN, or a user root CA is installed, the
|
|
implementation MUST display a warning indicating the network traffic may be
|
|
monitored to the user.
|
|
</p>
|
|
<p>
|
|
If a device implementation has a USB port with USB peripheral mode support, it
|
|
MUST present a user interface asking for the user's consent before allowing
|
|
access to the contents of the shared storage over the USB port.
|
|
</p>
|
|
<h3 id="9_9_data_storage_encryption">
|
|
9.9. Data Storage Encryption
|
|
</h3>
|
|
<div class="note">
|
|
Optional for Android device implementations without a secure lock screen.
|
|
</div>
|
|
<p>
|
|
If the device implementation supports a secure lock screen as described in section 9.11.1,
|
|
then the device MUST support data storage encryption of the application private data (/data partition), as well as the
|
|
application shared storage partition (/sdcard partition) if it is a permanent,
|
|
non-removable part of the device.
|
|
</p>
|
|
<p>
|
|
For device implementations supporting data storage encryption and with Advanced
|
|
Encryption Standard (AES) crypto performance above 50MiB/sec, the data storage
|
|
encryption MUST be enabled by default at the time the user has completed the
|
|
out-of-box setup experience. If a device implementation is already launched on
|
|
an earlier Android version with encryption disabled by default, such
|
|
a device cannot meet the requirement through a system software update and thus
|
|
MAY be exempted.
|
|
</p>
|
|
<p>
|
|
Device implementations SHOULD meet the above data storage encryption requirement
|
|
via implementing
|
|
<a href="https://source.android.com/security/encryption/file-based.html">
|
|
File Based Encryption
|
|
</a>
|
|
(FBE).
|
|
</p>
|
|
<h4 id="9_9_1_direct_boot">
|
|
9.9.1. Direct Boot
|
|
</h4>
|
|
<p>
|
|
All devices MUST implement the
|
|
<a href="http://developer.android.com/preview/features/direct-boot.html">
|
|
Direct Boot mode
|
|
</a>
|
|
APIs even
|
|
if they do not support Storage Encryption. In particular, the
|
|
<a href="https://developer.android.com/reference/android/content/Intent.html#LOCKED_BOOT_COMPLETED">
|
|
LOCKED_BOOT_COMPLETED
|
|
</a>
|
|
and
|
|
<a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_USER_UNLOCKED">
|
|
ACTION_USER_UNLOCKED
|
|
</a>
|
|
Intents must still be broadcast to signal Direct Boot aware applications that
|
|
Device Encrypted (DE) and Credential Encrypted (CE) storage locations are
|
|
available for user.
|
|
</p>
|
|
<h4 id="9_9_2_file_based_encryption">
|
|
9.9.2. File Based Encryption
|
|
</h4>
|
|
<p>
|
|
Device implementations supporting FBE:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST boot up without challenging the user for credentials and allow Direct
|
|
Boot aware apps to access to the Device Encrypted (DE) storage after the
|
|
LOCKED_BOOT_COMPLETED message is broadcasted.
|
|
</li>
|
|
<li>
|
|
MUST only allow access to Credential Encrypted (CE) storage after the user
|
|
has unlocked the device by supplying their credentials (eg. passcode, pin,
|
|
pattern or fingerprint) and the ACTION_USER_UNLOCKED message is broadcasted.
|
|
Device implementations MUST NOT offer any
|
|
method to unlock the CE protected storage without the user supplied
|
|
credentials.
|
|
</li>
|
|
<li>
|
|
MUST support Verified Boot and ensure that DE keys are cryptographically
|
|
bound to the device's hardware root of trust.
|
|
</li>
|
|
<li>
|
|
MUST support encrypting file contents using AES with a key length of 256-bits
|
|
in XTS mode.
|
|
</li>
|
|
<li>
|
|
MUST support encrypting file name using AES with a key length of 256-bits in
|
|
CBC-CTS mode.
|
|
</li>
|
|
<li>
|
|
MAY support alternative ciphers, key lengths and modes for file content and
|
|
file name encryption, but MUST use the mandatorily supported ciphers,
|
|
key lengths and modes by default.
|
|
</li>
|
|
<li>
|
|
SHOULD make preloaded essential apps (e.g. Alarm, Phone, Messenger)
|
|
Direct Boot aware.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The keys protecting CE and DE storage areas:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
MUST be cryptographically bound to a hardware-backed Keystore. CE keys
|
|
must be bound to a user's lock screen credentials. If the user has
|
|
specified no lock screen credentials then the CE keys MUST be bound to
|
|
a default passcode.
|
|
</li>
|
|
<li>
|
|
MUST be unique and distinct, in other words no user's CE or DE key
|
|
may match any other user's CE or DE keys.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The upstream Android Open Source project provides a preferred implementation of
|
|
this feature based on the Linux kernel ext4 encryption feature.
|
|
</p>
|
|
<h4 id="9_9_3_full_disk_encryption">
|
|
9.9.3. Full Disk Encryption
|
|
</h4>
|
|
<p>
|
|
Device implementations supporting
|
|
<a href="http://source.android.com/devices/tech/security/encryption/index.html">
|
|
full disk encryption
|
|
</a>
|
|
(FDE). MUST use AES with a key of 128-bits
|
|
(or greater) and a mode designed for storage (for example, AES-XTS,
|
|
AES-CBC-ESSIV). The encryption key MUST NOT be written to storage at any time
|
|
without being encrypted. The user MUST be provided with the possibility to AES
|
|
encrypt the encryption key, except when it is in active use, with the lock
|
|
screen credentials stretched using a slow stretching algorithm
|
|
(e.g. PBKDF2 or scrypt). If the user has not specified a lock screen
|
|
credentials or has disabled use of the passcode for encryption, the system
|
|
SHOULD use a default passcode to wrap the encryption key. If the device
|
|
provides a hardware-backed keystore, the password stretching algorithm MUST
|
|
be cryptographically bound to that keystore. The encryption key MUST NOT be
|
|
sent off the device (even when wrapped with the user passcode and/or hardware
|
|
bound key). The upstream Android Open Source project provides a preferred
|
|
implementation of this feature based on the Linux kernel feature dm-crypt.
|
|
</p>
|
|
<h3 id="9_10_device_integrity">
|
|
9.10. Device Integrity
|
|
</h3>
|
|
<p>
|
|
The following requirements ensures there is transparancy to the status of the
|
|
device integrity.
|
|
</p>
|
|
<p>
|
|
Device implementations MUST correctly report through the System API method
|
|
PersistentDataBlockManager.getFlashLockState() whether their bootloader state
|
|
permits flashing of the system image. The
|
|
<code>
|
|
FLASH_LOCK_UNKNOWN
|
|
</code>
|
|
state is reserved
|
|
for device implementations upgrading from an earlier version of Android where this
|
|
new system API method did not exist.
|
|
</p>
|
|
<p>
|
|
Verified boot is a feature that guarantees the integrity of the device
|
|
software. If a device implementation supports the feature, it MUST:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Declare the platform feature flag android.software.verified_boot.
|
|
</li>
|
|
<li>
|
|
Perform verification on every boot sequence.
|
|
</li>
|
|
<li>
|
|
Start verification from an immutable hardware key that is the root of trust
|
|
and go all the way up to the system partition.
|
|
</li>
|
|
<li>
|
|
Implement each stage of verification to check the integrity and
|
|
authenticity of all the bytes in the next stage before executing the code in
|
|
the next stage.
|
|
</li>
|
|
<li>
|
|
Use verification algorithms as strong as current recommendations from NIST
|
|
for hashing algorithms (SHA-256) and public key sizes (RSA-2048).
|
|
</li>
|
|
<li>
|
|
MUST NOT allow boot to complete when system verification fails, unless the
|
|
user consents to attempt booting anyway, in which case the data from any
|
|
non-verified storage blocks MUST not be used.
|
|
</li>
|
|
<li>
|
|
MUST NOT allow verified partitions on the device to be modified unless the
|
|
user has explicitly unlocked the boot loader.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
The upstream Android Open Source Project provides a preferred implementation of
|
|
this feature based on the Linux kernel feature dm-verity.
|
|
</p>
|
|
<p>
|
|
Starting from Android 6.0, device implementations with Advanced Encryption
|
|
Standard (AES) crypto performance above 50 MiB/seconds MUST support verified boot
|
|
for device integrity.
|
|
</p>
|
|
<p>
|
|
If a device implementation is already launched without supporting verified boot
|
|
on an earlier version of Android, such a device can not add support for this feature
|
|
with a system software update and thus are exempted from the requirement.
|
|
</p>
|
|
<h3 id="9_11_keys_and_credentials">
|
|
9.11. Keys and Credentials
|
|
</h3>
|
|
<p>
|
|
The
|
|
<a href="https://developer.android.com/training/articles/keystore.html">
|
|
Android Keystore System
|
|
</a>
|
|
allows
|
|
app developers to store cryptographic keys in a container and use them in
|
|
cryptographic operations through the
|
|
<a href="https://developer.android.com/reference/android/security/KeyChain.html">
|
|
KeyChain API
|
|
</a>
|
|
or
|
|
the
|
|
<a href="https://developer.android.com/reference/java/security/KeyStore.html">
|
|
Keystore API
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
All Android device implementations MUST meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
SHOULD not limit the number of keys that can be generated, and MUST at
|
|
least allow more than 8,192 keys to be imported.
|
|
</li>
|
|
<li>
|
|
The lock screen authentication MUST rate limit attempts and MUST have an
|
|
exponential backoff algorithm. Beyond 150 failed attempts, the delay MUST be
|
|
at least 24 hours per attempt.
|
|
</li>
|
|
<li>
|
|
When the device implementation supports a secure lock screen it MUST back up the
|
|
keystore implementation with secure hardware and meet following requirements:
|
|
<ul>
|
|
<li>
|
|
MUST have implementations of RSA, AES, ECDSA and HMAC cryptographic
|
|
algorithms and MD5, SHA1, and SHA-2 family hash functions to properly
|
|
support the Android Keystore system's supported algorithms in an area
|
|
that is securely isolated from the code running on the kernel and
|
|
above. Secure isolation MUST block all potential mechanisms by which
|
|
kernel or userspace code might access the internal state of the
|
|
isolated environment, including DMA. The upstream Android Open Source
|
|
Project (AOSP) meets this requirement by using the
|
|
<a href="https://source.android.com/security/trusty/">
|
|
Trusty
|
|
</a>
|
|
implementation, but another ARM TrustZone-based solution or a
|
|
third-party reviewed secure implementation of a proper
|
|
hypervisor-based isolation are alternative options.
|
|
</li>
|
|
<li>
|
|
MUST perform the lock screen authentication in the isolated execution
|
|
environment and only when successful, allow the authentication-bound
|
|
keys to be used. The upstream Android Open Source Project provides
|
|
the
|
|
<a href="http://source.android.com/devices/tech/security/authentication/gatekeeper.html">
|
|
Gatekeeper Hardware Abstraction Layer (HAL)
|
|
</a>
|
|
and Trusty, which can be used to satisfy this requirement.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Note that if a device implementation is already launched on an earlier Android
|
|
version, such a device is exempted from the requirement to have a
|
|
hardware-backed keystore, unless it declares the
|
|
<code>
|
|
android.hardware.fingerprint
|
|
</code>
|
|
feature which requires a hardware-backed keystore.
|
|
</p>
|
|
<h4 id="9_11_1_secure_lock_screen">
|
|
9.11.1. Secure Lock Screen
|
|
</h4>
|
|
<p>
|
|
Device implementations MAY add or modify the authentication methods to unlock
|
|
the lock screen, but MUST still meet the following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The authentication method, if based on a known secret, MUST NOT be treated
|
|
as a secure lock screen unless it meets all following requirements:
|
|
<ul>
|
|
<li>
|
|
The entropy of the shortest allowed length of inputs MUST be greater
|
|
than 10 bits.
|
|
</li>
|
|
<li>
|
|
The maximum entropy of all possible inputs MUST be greater than 18 bits.
|
|
</li>
|
|
<li>
|
|
MUST not replace any of the existing authentication methods (PIN,
|
|
pattern, password) implemented and provided in AOSP.
|
|
</li>
|
|
<li>
|
|
MUST be disabled when the Device Policy Controller (DPC) application
|
|
has set the password quality policy via the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordQuality()
|
|
</code>
|
|
</a>
|
|
method with a more restrictive quality constant than
|
|
<code>
|
|
PASSWORD_QUALITY_SOMETHING
|
|
</code>
|
|
.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
The authenticaion method, if based on a physical token or the location,
|
|
MUST NOT be treated as a secure lock screen unless it meets all following
|
|
requirements:
|
|
<ul>
|
|
<li>
|
|
It MUST have a fall-back mechanism to use one of the primary
|
|
authentication methods which is based on a known secret and meets
|
|
the requirements to be treated as a secure lock screen.
|
|
</li>
|
|
<li>
|
|
It MUST be disabled and only allow the primary authentication to
|
|
unlock the screen when the Device Policy Controller (DPC) application
|
|
has set the policy with either the
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setKeyguardDisabledFeatures%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
|
|
</code>
|
|
</a>
|
|
method or the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordQuality()
|
|
</code>
|
|
</a>
|
|
method with a more restrictive quality constant than
|
|
<code>
|
|
PASSWORD_QUALITY_UNSPECIFIED
|
|
</code>
|
|
.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
The authentication method, if based on biometrics, MUST NOT be treated as a
|
|
secure lock screen unless it meets all following requirements:
|
|
<ul>
|
|
<li>
|
|
It MUST have a fall-back mechanism to use one of the primary
|
|
authentication methods which is based on a known secret and meets
|
|
the requirements to be treated as a secure lock screen.
|
|
</li>
|
|
<li>
|
|
It MUST be disabled and only allow the primary authentication to
|
|
unlock the screen when the Device Policy Controller (DPC) application
|
|
has set the keguard feature policy by calling the method
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setKeyguardDisabledFeatures%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_FINGERPRINT)
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
It MUST have a false acceptance rate that is equal or stronger than
|
|
what is required for a fingerprint sensor as described in
|
|
section 7.3.10, or otherwise MUST be disabled and only allow the
|
|
primary authentication to unlock the screen when the Device Policy
|
|
Controller (DPC) application has set the password quality policy
|
|
via the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordQuality()
|
|
</code>
|
|
</a>
|
|
method with a more restrictive quality constant than
|
|
<code>
|
|
PASSWORD_QUALITY_BIOMETRIC_WEAK
|
|
</code>
|
|
.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
If the authentication method can not be treated as a secure lock screen,
|
|
it:
|
|
<ul>
|
|
<li>
|
|
MUST return
|
|
<code>
|
|
false
|
|
</code>
|
|
for both the
|
|
<a href="http://developer.android.com/reference/android/app/KeyguardManager.html#isKeyguardSecure%28%29">
|
|
<code>
|
|
KeyguardManager.isKeyguardSecure()
|
|
</code>
|
|
</a>
|
|
and the
|
|
<a href="https://developer.android.com/reference/android/app/KeyguardManager.html#isDeviceSecure%28%29">
|
|
<code>
|
|
KeyguardManager.isDeviceSecure()
|
|
</code>
|
|
</a>
|
|
methods.
|
|
</li>
|
|
<li>
|
|
MUST be disabled when the Device Policy Controller (DPC) application
|
|
has set the password quality policy via the
|
|
<a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordQuality()
|
|
</code>
|
|
</a>
|
|
method with a more restrictive quality constant than
|
|
<code>
|
|
PASSWORD_QUALITY_UNSPECIFIED
|
|
</code>
|
|
.
|
|
</li>
|
|
<li>
|
|
MUST NOT reset the password expiration timers set by
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordExpirationTimeout%28android.content.ComponentName,%20long%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordExpirationTimeout()
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST NOT authenticate access to keystores if the application has called
|
|
<a href="https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29">
|
|
<code>
|
|
KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)
|
|
</code>
|
|
</a>
|
|
).
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
If the authentication method is based on a physical token, the location,
|
|
or biometrics that has higher false acceptance rate than what is required
|
|
for fingerprint sensors as described in section 7.3.10, then it:
|
|
<ul>
|
|
<li>
|
|
MUST NOT reset the password expiration timers set by
|
|
<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordExpirationTimeout%28android.content.ComponentName,%20long%29">
|
|
<code>
|
|
DevicePolicyManager.setPasswordExpirationTimeout()
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
<li>
|
|
MUST NOT authenticate access to keystores if the application has called
|
|
<a href="https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29">
|
|
<code>
|
|
KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)
|
|
</code>
|
|
</a>.
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="9_12_data_deletion">
|
|
9.12. Data Deletion
|
|
</h3>
|
|
<p>
|
|
Devices MUST provide users with a mechanism to perform a "Factory Data Reset"
|
|
that allows logical and physical deletion of all data except for the following:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The system image
|
|
</li>
|
|
<li>
|
|
Any operating system files required by the system image
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
All user-generated data MUST be deleted. This MUST satisfy relevant industry
|
|
standards for data deletion such as NIST SP800-88. This MUST be used for the
|
|
implementation of the wipeData() API (part of the Android Device Administration
|
|
API) described in
|
|
<a href="#3_9_device_administration">
|
|
section 3.9 Device Administration
|
|
</a>.
|
|
</p>
|
|
<p>
|
|
Devices MAY provide a fast data wipe that conducts a logical data erase.
|
|
</p>
|
|
<h3 id="9_13_safe_boot_mode">
|
|
9.13. Safe Boot Mode
|
|
</h3>
|
|
<p>
|
|
Android provides a mode enabling users to boot up into a mode where only
|
|
preinstalled system apps are allowed to run and all third-party apps are
|
|
disabled. This mode, known as "Safe Boot Mode", provides the user the
|
|
capability to uninstall potentially harmful third-party apps.
|
|
</p>
|
|
<p>
|
|
Android device implementations are STRONGLY RECOMENDED to implement Safe Boot
|
|
Mode and meet following requirements:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
Device implementations SHOULD provide the user an option to enter Safe Boot
|
|
Mode from the boot menu which is reachable through a workflow that is different
|
|
from that of normal boot.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Device implementations MUST provide the user an option to enter Safe Boot Mode
|
|
in such a way that is uninterruptible from third-party apps installed on
|
|
the device, except for when the third party app is a Device Policy Controller
|
|
and has set the
|
|
<a href="https://developer.android.com/reference/android/os/UserManager.html#DISALLOW_SAFE_BOOT">
|
|
<code>
|
|
UserManager.DISALLOW_SAFE_BOOT
|
|
</code>
|
|
</a>
|
|
flag as true.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Device implementations MUST provide the user the capability to uninstall
|
|
any third-party apps within Safe Mode.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<h3 id="9_14_automotive_vehicle_system_isolation">
|
|
9.14. Automotive Vehicle System Isolation
|
|
</h3>
|
|
<p>
|
|
Android Automotive devices are expected to exchange data with critical vehicle
|
|
subsystems, e.g., by using the
|
|
<a href="http://source.android.com/devices/automotive.html">
|
|
vehicle HAL
|
|
</a>
|
|
to send and receive messages over vehicle networks such as CAN bus. Android
|
|
Automotive device implementations MUST implement security features below the
|
|
Android framework layers to prevent malicious or unintentional interaction
|
|
between the Android framework or third-party apps and vehicle subsystems. These
|
|
security features are as follows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Gatekeeping messages from Android framework vehicle subsystems, e.g.,
|
|
whitelisting permitted message types and message sources.
|
|
</li>
|
|
<li>
|
|
Watchdog against denial of service attacks from the Android framework or
|
|
third-party apps. This guards against malicious software flooding the vehicle
|
|
network with traffic, which may lead to malfunctioning vehicle subsystems.
|
|
</li>
|
|
</ul>
|
|
<h2 id="10_software_compatibility_testing">
|
|
10. Software Compatibility Testing
|
|
</h2>
|
|
<p>
|
|
Device implementations MUST pass all tests described in this section.
|
|
</p>
|
|
<p>
|
|
However, note that no software test package is fully comprehensive. For this
|
|
reason, device implementers are
|
|
<strong>
|
|
STRONGLY RECOMMENDED
|
|
</strong>
|
|
to make the minimum
|
|
number of changes as possible to the reference and preferred implementation of
|
|
Android available from the Android Open Source Project. This will minimize the
|
|
risk of introducing bugs that create incompatibilities requiring rework and
|
|
potential device updates.
|
|
</p>
|
|
<h3 id="10_1_compatibility_test_suite">
|
|
10.1. Compatibility Test Suite
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST pass the
|
|
<a href="http://source.android.com/compatibility/index.html">
|
|
Android Compatibility Test Suite (CTS)
|
|
</a>
|
|
available from the Android Open Source Project, using the final shipping
|
|
software on the device. Additionally, device implementers SHOULD use the
|
|
reference implementation in the Android Open Source tree as much as possible,
|
|
and MUST ensure compatibility in cases of ambiguity in CTS and for any
|
|
reimplementations of parts of the reference source code.
|
|
</p>
|
|
<p>
|
|
The CTS is designed to be run on an actual device. Like any software, the CTS
|
|
may itself contain bugs. The CTS will be versioned independently of this
|
|
Compatibility Definition, and multiple revisions of the CTS may be released for
|
|
Android 7.1. Device implementations MUST pass the latest CTS
|
|
version available at the time the device software is completed.
|
|
</p>
|
|
<h3 id="10_2_cts_verifier">
|
|
10.2. CTS Verifier
|
|
</h3>
|
|
<p>
|
|
Device implementations MUST correctly execute all applicable cases in the CTS
|
|
Verifier. The CTS Verifier is included with the Compatibility Test Suite, and
|
|
is intended to be run by a human operator to test functionality that cannot be
|
|
tested by an automated system, such as correct functioning of a camera and
|
|
sensors.
|
|
</p>
|
|
<p>
|
|
The CTS Verifier has tests for many kinds of hardware, including some hardware
|
|
that is optional. Device implementations MUST pass all tests for hardware that
|
|
they possess; for instance, if a device possesses an accelerometer, it MUST
|
|
correctly execute the Accelerometer test case in the CTS Verifier. Test cases
|
|
for features noted as optional by this Compatibility Definition Document MAY be
|
|
skipped or omitted.
|
|
</p>
|
|
<p>
|
|
Every device and every build MUST correctly run the CTS Verifier, as noted
|
|
above. However, since many builds are very similar, device implementers are not
|
|
expected to explicitly run the CTS Verifier on builds that differ only in
|
|
trivial ways. Specifically, device implementations that differ from an
|
|
implementation that has passed the CTS Verifier only by the set of included
|
|
locales, branding, etc. MAY omit the CTS Verifier test.
|
|
</p>
|
|
<h2 id="11_updatable_software">
|
|
11. Updatable Software
|
|
</h2>
|
|
<p>
|
|
Device implementations MUST include a mechanism to replace the entirety of the
|
|
system software. The mechanism need not perform “live” upgrades—that is, a
|
|
device restart MAY be required.
|
|
</p>
|
|
<p>
|
|
Any method can be used, provided that it can replace the entirety of the
|
|
software preinstalled on the device. For instance, any of the following
|
|
approaches will satisfy this requirement:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
“Over-the-air (OTA)” downloads with offline update via reboot.
|
|
</li>
|
|
<li>
|
|
“Tethered” updates over USB from a host PC.
|
|
</li>
|
|
<li>
|
|
“Offline” updates via a reboot and update from a file on removable storage.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
However, if the device implementation includes support for an unmetered data
|
|
connection such as 802.11 or Bluetooth PAN (Personal Area Network) profile, it
|
|
MUST support OTA downloads with offline update via reboot.
|
|
</p>
|
|
<p>
|
|
The update mechanism used MUST support updates without wiping user data. That
|
|
is, the update mechanism MUST preserve application private data and application
|
|
shared data. Note that the upstream Android software includes an update
|
|
mechanism that satisfies this requirement.
|
|
</p>
|
|
<p>
|
|
For device implementations that are launching with Android 6.0 and
|
|
later, the update mechanism SHOULD support verifying that the system image is
|
|
binary identical to expected result following an OTA. The block-based OTA
|
|
implementation in the upstream Android Open Source Project, added since Android
|
|
5.1, satisfies this requirement.
|
|
</p>
|
|
<p>
|
|
Also, device implementations SHOULD support
|
|
<a href="https://source.android.com/devices/tech/ota/ab_updates.html">
|
|
A/B system updates
|
|
</a>.
|
|
The AOSP implements this feature using the boot control HAL.
|
|
</p>
|
|
<p>
|
|
If an error is found in a device implementation after it has been released but
|
|
within its reasonable product lifetime that is determined in consultation with
|
|
the Android Compatibility Team to affect the compatibility of third-party
|
|
applications, the device implementer MUST correct the error via a software
|
|
update available that can be applied per the mechanism just described.
|
|
</p>
|
|
<p>
|
|
Android includes features that allow the Device Owner app (if present) to
|
|
control the installation of system updates. To facilitate this, the system
|
|
update subsystem for devices that report android.software.device_admin MUST
|
|
implement the behavior described in the
|
|
<a href="http://developer.android.com/reference/android/app/admin/SystemUpdatePolicy.html">
|
|
SystemUpdatePolicy
|
|
</a>
|
|
class.
|
|
</p>
|
|
<h2 id="12_document_changelog">
|
|
12. Document Changelog
|
|
</h2>
|
|
<p>
|
|
For a summary of changes to the Compatibility Definition in this release:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/?pretty=full&no-merges">
|
|
Document changelog
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
For a summary of changes to individuals sections:
|
|
</p>
|
|
<ol>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/1_introduction?pretty=full&no-merges">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/2_device_types?pretty=full&no-merges">
|
|
Device Types
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/3_software?pretty=full&no-merges">
|
|
Software
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/4_application-packaging?pretty=full&no-merges">
|
|
Application Packaging
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/5_multimedia?pretty=full&no-merges">
|
|
Multimedia
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/6_dev-tools-and-options?pretty=full&no-merges">
|
|
Developer Tools and Options
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/7_hardware-compatibility?pretty=full&no-merges">
|
|
Hardware Compatibility
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/8_performance-and-power?pretty=full&no-merges">
|
|
Performance and Power
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/9_security-model?pretty=full&no-merges">
|
|
Security Model
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/10_software-compatibility-testing?pretty=full&no-merges">
|
|
Software Compatibility Testing
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/11_updatable-software?pretty=full&no-merges">
|
|
Updatable Software
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/12_document-changelog?pretty=full&no-merges">
|
|
Document Changelog
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://android.googlesource.com/platform/compatibility/cdd/+log/nougat-mr1-dev/13_contact-us?pretty=full&no-merges">
|
|
Contact Us
|
|
</a>
|
|
</li>
|
|
</ol>
|
|
<h3 id="12_1_changelog_viewing_tips">
|
|
12.1. Changelog Viewing Tips
|
|
</h3>
|
|
<p>
|
|
Changes are marked as follows:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
<strong>
|
|
CDD
|
|
</strong>
|
|
<br/>
|
|
Substantive changes to the compatibility requirements.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<strong>
|
|
Docs
|
|
</strong>
|
|
<br/>
|
|
Cosmetic or build related changes.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
For best viewing, append the
|
|
<code>
|
|
pretty=full
|
|
</code>
|
|
and
|
|
<code>
|
|
no-merges
|
|
</code>
|
|
URL parameters to your
|
|
changelog URLs.
|
|
</p>
|
|
<h2 id="13_contact_us">
|
|
13. Contact Us
|
|
</h2>
|
|
<p>
|
|
You can join the
|
|
<a href="https://groups.google.com/forum/#!forum/android-compatibility">
|
|
android-compatibility forum
|
|
</a>
|
|
and ask for clarifications or bring up any issues that you think the document does not
|
|
cover.
|
|
</p>
|
|
</body>
|
|
</body>
|
|
</html>
|