898 lines
36 KiB
Plaintext
898 lines
36 KiB
Plaintext
|
page.title=<uses-feature>
|
||
|
@jd:body
|
||
|
|
||
|
<dl class="xml">
|
||
|
|
||
|
<dt>syntax:</dt>
|
||
|
<dd>
|
||
|
<pre class="stx"><uses-feature android:<a href="#name">name</a>="<em>string</em>"
|
||
|
android:<a href="#required">required</a>=["true" | "false"]
|
||
|
android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>" /></pre>
|
||
|
</dd>
|
||
|
|
||
|
<dt>contained in:</dt>
|
||
|
<dd><code><a
|
||
|
href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd>
|
||
|
|
||
|
<div class="sidebox-wrapper">
|
||
|
<img id="rule" src="{@docRoot}assets/images/grad-rule-qv.png">
|
||
|
<div id="qv-sub-rule">
|
||
|
<img src="{@docRoot}assets/images/icon_market.jpg" style="float:left;margin:0;padding:0;">
|
||
|
<p style="color:#669999;">Android Market and <code style="color:#669999;"><uses-feature></code> elements</p>
|
||
|
<p style="margin-top:1em;">Android Market filters the applications that are visible to users, so
|
||
|
that users can see and download only those applications that are compatible with their
|
||
|
devices. One of the ways Market filters applications is by feature compatibility.</p>
|
||
|
|
||
|
<p style="margin-top:1em;">To do this, Market checks the
|
||
|
<code><uses-feature></code> elements in each application's manifest, to
|
||
|
establish the app's feature needs. Market then shows or hides the application to
|
||
|
each user, based on a comparison with the features available on the user's
|
||
|
device. </p>
|
||
|
|
||
|
<p style="margin-top:1em;">By specifying the features that your application requires,
|
||
|
you enable Android Market to present your application only to users whose
|
||
|
devices meet the application's feature requirements, rather than presenting it
|
||
|
to all users. </p>
|
||
|
|
||
|
<p style="margin-top:1em;" class="caution">For important information about how
|
||
|
Android Market uses features as the basis for filtering, please read <a
|
||
|
href="#market-feature-filtering">Android Market and Feature-Based Filtering</a>,
|
||
|
below.</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<dt>description:</dt>
|
||
|
<dd>Declares a single hardware or software feature that is used by the
|
||
|
application.
|
||
|
|
||
|
<p>The purpose of a <code><uses-feature></code> declaration is to inform
|
||
|
any external entity of the set of hardware and software features on which your
|
||
|
application depends. The element offers a <code>required</code> attribute that
|
||
|
lets you specify whether your application requires and cannot function without
|
||
|
the declared feature, or whether it prefers to have the feature but can function
|
||
|
without it. Because feature support can vary across Android devices, the
|
||
|
<code><uses-feature></code> element serves an important role in letting an
|
||
|
application describe the device-variable features that it uses.</p>
|
||
|
|
||
|
<p>The set of available features that your application declares corresponds to
|
||
|
the set of feature constants made available by the Android {@link
|
||
|
android.content.pm.PackageManager}, which are listed for
|
||
|
convenience in the <a href="#features-reference">Features Reference</a> tables
|
||
|
at the bottom of this document.
|
||
|
|
||
|
<p>You must specify each feature in a separate <code><uses-feature></code>
|
||
|
element, so if your application requires multiple features, it would declare
|
||
|
multiple <code><uses-feature></code> elements. For example, an application
|
||
|
that requires both Bluetooth and camera features in the device would declare
|
||
|
these two elements:</p>
|
||
|
|
||
|
<pre>
|
||
|
<uses-feature android:name="android.hardware.bluetooth" />
|
||
|
<uses-feature android:name="android.hardware.camera" />
|
||
|
</pre>
|
||
|
|
||
|
<p>In general, you should always make sure to declare
|
||
|
<code><uses-feature></code> elements for all of the features that your
|
||
|
application requires.</p>
|
||
|
|
||
|
<p>Declared <code><uses-feature></code> elements are informational only, meaning
|
||
|
that the Android system itself does not check for matching feature support on
|
||
|
the device before installing an application. However, other services
|
||
|
(such as Android Market) or applications may check your application's
|
||
|
<code><uses-feature></code> declarations as part of handling or interacting
|
||
|
with your application. For this reason, it's very important that you declare all of
|
||
|
the features (from the list below) that your application uses. </p>
|
||
|
|
||
|
<p>For some features, there may exist a specfic attribute that allows you to define
|
||
|
a version of the feature, such as the version of Open GL used (declared with
|
||
|
<a href="#glEsVersion"><code>glEsVersion</code></a>). Other features that either do or do not
|
||
|
exist for a device, such as a camera, are declared using the
|
||
|
<a href="#name"><code>name</code></a> attribute.</p>
|
||
|
|
||
|
|
||
|
<p>Although the <code><uses-feature></code> element is only activated for
|
||
|
devices running API Level 4 or higher, it is recommended to include these
|
||
|
elements for all applications, even if the <a href="uses-sdk-element.html#min"><code>minSdkVersion</code></a>
|
||
|
is "3" or lower. Devices running older versions of the platform will simply
|
||
|
ignore the element.</p>
|
||
|
|
||
|
<p class="note"><strong>Note:</strong> When declaring a feature, remember
|
||
|
that you must also request permissions as appropriate. For example, you must
|
||
|
still request the {@link android.Manifest.permission#CAMERA}
|
||
|
permission before your application can access the camera API. Requesting the
|
||
|
permission grants your application access to the appropriate hardware and
|
||
|
software, while declaring the features used by your application ensures proper
|
||
|
device compatibility.</p>
|
||
|
|
||
|
</dd>
|
||
|
|
||
|
|
||
|
<dt>attributes:</dt>
|
||
|
|
||
|
<dd>
|
||
|
<dl class="attr">
|
||
|
|
||
|
<dt><a name="name"></a><code>android:name</code></dt>
|
||
|
<dd>Specifies a single hardware or software feature used by the application,
|
||
|
as a descriptor string. Valid descriptor values are listed in the <a
|
||
|
href="#hw-features">Hardware features</a> and <a href="#sw-features">Software
|
||
|
features</a> tables, below. </dd>
|
||
|
|
||
|
<dt><a name="required"></a><code>android:required</code></dt> <!-- added in api level 5 -->
|
||
|
<dd>Boolean value that indicates whether the application requires
|
||
|
the feature specified in <code>android:name</code>.
|
||
|
|
||
|
<ul>
|
||
|
<li>When you declare <code>"android:required="true"</code> for a feature,
|
||
|
you are specifying that the application <em>cannot function, or is not
|
||
|
designed to function</em>, when the specified feature is not present on the
|
||
|
device. </li>
|
||
|
|
||
|
<li>When you declare <code>"android:required="false"</code> for a feature, it
|
||
|
means that the application <em>prefers to use the feature</em> if present on
|
||
|
the device, but that it <em>is designed to function without the specified
|
||
|
feature</em>, if necessary. </li>
|
||
|
|
||
|
</ul>
|
||
|
|
||
|
<p>The default value for <code>android:required</code> if not declared is
|
||
|
<code>"true"</code>.</p>
|
||
|
</dd>
|
||
|
|
||
|
<dt><a name="glEsVersion"></a><code>android:glEsVersion</code></dt>
|
||
|
<dd>The OpenGL ES version required by the application. The higher 16 bits
|
||
|
represent the major number and the lower 16 bits represent the minor number. For
|
||
|
example, to specify OpenGL ES version 2.0, you would set the value as
|
||
|
"0x00020000". To specify OpenGL ES 2.1, if/when such a version were made
|
||
|
available, you would set the value as "0x00020001".
|
||
|
|
||
|
<p>An application should specify at most one <code>android:glEsVersion</code>
|
||
|
attribute in its manifest. If it specifies more than one, the
|
||
|
<code>android:glEsVersion</code> with the numerically highest value is used and
|
||
|
any other values are ignored.</p>
|
||
|
|
||
|
<p>If an application does not specify an <code>android:glEsVersion</code>
|
||
|
attribute, then it is assumed that the application requires only OpenGL ES 1.0,
|
||
|
which is supported by all Android-powered devices.</p>
|
||
|
|
||
|
<p>An application can assume that if a platform supports a given OpenGL ES
|
||
|
version, it also supports all numerically lower OpenGL ES versions. Therefore,
|
||
|
an application that requires both OpenGL ES 1.0 and OpenGL ES 2.0 must specify
|
||
|
that it requires OpenGL ES 2.0.</p>
|
||
|
|
||
|
<p>An application that can work with any of several OpenGL ES versions should
|
||
|
only specify the numerically lowest version of OpenGL ES that it requires. (It
|
||
|
can check at run-time whether a higher level of OpenGL ES is available.)</p>
|
||
|
</dd>
|
||
|
|
||
|
</dl>
|
||
|
</dd>
|
||
|
|
||
|
<!-- ##api level indication## -->
|
||
|
<dt>introduced in:</dt>
|
||
|
<dd>API Level 4</dd>
|
||
|
|
||
|
<dt>see also:</dt>
|
||
|
<dd>
|
||
|
<ul>
|
||
|
<li>{@link android.content.pm.PackageManager}</li>
|
||
|
<li>{@link android.content.pm.FeatureInfo}</li>
|
||
|
<li>{@link android.content.pm.ConfigurationInfo}</li>
|
||
|
<li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><code><uses-permission></code></a></li>
|
||
|
<li><a href="{@docRoot}guide/appendix/market-filters.html">Android Market Filters</a></li>
|
||
|
</ul>
|
||
|
</dd>
|
||
|
|
||
|
</dl>
|
||
|
|
||
|
|
||
|
<h2 id="market-feature-filtering">Android Market and Feature-Based Filtering</h2>
|
||
|
|
||
|
<p>Android Market filters the applications that are visible to users, so that
|
||
|
users can see and download only those applications that are compatible with
|
||
|
their devices. One of the ways Market filters applications is by feature
|
||
|
compatibility.</p>
|
||
|
|
||
|
<p>To determine an application's feature compatibility with a given user's
|
||
|
device, the Android Market service compares:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>Features required by the application — an application declares features in
|
||
|
<code><uses-feature></code> elements in its manifest <br/>with...</li>
|
||
|
<li>Features available on the device, in hardware or software —
|
||
|
a device reports the features it supports as read-only system properties.</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>To ensure an accurate comparison of features, the Android Package Manager
|
||
|
provides a shared set of feature constants that both applications and devices
|
||
|
use to declare feature requirements and support. The available feature constants
|
||
|
are listed in the <a href="#features-reference">Features Reference</a> tables at
|
||
|
the bottom of this document, and in the class documentation for {@link
|
||
|
android.content.pm.PackageManager}.</p>
|
||
|
|
||
|
<p>When the user launches the Market application, the application queries the
|
||
|
Package Manager for the list of features available on the device by calling
|
||
|
{@link android.content.pm.PackageManager#getSystemAvailableFeatures()}. The
|
||
|
Market application then passes the features list up to the Android Market
|
||
|
service when establishing the session for the user.</p>
|
||
|
|
||
|
<p>Each time you upload an application to the Android Market Publisher Site,
|
||
|
Android Market scans the application's manifest file. It looks for
|
||
|
<code><uses-feature></code> elements and evaluates them in combination
|
||
|
with other elements, in some cases, such as <code><uses-sdk></code> and
|
||
|
<code><uses-permission></code> elements. After establishing the
|
||
|
application's set of required features, it stores that list internally as
|
||
|
metadata associated with the application <code>.apk</code> and the application
|
||
|
version. </p>
|
||
|
|
||
|
<p>When a user searches or browses for applications using the Android Market
|
||
|
application, the service compares the features needed by each application with
|
||
|
the features available on the user's device. If all of an application's required
|
||
|
features are present on the device, Android Market allows the user to see the
|
||
|
application and potentially download it. If any required feature is not
|
||
|
supported by the device, Android Market filters the application so that it is
|
||
|
not visible to the user and not available for download. </p>
|
||
|
|
||
|
<p>Because the features you declare in <code><uses-feature></code>
|
||
|
elements directly affect how Android Market filters your application, it's
|
||
|
important to understand how Android Market evaluates the application's manifest
|
||
|
and establishes the set of required features. The sections below provide more
|
||
|
information. </p>
|
||
|
|
||
|
<h3 id="declared">Filtering based on explicitly declared features</h3>
|
||
|
|
||
|
<p>An explicitly declared feature is one that your application declares in a
|
||
|
<code><uses-feature></code> element. The feature declaration can include
|
||
|
an <code>android:required=["true" | "false"]</code> attribute (if you are
|
||
|
compiling against API level 5 or higher), which lets you specify whether the
|
||
|
application absolutely requires the feature and cannot function properly without
|
||
|
it (<code>"true"</code>), or whether the application prefers to use the feature
|
||
|
if available, but is designed to run without it (<code>"false"</code>).</p>
|
||
|
|
||
|
<p>Android Market handles explictly declared features in this way: </p>
|
||
|
|
||
|
<ul>
|
||
|
<li>If a feature is explicitly declared as being required, Android Market adds
|
||
|
the feature to the list of required features for the application. It then
|
||
|
filters the application from users on devices that do not provide that feature.
|
||
|
For example:
|
||
|
<pre><uses-feature android:name="android.hardware.camera" android:required="true" /></pre></li>
|
||
|
<li>If a feature is explicitly declared as <em>not</em> being required, Android
|
||
|
Market <em>does not</em> add the feature to the list of required features. For
|
||
|
that reason, an explicity declared non-required feature is never considered when
|
||
|
filtering the application. Even if the device does not provide the declared
|
||
|
feature, Android Market will still consider the application compatible with the
|
||
|
device and will show it to the user, unless other filtering rules apply. For
|
||
|
example:
|
||
|
<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre></li>
|
||
|
<li>If a feature is explicitly declared, but without an
|
||
|
<code>android:required</code> attribute, Android Market assumes that the feature
|
||
|
is required and sets up filtering on it. </li>
|
||
|
</ul>
|
||
|
|
||
|
<p>In general, if your application is designed to run on Android 1.6 and earlier
|
||
|
versions, the <code>android:required</code> attribute is not available in the
|
||
|
API and Android Market assumes that any and all
|
||
|
<code><uses-feature></code> declarations are required. </p>
|
||
|
|
||
|
<p class="note"><strong>Note:</strong> By declaring a feature explicitly and
|
||
|
including an <code>android:required="false"</code> attribute, you can
|
||
|
effectively disable all filtering on Android Market for the specified feature.
|
||
|
</p>
|
||
|
|
||
|
|
||
|
<h3 id="implicit">Filtering based on implicit features</h3>
|
||
|
|
||
|
<p>An <em>implicit</em> feature is one that an application requires in order to
|
||
|
function properly, but which is <em>not</em> declared in a
|
||
|
<code><uses-feature></code> element in the manifest file. Strictly
|
||
|
speaking, every application should <em>always</em> declare all features that it
|
||
|
uses or requires, so the absence of a declaration for a feature used by an
|
||
|
application should be considered an error. However, as a safeguard for users and
|
||
|
developers, Android Market looks for implicit features in each application and
|
||
|
sets up filters for those features, just as it would do for an explicitly
|
||
|
declared feature. </p>
|
||
|
|
||
|
<p>An application might require a feature but not declare it because: </p>
|
||
|
|
||
|
<ul>
|
||
|
<li>The application was compiled against an older version of the Android library
|
||
|
(Android 1.5 or earlier) and the <code><uses-feature></code> element was
|
||
|
not available.</li>
|
||
|
<li>The developer incorrectly assumed that the feature would be present on all
|
||
|
devices and a declaration was unnecessary.</li>
|
||
|
<li>The developer omitted the feature declaration accidentally.</li>
|
||
|
<li>The developer declared the feature explicitly, but the declaration was not
|
||
|
valid. For example, a spelling error in the <code><uses-feature></code>
|
||
|
element name or an unrecognized string value for the
|
||
|
<code>android:name</code> attribute would invalidate the feature declaration.
|
||
|
</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>To account for the cases above, Android Market attempts to discover an
|
||
|
application's implied feature requirements by examining <em>other elements</em>
|
||
|
declared in the manifest file, specifically,
|
||
|
<code><uses-permission></code> elements.</p>
|
||
|
|
||
|
<p>If an application requests hardware-related permissions, Android Market
|
||
|
<em>assumes that the application uses the underlying hardware features and
|
||
|
therefore requires those features</em>, even though there might be no
|
||
|
corresponding to <code><uses-feature></code> declarations. For such
|
||
|
permissions, Android Market adds the underlying hardware features to the
|
||
|
metadata that it stores for the application and sets up filters for them.</p>
|
||
|
|
||
|
<p>For example, if an application requests the <code>CAMERA</code> permission
|
||
|
but does not declare a <code><uses-feature></code> element for
|
||
|
<code>android.hardware.camera</code>, Android Market considers that the
|
||
|
application requires a camera and should not be shown to users whose devices do
|
||
|
not offer a camera.</p>
|
||
|
|
||
|
<p>If you don't want Android Market to filter based on a specific implied
|
||
|
feature, you can disable that behavior. To do so, declare the feature explicitly
|
||
|
in a <code><uses-feature></code> element and include an
|
||
|
<code>android:required="false"</code> attribute. For example, to disable
|
||
|
filtering derived from the <code>CAMERA</code> permission, you would declare
|
||
|
the feature as shown below.</p>
|
||
|
|
||
|
<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre>
|
||
|
|
||
|
<p class="caution">It's important to understand that the permissions that you
|
||
|
request in <code><uses-permission></code> elements can directly affect how
|
||
|
Android Market filters your application. The reference section <a
|
||
|
href="#permissions">Permissions that Imply Feature Requirements</a>,
|
||
|
below, lists the full set of permissions that imply feature requirements and
|
||
|
therefore trigger filtering.</p>
|
||
|
|
||
|
<h3 id="bt-permission-handling">Special handling for Bluetooth feature</h3>
|
||
|
|
||
|
<p>Android Market applies slightly different rules than described above, when
|
||
|
determining filtering for Bluetooth.</p>
|
||
|
|
||
|
<p>If an application declares a Bluetooth permission in a
|
||
|
<code><uses-permission></code> element, but does not explicitly declare
|
||
|
the Bluetooth feature in a <code><uses-feature></code> element, Android
|
||
|
Market checks the version(s) of the Android platform on which the application is
|
||
|
designed to run, as specified in the <code><uses-sdk></code> element. </p>
|
||
|
|
||
|
<p>As shown in the table below, Android Market enables filtering for the
|
||
|
Bluetooth feature only if the application declares its lowest or targeted
|
||
|
platform as Android 2.0 (API level 5) or higher. However, note that Android
|
||
|
market applies the normal rules for filtering when the application explicitly
|
||
|
declares the Bluetooth feature in a <code><uses-feature></code> element.
|
||
|
</p>
|
||
|
|
||
|
<p class="caption"><strong>Table 1.</strong> How Android Market determines the
|
||
|
Bluetooth feature requirement for an application that requests a Bluetooth
|
||
|
permission but does not declare the Bluetooth feature in a
|
||
|
<code><uses-feature></code> element.</p>
|
||
|
|
||
|
<table style="margin-top:1em;">
|
||
|
<tr>
|
||
|
<th><nobr>If <code>minSdkVersion</code> is ...</nobr></th>
|
||
|
<th><nobr>or <code>targetSdkVersion</code> is</nobr></th>
|
||
|
<th>Result</th>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><nobr><=4 (or uses-sdk is not declared)</nobr></td>
|
||
|
<td><=4</td>
|
||
|
<td>Android Market <em>will not</em> filter the application from any devices
|
||
|
based on their reported support for the <code>android.hardware.bluetooth</code>
|
||
|
feature.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><=4</td>
|
||
|
<td>>=5</td>
|
||
|
<td rowspan="2">Android Market filters the application from any devices that
|
||
|
do not support the <code>android.hardware.bluetooth</code> feature (including
|
||
|
older releases).</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>>=5</td>
|
||
|
<td>>=5</td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
|
||
|
<p>The examples below illustrate the different filtering effects, based on how
|
||
|
Android Market handles the Bluetooth feature. </p>
|
||
|
|
||
|
<dl>
|
||
|
<dt>In first example, an application that is designed to run on older API levels
|
||
|
declares a Bluetooth permission, but does not declare the Bluetooth feature in a
|
||
|
<code><uses-feature></code> element.</dt>
|
||
|
<dd><em>Result:</em> Android Market does not filter the application from any device.</dd>
|
||
|
</dl>
|
||
|
|
||
|
<pre><manifest ...>
|
||
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||
|
<uses-sdk android:minSdkVersion="3" />
|
||
|
...
|
||
|
</manifest></pre>
|
||
|
|
||
|
<dl>
|
||
|
<dt>In the second example, below, the same application also declares a target
|
||
|
API level of "5". </dt>
|
||
|
<dd><em>Result:</em> Android Market now assumes that the feature is required and
|
||
|
will filter the application from all devices that do not report Bluetooth support,
|
||
|
including devices running older versions of the platform. </dd>
|
||
|
</dl>
|
||
|
|
||
|
<pre><manifest ...>
|
||
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||
|
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
|
||
|
...
|
||
|
</manifest></pre>
|
||
|
|
||
|
<dl>
|
||
|
<dt>Here the same application now specifically declares the Bluetooth feature.</dt>
|
||
|
<dd><em>Result:</em> Identical to the previous example (filtering is applied).</dd>
|
||
|
</dl>
|
||
|
|
||
|
<pre><manifest ...>
|
||
|
<uses-feature android:name="android.hardware.bluetooth" />
|
||
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||
|
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
|
||
|
...
|
||
|
</manifest></pre>
|
||
|
|
||
|
<dl>
|
||
|
<dt>Finally, in the case below, the same application adds an
|
||
|
<code>android:required="false"</code> attribute.</dt>
|
||
|
<dd><em>Result:</em> Android Market disables filtering based on Bluetooth
|
||
|
feature support, for all devices.</dd>
|
||
|
</dl>
|
||
|
|
||
|
<pre><manifest ...>
|
||
|
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
|
||
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||
|
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
|
||
|
...
|
||
|
</manifest></pre>
|
||
|
|
||
|
|
||
|
|
||
|
<h3>Testing the features required by your application</h3>
|
||
|
|
||
|
<p>You can use the <code>aapt</code> tool, included in the Android SDK, to
|
||
|
determine how Android Market will filter your application, based on its declared
|
||
|
features and permissions. To do so, run <code>aapt</code> with the <code>dump
|
||
|
badging</code> command. This causes <code>aapt</code> to parse your
|
||
|
application's manifest and apply the same rules as used by Android Market to
|
||
|
determine the features that your application requires. </p>
|
||
|
|
||
|
<p>To use the tool, follow these steps: </p>
|
||
|
|
||
|
<ol>
|
||
|
<li>First, build and export your application as an unsigned <code>.apk</code>.
|
||
|
If you are developing in Eclipse with ADT, right-click the project and select
|
||
|
<strong>Android Tools</strong> > <strong>Export Unsigned Application
|
||
|
Package</strong>. Select a destination filename and path and click
|
||
|
<strong>OK</strong>. </li>
|
||
|
<li>Next, locate the <code>aapt</code> tool, if it is not already in your PATH.
|
||
|
If you are using SDK Tools r8 or higher, you can find <code>aapt</code> in the
|
||
|
<code><<em>SDK</em>>/platform-tools/</code> directory.
|
||
|
<p class="note"><strong>Note:</strong> You must use the version of
|
||
|
<code>aapt</code> that is provided for the latest Platform-Tools component available. If
|
||
|
you do not have the latest Platform-Tools component, download it using the <a
|
||
|
href="{@docRoot}sdk/adding-components.html">Android SDK and AVD Manager</a>.
|
||
|
</p></li>
|
||
|
<li>Run <code>aapt</code> using this syntax: </li>
|
||
|
</ol>
|
||
|
|
||
|
<pre>$ aapt dump badging <<em>path_to_exported_.apk</em>></pre>
|
||
|
|
||
|
<p>Here's an example of the command output for the second Bluetooth example, above: </p>
|
||
|
|
||
|
<pre>$ ./aapt dump badging BTExample.apk
|
||
|
package: name='com.example.android.btexample' versionCode='' versionName=''
|
||
|
<strong>uses-permission:'android.permission.BLUETOOTH_ADMIN'</strong>
|
||
|
<strong>uses-feature:'android.hardware.bluetooth'</strong>
|
||
|
sdkVersion:'3'
|
||
|
targetSdkVersion:'5'
|
||
|
application: label='BT Example' icon='res/drawable/app_bt_ex.png'
|
||
|
launchable activity name='com.example.android.btexample.MyActivity'label='' icon=''
|
||
|
uses-feature:'android.hardware.touchscreen'
|
||
|
main
|
||
|
supports-screens: 'small' 'normal' 'large'
|
||
|
locales: '--_--'
|
||
|
densities: '160'
|
||
|
</pre>
|
||
|
|
||
|
|
||
|
<h2 id=features-reference>Features Reference</h2>
|
||
|
|
||
|
<p>The tables below provide reference information about hardware and software
|
||
|
features and the permissions that can imply them on Android Market. </p>
|
||
|
|
||
|
<h3 id="hw-features">Hardware features</h3>
|
||
|
|
||
|
<p>The table below describes the hardware feature descriptors supported by the
|
||
|
most current platform release. To signal that your application uses or requires
|
||
|
a hardware feature, declare each value in a <code>android:name</code> attribute
|
||
|
in a separate <code><uses-feature></code> element. </p>
|
||
|
|
||
|
<table>
|
||
|
<tr>
|
||
|
<th>Feature Type</th>
|
||
|
<th>Feature Descriptor</th>
|
||
|
<th>Description</th>
|
||
|
<th>Comments</th>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Audio</td>
|
||
|
<td><code>android.hardware.audio.low_latency</td>
|
||
|
<td>The application uses a low-latency audio pipeline on the device and
|
||
|
is sensitive to delays or lag in sound input or output.</td>
|
||
|
<td>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Bluetooth</td>
|
||
|
<td><code>android.hardware.bluetooth</td>
|
||
|
<td>The application uses Bluetooth radio features in the device.</td>
|
||
|
<td>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td rowspan="4">Camera</td>
|
||
|
<td><code>android.hardware.camera</code></td>
|
||
|
<td>The application uses the device's camera. If the device supports
|
||
|
multiple cameras, the application uses the camera that facing
|
||
|
away from the screen.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.camera.autofocus</code></td>
|
||
|
<td>Subfeature. The application uses the device camera's autofocus capability.</td>
|
||
|
<td rowspan="3">If declared with the <code>"android:required="true"</code>
|
||
|
attribute, these subfeatures implicitly declare the
|
||
|
<code>android.hardware.camera</code> parent feature. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.camera.flash</code></td>
|
||
|
<td>Subfeature. The application uses the device camera's flash.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.camera.front</code></td>
|
||
|
<td>Subfeature. The application uses a front-facing camera on the device.</td>
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="3">Location</td>
|
||
|
<td><code>android.hardware.location</code></td>
|
||
|
<td>The application uses one or more features on the device for determining
|
||
|
location, such as GPS location, network location, or cell location.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.location.network</code></td>
|
||
|
<td>Subfeature. The application uses coarse location coordinates obtained from
|
||
|
a network-based geolocation system supported on the device.</td>
|
||
|
<td rowspan="2">If declared with the <code>"android:required="true"</code>
|
||
|
attribute, these subfeatures implicitly declare the
|
||
|
<code>android.hardware.location</code> parent feature. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.location.gps</code></td>
|
||
|
<td>Subfeature. The application uses precise location coordinates obtained
|
||
|
from a Global Positioning System receiver on the device. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Microphone</td>
|
||
|
<td><code>android.hardware.microphone</code></td>
|
||
|
<td>The application uses a microphone on the device.
|
||
|
</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Near Field Communications</td>
|
||
|
<td><code>android.hardware.nfc</td>
|
||
|
<td>The application uses NFC radio features in the device.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td rowspan="6">Sensors</td>
|
||
|
<td><code>android.hardware.sensor.accelerometer</code></td>
|
||
|
<td>The application uses motion readings from an accelerometer on the
|
||
|
device.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.sensor.barometer</code></td>
|
||
|
<td>The application uses the device's barometer.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.sensor.compass</code></td>
|
||
|
<td>The application uses directional readings from a magnetometer (compass) on
|
||
|
the device.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.sensor.gyroscope</code></td>
|
||
|
<td>The application uses the device's gyroscope sensor.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.sensor.light</code></td>
|
||
|
<td>The application uses the device's light sensor.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.sensor.proximity</code></td>
|
||
|
<td>The application uses the device's proximity sensor.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td rowspan="3">Telephony</td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<td>The application uses telephony features on the device, such as telephony
|
||
|
radio with data communication services.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.telephony.cdma</code></td>
|
||
|
<td>Subfeature. The application uses CDMA telephony radio features on the
|
||
|
device. </td>
|
||
|
<td rowspan="2">If declared with the <code>"android:required="true"</code>
|
||
|
attribute, these subfeatures implicitly declare the
|
||
|
<code>android.hardware.telephony</code> parent feature. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.telephony.gsm</code></td>
|
||
|
<td>Subfeature. The application uses GSM telephony radio features on the
|
||
|
device.</td>
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="4">Touchscreen</td>
|
||
|
<td><code>android.hardware.touchscreen</code></td>
|
||
|
<td>The application uses touchscreen capabilities on the device.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.touchscreen.multitouch</code></td>
|
||
|
<td>Subfeature. The application uses basic two-point multitouch capabilities on the device
|
||
|
screen.</td>
|
||
|
<td>If declared with the <code>"android:required="true"</code> attribute, this
|
||
|
subfeature implicitly declares the <code>android.hardware.touchscreen</code>
|
||
|
parent feature. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.touchscreen.multitouch.distinct</code></td>
|
||
|
<td>Subfeature. The application uses advanced multipoint multitouch
|
||
|
capabilities on the device screen, such as for tracking two or more points fully
|
||
|
independently.</td>
|
||
|
<td rowspan="2">If declared with the <code>"android:required="true"</code> attribute, this
|
||
|
subfeature implicitly declares the
|
||
|
<code>android.hardware.touchscreen.multitouch</code> parent feature. </td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.hardware.touchscreen.multitouch.jazzhand</code></td>
|
||
|
<td>Subfeature. The application uses advanced multipoint multitouch
|
||
|
capabilities on the device screen, for tracking up to five points fully
|
||
|
independently.</td>
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td>Wifi</td>
|
||
|
<td><code>android.hardware.wifi</code></td>
|
||
|
<td>The application uses 802.11 networking (wifi) features on the device.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
|
||
|
</table>
|
||
|
|
||
|
<h3 id="sw-features">Software features</h3>
|
||
|
|
||
|
<p>The table below describes the software feature descriptors supported by the
|
||
|
most current platform release. To signal that your application uses or requires
|
||
|
a software feature, declare each value in a <code>android:name</code> attribute
|
||
|
in a separate <code><uses-feature></code> element. </p>
|
||
|
|
||
|
|
||
|
<table>
|
||
|
<tr>
|
||
|
<th>Feature</th>
|
||
|
<th>Attribute Value</th>
|
||
|
<th>Description</th>
|
||
|
<th>Comments</th>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Live Wallpaper</td>
|
||
|
<td><code>android.software.live_wallpaper</code></td>
|
||
|
<td>The application uses or provides Live Wallpapers.</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td rowspan="2">SIP/VOIP</td>
|
||
|
<td><code>android.software.sip</code></td>
|
||
|
<td>The application uses SIP service on the device.
|
||
|
</td>
|
||
|
<td></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>android.software.sip.voip</code></td>
|
||
|
<td>Subfeature. The application uses SIP-based VOIP service on the device.
|
||
|
</td>
|
||
|
<td>If declared with the <code>"android:required="true"</code> attribute, this
|
||
|
subfeature implicitly declares the <code>android.software.sip</code>
|
||
|
parent feature.</td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
|
||
|
|
||
|
<h3 id="permissions">Permissions that Imply Feature Requirements</h3>
|
||
|
|
||
|
<p>Some feature constants listed in the tables above were made available to
|
||
|
applications <em>after</em> the corresponding API; for example, the
|
||
|
<code>android.hardware.bluetooth</code> feature was added in Android 2.2 (API
|
||
|
level 8), but the bluetooth API that it refers to was added in Android 2.0 (API
|
||
|
level 5). Because of this, some apps were able to use the API before they had
|
||
|
the ability to declare that they require the API via the
|
||
|
<code><uses-feature></code> system. </p>
|
||
|
|
||
|
<p>To prevent those apps from being made available unintentionally, Android
|
||
|
Market assumes that certain hardware-related permissions indicate that the
|
||
|
underlying hardware features are required by default. For instance, applications
|
||
|
that use Bluetooth must request the <code>BLUETOOTH</code> permission in a
|
||
|
<code><uses-permission></code> element — for legacy apps, Android
|
||
|
Market assumes that the permission declaration means that the underlying
|
||
|
<code>android.hardware.bluetooth</code> feature is required by the application
|
||
|
and sets up filtering based on that feature. </p>
|
||
|
|
||
|
<p>The table below lists permissions that imply feature requirements
|
||
|
equivalent to those declared in <code><uses-feature></code> elements. Note
|
||
|
that <code><uses-feature></code> declarations, including any declared
|
||
|
<code>android:required</code> attribute, always take precedence over features
|
||
|
implied by the permissions below. </p>
|
||
|
|
||
|
<p>For any of the permissions below, you can disable filtering based on the
|
||
|
implied feature by explicitly declaring the implied feature explicitly, in a
|
||
|
<code><uses-feature></code> element, with an
|
||
|
<code>android:required="false"</code> attribute. For example, to disable any
|
||
|
filtering based on the <code>CAMERA</code> permission, you would add this
|
||
|
<code><uses-feature></code> declaration to the manifest file:</p>
|
||
|
|
||
|
<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre>
|
||
|
|
||
|
<table id="permissions-features" >
|
||
|
<tr>
|
||
|
<th>Category</th>
|
||
|
<th>This Permission...</th>
|
||
|
<th>Implies This Feature Requirement</th>
|
||
|
<!-- <th>Comments</th> -->
|
||
|
</tr>
|
||
|
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="2">Bluetooth</td>
|
||
|
<td><code>BLUETOOTH</code></td>
|
||
|
<td><code>android.hardware.bluetooth</code>
|
||
|
<p>(See <a href="#bt-permission-handling">Special handling for Bluetooth feature</a> for details.)</p></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>BLUETOOTH_ADMIN</code></td>
|
||
|
<td><code>android.hardware.bluetooth</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td>Camera</td>
|
||
|
<td><code>CAMERA</code></td>
|
||
|
<td><code>android.hardware.camera</code> <em>and</em>
|
||
|
<br><code>android.hardware.camera.autofocus</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="5">Location</td>
|
||
|
<td><code>ACCESS_MOCK_LOCATION</code></td>
|
||
|
<td><code>android.hardware.location</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>ACCESS_LOCATION_EXTRA_COMMANDS</code></td>
|
||
|
<td><code>android.hardware.location</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>INSTALL_LOCATION_PROVIDER</code></td>
|
||
|
<td><code>android.hardware.location</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>ACCESS_COARSE_LOCATION</code></td>
|
||
|
<td><code>android.hardware.location.network</code> <em>and</em>
|
||
|
<br><code>android.hardware.location</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>ACCESS_FINE_LOCATION</code></td>
|
||
|
<td><code>android.hardware.location.gps</code> <em>and</em>
|
||
|
<br><code>android.hardware.location</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td>Microphone</td>
|
||
|
<td><code>RECORD_AUDIO</code></td>
|
||
|
<td><code>android.hardware.microphone</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="11">Telephony</td>
|
||
|
<td><code>CALL_PHONE</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>CALL_PRIVILEGED</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td><code>MODIFY_PHONE_STATE</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>PROCESS_OUTGOING_CALLS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>READ_SMS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>RECEIVE_SMS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>RECEIVE_MMS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>RECEIVE_WAP_PUSH</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>SEND_SMS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>WRITE_APN_SETTINGS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>WRITE_SMS</code></td>
|
||
|
<td><code>android.hardware.telephony</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
|
||
|
<tr>
|
||
|
<td rowspan="3">Wifi</td>
|
||
|
<td><code>ACCESS_WIFI_STATE</code></td>
|
||
|
<td><code>android.hardware.wifi</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>CHANGE_WIFI_STATE</code></td>
|
||
|
<td><code>android.hardware.wifi</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td><code>CHANGE_WIFI_MULTICAST_STATE</code></td>
|
||
|
<td><code>android.hardware.wifi</code></td>
|
||
|
<!-- <td></td> -->
|
||
|
</tr>
|
||
|
</table>
|