Restore Credentials
Android (Google)OfficialCreated by Google LLCDistributed by Android (Google)
- Skill
- Tool integration
- Software development
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive guide for implementing the Android Restore Credentials feature. By leveraging the androidx.credentials library, developers can create, retrieve, and manage restore keys that allow users to sign in automatically when moving to a new device. The implementation follows a two-tier architecture, covering both background restoration via BackupAgent and foreground restoration in the main activity, ensuring a seamless user experience without requiring UI changes to existing authentication flows.
What it does
- Guides the creation of restore keys to enable silent sign-in on new devices.
- Details the two-tier restoration architecture for background and foreground recovery.
- Provides instructions for integrating the androidx.credentials library.
- Outlines mandatory security practices like clearing credentials upon sign-out.
- Explains how to handle restore key exceptions and cloud backup configurations.
- Supplies essential backend guidelines for managing restore keys on the server side.
When to use it
- When you want to improve user retention by enabling automatic sign-in on new devices.
- When your app uses the Credential Manager API and you wish to extend it with restoration capabilities.
- When you need to support seamless account migration across Android devices.
- When you are implementing or updating backup and restore logic for your application.
Advantages
- Enables a frictionless sign-in experience for users on new devices.
- Operates independently of primary authentication methods like passwords or passkeys.
- Requires no modifications to existing user-facing sign-in UI.
- Supports both cloud-backed and local-only restoration strategies.
Usage examples
- “How do I implement the two-tier restoration architecture for my Android app?”
- The agent will guide you through setting up background restoration in your BackupAgent and foreground restoration in your Launcher Activity, ensuring both tiers are correctly configured.
- “What are the steps to delete a restore key when a user logs out?”
- The agent will provide the code snippet to call clearCredentialState with TYPE_CLEAR_RESTORE_CREDENTIAL to ensure the key is removed from the device.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/android/restore-credentials/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip restore-credentials.zip -d .agents/skills
Documentation by Google LLC
Fundamentals
The objective is to implement the Restore Credentials feature through the
Android Credential Manager API (androidx.credentials). This allows apps that
use or are integrating Credential Manager to silently log users back in when
they restore their app on a new device. Restore Credentials operates
independently of the app's primary authentication method (passwords, passkeys,
federated sign-in) and requires no UI changes to existing sign-in flows.
Scope
Crucial: This skill focuses exclusively on the Android client-side integration. It does not implement the server-side cryptographic validation logic. The developer must be reminded of this and the Points to inform the developer about after implementation is done.
Implementation Guidelines
When instructed to implement Restore Credentials on a developer's application, remember the following:
Before the implementation, you MUST read and understand the Two-Tier Restoration Architecture and review the DOs and DON'Ts.
After the implementation, you MUST present the developer with the Backend Guidelines as a reminder for their backend setup. It is important that you remind the developer that they still have to implement the backend.
Two-Tier Restoration Architecture
To enable a resilient sign-in experience, retrieve credentials through a two-tier architecture:
Tier 1 (Primary - Background): Executes automatically during device setup using the app's
BackupAgent.onRestoreFinished()callback. This provides an invisible restoration before the user opens the app for the first time, allowing background sync and notification delivery.Tier 2 (Secondary - Foreground): Runs in the Launcher
Activity.onCreate()to catch failovers if background restoration didn't complete (example: dropped network, delayed restoration) or ifallowBackupis disabled.
If allowBackup in the manifest is set to true, implement both. Otherwise, only
implement tier 2 (Foreground Restoration). Do NOT change the value of
allowBackup in the manifest.
If you added a BackupAgent to the app, you MUST also set
android:fullBackupOnly="true" in the manifest. Do NOT do this if there
already existed a BackupAgent in the app before your implementation.
DOs and DON'Ts
DO:
Do check
AndroidManifest.xmlfor the value of allowBackup to determine what you have to implement.Do implement a fallback for createCredential: always try calling it first with
isCloudBackupEnabledset to true. If anE2eeUnavailableExceptionis thrown, catch it and retry the call withisCloudBackupEnabledset tofalse.Do implement a
BackupAgent(subclass ofandroid.app.backup.BackupAgent) ifallowBackupis true in the manifest.Do set
android:fullBackupOnly="true"in the manifest if you added aBackupAgentto the app.Call
clearCredentialState()when the user signs out. This is a mandatory security measure to log the user out fully.Do attempt to get the restore key on the first launch of the app on a new device and also within the
BackupAgent.onRestoreFinished()callback if your app uses it.Do ensure that a restore credential is created even if the user is already logged in.
Do ensure that the credential retrieval and login in
onRestoreFinished()is performed synchronously (for example usingrunBlocking).Do restore notifications in the
BackupAgentif your app uses them. (For example capture and send FCM token to backend)Do ensure that if you implement mock network requests or stubs, you replace all placeholders with valid, properly formatted JSON payloads for the credential requests.
Do encapsulate credential creation and retrieval into their own dedicated functions. Because credential creation must be called in multiple places (sign-up, sign-in) and retrieval across multiple tiers (
BackupAgentand LauncherActivity), this prevents code duplication.Do remind the developer of the critical guidelines for implementing the backend once you're done with the implementation.
Do generate a separate restore key for each application if the organization has multiple apps with different package names, as a restore key is tied to a unique application package name.
DON'T:
DON'T change the value of
allowBackupinAndroidManifest.xml. Restore Credentials functionality is not affected by the allowBackup setting, meaning the user will still be automatically logged in when a Restore Credential exists, even ifallowBackupis false.DON'T implement a
BackupAgentifallowBackupisfalseinAndroidManifest.xml.DON'T assume the credential stored in the
GetCredentialResponseto be of typePublicKeyCredential. It has typeRestoreCredential.DON'T chain
GetRestoreCredentialOptionwith any otherCredentialOptionin the construction of aGetCredentialRequest.DON'T assume
CredentialManageror the Android system will automatically delete a restore key when a user signs out of the app. You must explicitly callclearCredentialStatewith aClearCredentialStateRequestofTYPE_CLEAR_RESTORE_CREDENTIAL.DON'T remove any existing calls to
clearCredentialState(). AClearCredentialStateRequestwithout a type specified only clears all NON-restore credentials.
Implementation Guide
Implement the Android client-side code by using the following guide. Follow it step-by-step and don't implement any backend functionality, only remind the user of the Backend Guidelines once you're done.
Version compatibility
Credential Manager's Restore Credentials works on devices running Android 9 (API
level 28) and higher, Google Play services (GMS) core version 24220000 or
higher, and version 1.5.0 or higher of the androidx.credentials library.
Prerequisites
Set up a relying party server similar to the server for passkeys. If you already have a server set up to handle authentication with passkeys, use the same server-side implementation for restore keys.
[!NOTE] Note: While the server-side implementation is the same for passkeys and restore keys, your client-side app can support restore keys without supporting passkeys. Because restore keys work independently of the authentication method in your app (for example, passwords or Sign in with Google), you don't need to make any additional changes to the existing authentication methods in your app's code.
Dependencies
Add the following dependencies to your app module's build.gradle file:
Kotlin
dependencies {
implementation("androidx.credentials:credentials:1.7.0-alpha03")
implementation("androidx.credentials:credentials-play-services-auth:1.7.0-alpha03")
}Groovy
dependencies {
implementation "androidx.credentials:credentials:1.7.0-alpha03"
implementation "androidx.credentials:credentials-play-services-auth:1.7.0-alpha03"
}Restore Credentials is available from version 1.5.0 and higher of the androidx.credentials library. However, it's recommended to use the latest stable versions of the dependencies where possible.
[!NOTE] Note: The Restore Credentials feature works regardless of whether
allowBackupis set in the manifest.
Overview
Create a restore key: To create a restore key, complete the following steps:
Instantiate Credential Manager: Create a
CredentialManagerobject.Get credential creation options from the app server: Send the client app the details required to create the restore key from your app server.
Create the restore key: Create a restore key for the user's account if the user is signed in to your app.
Handle the credential creation response: Send the credentials from your client app to your app server for processing, and handle any exceptions.
Sign in with a restore key: To sign in with a restore key, complete the following steps:
Get credential retrieval options from the app server: Send the client app the details required to retrieve the restore key from your app server.
Get the restore key: Request the restore key from Credential Manager when the user sets up a new device. This lets the user sign in without additional input.
Handle the credential retrieval response: Send the restore key from the client app to the app server to sign in the user.
Delete a restore key.
Create a restore key
Your app should cover all cases of a user signing in to ensure active users have a restore key created. Create the restore key in the following scenarios:
If the user is signed in and a restore key isn't already created (such as in the
onCreatemethod for the mainActivity).When the user is signing in or completing a new account registration flow.
To optimize performance and avoid the overhead of creating or checking for a
restore credential on every single login, set a boolean flag or a credential
creation timestamp in local storage, such as has_synced_restore_credential, to
track whether the key has already been created.
[!NOTE] Note: A restore key is tied to an application's unique package name. If your organization's main app and sub-apps have different package names, create a separate restore key for each app.
Instantiate Credential Manager
Use your app's activity context to instantiate a CredentialManager object.
// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)Get credential creation options from your app server
Use a FIDO-compliant library in your app server to send your client app the information required to create the restore credential, such as information about the user, the app, and additional configuration properties. For more information about the server-side implementation, see Server-side guidance.
Create the restore key
After parsing the public key creation options sent by the server, create a
restore key by wrapping these options in a
CreateRestoreCredentialRequest object and calling the
createCredential() method with the CredentialManager object.
// createRestoreRequest contains the details sent by the server
val response = credentialManager.createCredential(context, createRestoreRequest)Key points about the code
The
CreateRestoreCredentialRequestobject contains the following fields:requestJson: The credential creation options sent by the app server in the Web Authentication API format forPublicKeyCredentialCreationOptionsJSON.isCloudBackupEnabled:Booleanfield to determine if the restore key should be backed up to the cloud. By default, this flag istrue. This field has these values:true: (Recommended) This value enables the backup of restore keys to the cloud if the user has Google Backup and end-to-end encryption, such as a screen lock, enabled.false: This value saves the key locally and not in the cloud. The key is not available on the new device if the user chooses to restore from the cloud.
[!CAUTION] Caution: It's recommended to set
isCloudBackupEnabledtotrue. If cloud backup is disabled and the user restores from a cloud backup, the call to retrieve the restore key fails. Users who restore your app with a cloud backup don't receive the restore key and aren't automatically signed in.
Handle the credential creation response
The Credential Manager API returns a response of type
CreateRestoreCredentialResponse. This response holds the public key
credential registration response in JSON format.
Send the public key from your app to the relying party server. This public key is similar to the public key generated when you create a passkey. The same code that handles passkey creation on the server can also handle restore key creation. For more information about the server-side implementation, see the guidance for passkeys.
During the restore key creation process, handle these exceptions:
CreateRestoreCredentialDomException: This exception occurs ifrequestJsonis invalid and does not follow the WebAuthn format forPublicKeyCredentialCreationOptionsJSON.E2eeUnavailableException: This exception occurs ifisCloudBackupEnabledistrue, but the user's device doesn't have data backup or end-to-end encryption, such as a screen lock.
To ensure that Restore Credentials are created in all cases, you must handle theE2eeUnavailableExceptionexplicitly by callingcreateCredentialwithisCloudBackupEnabledset totrue. IfE2eeUnavailableExceptionis thrown, catch and callcreateCredentialagain withisCloudBackupEnabledset tofalse.IllegalArgumentException: This exception occurs ifcreateRestoreRequestis empty or not valid JSON, or if it doesn't have a validuser.idthat conforms to the WebAuthn specifications.
Sign in with a restore key
Use Restore Credentials to silently sign in the user during the device setup process.
Get credential retrieval options from the app server
Send the client app the options required to get the restore key from the server. For similar passkey guidance for this step, see Sign in with a passkey. For more information about the server-side implementation, see the server-side authentication guide.
Get the restore key
To get the restore key on the new device, call the getCredential() method on
the CredentialManager object.
It's recommended to fetch the restore key in both of the following scenarios:
On the first launch of the app on the device. Credential restoration in this scenario is independent of restoration of the app data.
If app data backup and restore is enabled, get the restore key immediately after the app data is restored. Use
BackupAgentto configure your app's backup and ensure you complete thegetCredentialfunctionality within theonRestoreFinishedcallback. Don't use theonRestoremethod, as it is only called for key-value backups, whereasonRestoreFinishedis reliably called for any kind of backup restore. This avoids potential delays when users open their new device for the first time and lets users interact with the app without waiting for them to open your app. For example, this lets your app send the user notifications before they open the app for the first time on the new device, which is particularly relevant for messaging or communications apps.
If you create a new BackupAgent and previously had backup enabled with
allowBackup="true", set the boolean value android:fullBackupOnly="true" in
your app's manifest. This ensures that your app's backup and restore behavior is
maintained.
[!IMPORTANT] Important: Notifications aren't automatically restored after the restore credentials are retrieved. If you use Firebase to handle notifications, you must fetch and send the Firebase Cloud Messaging (FCM) token to the backend to successfully resume background messaging and notifications.
// Fetch the options required to get the restore key
val authenticationJson = fetchAuthenticationJson()
// Create the GetRestoreCredentialRequest object
val options = GetRestoreCredentialOption(authenticationJson)
val getRequest = GetCredentialRequest(listOf(options))
val response = credentialManager.getCredential(context, getRequest)
// Type-check and extract the restore credential
val credential = response.credential as RestoreCredentialThe credential manager APIs return a response of type
GetCredentialResponse. The credential contained in this response is
explicitly of type RestoreCredential, which holds the public key.
Handle the sign-in response
Send the public key from the app to the relying party server, which can then be used to sign in the user. On the server side, this action is similar to signing in using a passkey. The same code that handles sign-in with passkeys on the server can also handle sign-ins with restore keys. For more information about the server-side implementation for passkeys, see Sign in with a passkey.
[!NOTE] Note: Even though restore keys and passkeys use the same underlying server implementation, differentiate between them when saving them in your app server's database. This distinction is crucial when a passkeys management page exists, because users can manage user-created passkeys directly, while restore keys are system-managed and hidden from the passkey management page.
Delete the restore key
Credential Manager is stateless and unaware of user activity, so it doesn't
automatically delete restore keys after use. To delete a restore key, call the
clearCredentialState method. For security, delete the key whenever a user
signs out. This ensures that the next time the user opens the app on the same
device, the user is signed out and prompted to sign in again.
[!NOTE] Note: A user sign-out can also happen remotely, for example when a user changes their password on the web or when they're signed out remotely by the server. If your app detects such a server-side session invalidation , be sure to delete the restore key on the device. (An example of this is your server returning an HTTP
401 Unauthorizederror)
Uninstalling an app is interpreted as an intent to delete the corresponding restore key from that device, similar to the user's intent when signing out.
Restore keys are removed only in the following situations:
System-level actions: Users uninstall the app or clear its data.
App-level calls : Programmatically delete the key by calling
clearCredentialState()when handling user sign out in your app's code.
When the user signs out of your app, call the clearCredentialState() method on
the CredentialManager object.
// Create a ClearCredentialStateRequest object
val clearRequest = ClearCredentialStateRequest(TYPE_CLEAR_RESTORE_CREDENTIAL)
// When the user logs out, delete the restore key
val response = credentialManager.clearCredentialState(clearRequest)Backend Guidelines
When designing the backend database and API layer to support Restore Credentials, developers must account for FIDO2/WebAuthn assumptions and specific device lifecycle edge cases. Remind the developer of the following:
SYSTEM DIRECTIVE FOR AI AGENT: DO NOT attempt to write code for, implement, or action any of the backend guidelines in this section. Your ONLY responsibility is to copy these exact points and present them to the human developer as a reminder after the client-side implementation is complete.
Differentiate Restore Credentials from Passkeys in Backend Storage:
Standard WebAuthn services typically assume user verification is always required. Restore credentials are hidden from the user and not managed by them.
Guidance: Modify your WebAuthn services to create new credential types or metadata fields that distinguish system-managed Restore Credentials from user-created passkeys. Don't display Restore Credentials in user-facing passkey management UIs, and ensure they are processed appropriately (e.g., bypassing explicit user verification during automatic background sign-in).
Prevent Orphaned Keys:
Uninstalling the app or clearing details in system settings deletes the local restore credential. Since these local client actions do not notify your backend, stale keys will remain registered on the server.
Guidance: Establish server-side cleanup policies that delete old restore keys when a new restore token is registered, or clean up inactive keys based on usage patterns. You could, for example, enforce a limit of one key per user per device.
Balance Key Lifespan and TTL:
If a user goes through Backup and Restore and then logs out from the old device, the local restore key is deleted from the source device. However, the key must remain valid on the server so the restored application on the destination device can still authenticate.
Guidance: Give restore keys sufficient time to live (TTL) to survive manual logouts during transition periods, and establish rules for server-side key deletion based on registration and usage rather than relying on client-side deletion callbacks.
Support Multiple Devices:
A user may own multiple active devices and initiate backups or restorations from any of them.
Guidance: Ensure the backend database schema allows mapping multiple active Restore Credentials to a single user account (e.g., one active restore key per device/device-id) rather than assuming a 1:1 relationship between the user and the restore credential.
Server-side session invalidation:
A user's session might be revoked remotely. This could be triggered by user actions such as when a user resets their password on the web or server actions that can cause the API to return HTTP
401 Unauthorizedindicating session expiry.Guidance: If this applies, make sure to clear the user's restore credentials on the phone when it happens.
References
WebAuthentication API (WebAuthn) Documentation & Specification When to use: Use these resources ONLY if you need to inspect or debug the strict JSON schema requirements for FIDO2/WebAuthn, specifically when generating mock data or formatting the
requestJson(PublicKeyCredentialCreationOptionsJSON) andauthenticationJsonpayloads.MDN Web Authentication API Documentation: Mozilla Developer Network guide and reference for WebAuthn APIs
W3C
PublicKeyCredentialCreationOptionsJSON: Data structure definition for WebAuthn credential creation requests in JSON format.W3C
PublicKeyCredentialRequestOptionsJSON: Data structure definition for WebAuthn authentication or assertion requests in JSON format.
Files
- ATTRIBUTION.mdAdded by AutoGineer972 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md24.7 KiB
- references/android/guide/topics/manifest/application-element.md42.1 KiB
- references/android/identity/passkeys/create-passkeys.md19.0 KiB
- references/android/identity/passkeys/sign-in-with-passkeys.md11.3 KiB
references/android/guide/topics/manifest/application-element.md
syntax: :
```xml
<application android:allowTaskReparenting=["true" | "false"]
android:allowBackup=["true" | "false"]
android:allowClearUserData=["true" | "false"]
android:allowCrossUidActivitySwitchFromBelow=["true" | "false"]
android:allowNativeHeapPointerTagging=["true" | "false"]
android:appCategory=["accessibility" | "audio" | "game" |
"image" | "maps" | "news" | "productivity" | "social" | "video"]
android:backupAgent="string"
android:backupInForeground=["true" | "false"]
android:banner="drawable resource"
android:dataExtractionRules="string resource"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:enableOnBackInvokedCallback=["true" | "false"]
android:extractNativeLibs=["true" | "false"]
android:forceQueryable=["true" | "false"]
android:fullBackupContent="string"
android:fullBackupOnly=["true" | "false"]
android:gwpAsanMode=["always" | "never"]
android:hasCode=["true" | "false"]
android:hasFragileUserData=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:intentMatchingFlags=["none" | "enforceIntentFilter" | "allowNullAction"]
android:isGame=["true" | "false"]
android:isMonitoringTool=["parental_control" | "enterprise_management" |
"other"]
android:killAfterRestore=["true" | "false"]
android:largeHeap=["true" | "false"]
android:label="string resource"
android:localeConfig="xml resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:networkSecurityConfig="xml resource"
android:pageSizeCompat=["true" | "false"]
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:requestLegacyExternalStorage=["true" | "false"]
android:requiredAccountType="string"
android:resizeableActivity=["true" | "false"]
android:restrictedAccountType="string"
android:supportsRtl=["true" | "false"]
android:taskAffinity="string"
android:testOnly=["true" | "false"]
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:usesCleartextTraffic=["true" | "false"]
android:vmSafeMode=["true" | "false"] >
. . .
</application>
```contained in:
: https://developer.android.com/guide/topics/manifest/manifest-element
can contain:
: https://developer.android.com/guide/topics/manifest/activity-element
`https://developer.android.com/guide/topics/manifest/activity-alias-element`
`https://developer.android.com/guide/topics/manifest/meta-data-element`
`https://developer.android.com/guide/topics/manifest/service-element`
`https://developer.android.com/guide/topics/manifest/receiver-element`
`https://developer.android.com/guide/topics/manifest/profileable-element`
`https://developer.android.com/guide/topics/manifest/provider-element`
`https://developer.android.com/guide/topics/manifest/uses-library-element`
`https://developer.android.com/guide/topics/manifest/uses-native-library-element`
`https://developer.android.com/guide/topics/manifest/property-element`description:
: The declaration of the application. This element contains subelements that declare each of the application's components and has attributes that can affect all the components.
Many of these attributes, such as
`icon`, `label`, `permission`, `process`,
`taskAffinity`, and `allowTaskReparenting`, set default values
for corresponding attributes of the component elements. Others, such as
`debuggable`, `enabled`, `description`, and
`allowClearUserData`, set values for the application as a whole and
aren't overridden by the components.attributes :
`android:allowTaskReparenting`
: Whether activities that the application defines can move from
the task that started them to the task they have an affinity for when that task
is next brought to the front. It's `"true"` if they can move, and
`"false"` if they must remain with the task where they started.
The default value is `"false"`.
The
`https://developer.android.com/guide/topics/manifest/activity-element`
element has its own
`https://developer.android.com/guide/topics/manifest/activity-element#reparent`
attribute that can override the value set here.
`android:allowBackup`
: Whether to let the application participate in the backup
and restore infrastructure. If this attribute is set to `"false"`, no
backup or restore of the application is ever performed, disabling all cloud backups
and device-to-device (D2D) transfers, even by a full-system backup that otherwise
causes all application data to save using `adb`. The default value of this
attribute is `"true"`. If your app processes sensitive data, you can keep
this attribute set to `"true"` and configure
[`android:dataExtractionRules`](https://developer.android.com/guide/topics/manifest/application-element#dataExtractionRules) to safely
exclude sensitive keys or temporary caches while preserving user preferences and
continuity.
**Note:**For apps targeting Android 12 (API level 31) or higher, this behavior
varies. On devices from some device manufacturers, you can't disable device-to-device migration
of your app's files.
However, you can disable cloud-based backup and restore of your app's files by setting
this attribute to `"false"`, even if your app targets Android 12 (API level 31) or
higher.
For more information, see the
[backup and restore](https://developer.android.com/about/versions/12/behavior-changes-12#backup-restore) section
of the page that describes behavior changes for apps targeting Android 12 (API level 31) or
higher.
`android:allowClearUserData`
: Whether to let the application reset user data. This data includes
flags, such as whether the user has seen introductory tooltips, as
well as user-customizable settings and preferences. The default value of this
attribute is `"true"`.
**Note:** Only apps that are part of the system image can
declare this attribute explicitly. Third-party apps can't include this
attribute in their manifest files.
For more information, see [Data backup overview](https://developer.android.com/guide/topics/data/backup).
`android:allowCrossUidActivitySwitchFromBelow`
: Specifies whether activities from other applications in the same task
can be launched on top of this application. If set to `"false"`,
activity launches that would replace this application in the user's view
are blocked.
The default value is `"true"`.
For more information, see the guide to
[Secure Background Activity Launches](https://developer.android.com/guide/components/activities/secure-bal).
`android:allowNativeHeapPointerTagging`
: Whether the app enables the Heap pointer tagging feature. The default value of
this attribute is `"true"`.
**Note:** Disabling this feature **doesn't** address the
underlying code health issue. Future hardware devices might not support this manifest tag.
For more information, see [Tagged Pointers](https://source.android.com/devices/tech/debug/tagged-pointers).
`android:appCategory`
: Declares the category of this app. Categories are used to cluster multiple apps
together into meaningful groups, such as when summarizing battery, network, or
disk usage. Only define this value for apps that fit well into one of
the specific categories.
Must be one of the following constant values.
| Value | Description |
|---|---|
| `accessibility` | Apps that are primarily accessibility apps, such as screen-readers. |
| `audio` | Apps that primarily work with audio or music, such as music players. |
| `game` | Apps that are primarily games. |
| `image` | Apps that primarily work with images or photos, such as camera or gallery apps. |
| `maps` | Apps that are primarily map apps, such as navigation apps. |
| `news` | Apps that are primarily news apps, such as newspapers, magazines, or sports apps. |
| `productivity` | Apps that are primarily productivity apps, such as cloud storage or workplace apps. |
| `social` | Apps that are primarily social apps, such as messaging, communication, email, or social network apps. |
| `video` | Apps that primarily work with video or movies, such as streaming video apps. |
`android:backupAgent`
: The name of the class that implements the application's backup agent,
a subclass of `https://developer.android.com/reference/android/app/backup/BackupAgent`. The attribute value is
a fully qualified class name, such as `"com.example.project.MyBackupAgent"`.
However, as a shorthand, if the first character of the name is a period,
for example, `".MyBackupAgent"`, it is appended to the
package name specified in the
`https://developer.android.com/guide/topics/manifest/manifest-element`
element.
There is no default. The name must be specific.
`android:backupInForeground`
: Indicates that
[Auto Backup](https://developer.android.com/guide/topics/data/autobackup) operations
can be performed on this app even if the app is in a foreground-equivalent
state. The system shuts down an app during auto backup operation,
so use this attribute with caution. Setting this flag to `"true"` can impact app
behavior while the app is active.
The default value is `"false"`, which means that the OS avoids
backing up the app while it's running in the foreground, such as a music app
that is actively playing music using a service in the
`https://developer.android.com/reference/android/app/Service#startForeground(int, android.app.Notification)` state.
`android:banner`
: A [drawable resource](https://developer.android.com/guide/topics/resources/drawable-resource)
providing an extended graphical banner for its associated item. Use with the
`<application>` tag to supply a default banner for all application activities or with the
[`<activity>`](https://developer.android.com/guide/topics/manifest/activity-element)
tag to supply a banner for a specific activity.
The system uses the banner to represent an app in
the Android TV home screen. Therefore, only specify this for applications with an activity that handles the
`https://developer.android.com/reference/android/content/Intent#CATEGORY_LEANBACK_LAUNCHER` intent.
This attribute is set as a reference to a drawable resource containing
the image, for example `"@drawable/banner"`. There is no default banner.
For more information, see [Provide a home screen banner](https://developer.android.com/training/tv/start/start#banner).
`android:dataExtractionRules`
:
Applications can set this attribute to an XML resource where they specify the
rules determining which files and directories can be copied from the device as part of backup or
transfer operations.
For information about the format of the XML file, see [Backup and restore](https://developer.android.com/about/versions/12/behavior-changes-12#backup-restore).
`android:debuggable`
: Whether the application can be debugged, even when running
on a device in user mode. It's `"true"` if it can be and `"false"`
if not. The default value is `"false"`.
`android:description`
: User-readable text about the application, which is longer and more descriptive than the application label.
The value is set as a reference to a string resource. Unlike the label, it can't be a raw string.
There is no default value.
`android:enabled`
: Whether the Android system can instantiate components of
the application. It's `"true"` if it can and `"false"`
if not. If the value is `"true"`, each component's
`enabled` attribute determines whether that component is enabled.
If the value is `"false"`, it overrides the
component-specific values, and all components are disabled.
The default value is `"true"`.
`android:enableOnBackInvokedCallback`
: This flag lets you opt out of predictive system animations at the app level.
Set `android:enableOnBackInvokedCallback=false` to turn off predictive back animations at the app level
and instruct the system to ignore calls to the `OnBackInvokedCallback` platform API.
`android:extractNativeLibs`
: This attribute indicates whether the package installer extracts native libraries from the
APK to the file system. If set to `"false"`, your native libraries are stored
uncompressed in the APK. Although your APK might be larger, your application loads faster
because the libraries load directly from the APK at runtime.
The default value of `extractNativeLibs` depends on `minSdkVersion` and the
version of AGP you're using. In most cases, the default behavior is probably what you want, and
you don't have to set this attribute explicitly.
`android:forceQueryable`
: Specifies whether this application is visible to all other applications
on the device, regardless of what those other applications declare in the
`<queries>` tags in their manifests.
The default value is `"false"`.
For more information, see the guide on
[automatic package visibility filtering](https://developer.android.com/training/package-visibility/automatic).
`android:fullBackupContent`
: This attribute points to an XML file that contains full backup rules for
[Auto Backup](https://developer.android.com/guide/topics/data/autobackup).
These rules determine what files get backed up. For more information, see the
[XML config syntax](https://developer.android.com/guide/topics/data/autobackup#XMLSyntax)
for Auto Backup.
This attribute is optional. If it is not specified, by default, Auto Backup
includes most of your app's files. For more information, see
[Files that are backed up](https://developer.android.com/guide/topics/data/autobackup#Files).
`android:fullBackupOnly`
: This attribute indicates whether to use
[Auto Backup](https://developer.android.com/guide/topics/data/autobackup) on devices
where it is available. If set to `"true"`, then your app performs
Auto Backup when installed on a device running Android 6.0 (API level 23) or
higher. On older devices, your app ignores this attribute and performs
[key/value backups](https://developer.android.com/guide/topics/data/keyvaluebackup).
The default value is `"false"`.
`android:gwpAsanMode`
: This attribute indicates whether to use
[GWP-ASan](https://developer.android.com/ndk/guides/gwp-asan), a native memory allocator feature that helps
find use-after-free and heap-buffer-overflow bugs.
The default value is `"never"`.
`android:hasCode`
: Whether the application contains any DEX code---that is, code using the
Kotlin or Java programming language.
It's `"true"` if it does and `"false"` if not. When the
value is `"false"`, the system doesn't try to load any application
code when launching components. The default value is `"true"`.
If the application includes native (C/C++) code, but no DEX code, this should
be set to `"false"`. If set to `"true"` when the APK
contains no DEX code, the app may fail to load.
**This property must account for code included in the application by
dependencies.** If the application depends on an AAR that uses
Java/Kotlin code, or directly on a JAR, `app:hasCode` must be
`"true"`, or omitted as that is the default.
For example, your app might support
[Play feature delivery](https://developer.android.com/platform/technology/app-bundle) and include feature
modules that don't generate any DEX files, which is bytecode optimized for the Android
platform. If so, you need to set this property to `"false"` in the module's manifest
file to avoid runtime errors.
`android:hasFragileUserData`
: Whether to show the user a prompt to
keep the app's data when the user uninstalls the app. The default value is `"false"`.
`android:hardwareAccelerated`
: Whether hardware-accelerated rendering is enabled for all
activities and views in this application. It's `"true"` if it is
enabled and `"false"` if not. The default value is `"true"` if you set
either [`minSdkVersion`](https://developer.android.com/guide/topics/manifest/uses-sdk-element#min)
or [`targetSdkVersion`](https://developer.android.com/guide/topics/manifest/uses-sdk-element#target)
to `"14"` or higher. Otherwise, it's `"false"`.
Starting from Android 3.0 (API level 11), a hardware-accelerated OpenGL renderer is
available to applications to improve performance for many common 2D graphics
operations. When the hardware-accelerated renderer is enabled, most operations
in Canvas, Paint, Xfermode, ColorFilter, Shader, and Camera are accelerated.
This results in smoother animations, smoother scrolling, and improved
responsiveness overall, even for applications that don't explicitly make use
the framework's OpenGL libraries.
Not all of the OpenGL 2D operations are accelerated. If you enable
the hardware-accelerated renderer, test your application so that it can
make use of the renderer without errors.
For more information, read the
[Hardware acceleration](https://developer.android.com/guide/topics/graphics/hardware-accel)
guide.
`android:icon`
: An icon for the application as whole and the default icon for
each of the application's components. See the individual
`icon` attributes for the
`https://developer.android.com/guide/topics/manifest/activity-element`,
`https://developer.android.com/guide/topics/manifest/activity-alias-element`,
`https://developer.android.com/guide/topics/manifest/service-element`,
`https://developer.android.com/guide/topics/manifest/receiver-element`, and
`https://developer.android.com/guide/topics/manifest/provider-element` elements.
This attribute is set as a reference to a drawable resource containing
the image, such as `"@drawable/icon"`. There is no default icon.
`android:intentMatchingFlags`
:
Use this attribute to fine-tune how the system matches incoming intents to app
components. By default, no special matching rules are applied.
This attribute can be specified on the `<application>` tag
as well as on component tags, including `<activity>`,
`<activity-alias>`, `<receiver>`,
`<service>`, and `<provider>`. The value
set on a component overrides the value set on the
`<application>` tag.
The value must be one or more of the following flags, separated by '`|`':
| Flag | Description |
|---|---|
| `none` | Disables all special matching rules for incoming intents. When specifying multiple flags, conflicting values are resolved by giving precedence to the `none` flag. |
| `enforceIntentFilter` | Enforces stricter matching for incoming intents: - Explicit intents must match the target component's intent filter. - Intents without an action don't match any intent filter. |
| `allowNullAction` | Relaxes the matching rules to allow intents without an action to match. This flag is used in conjunction with `enforceIntentFilter` to achieve the following behavior: - Explicit intents must match the target component's intent filter. - Intents without an action are allowed to match any intent filter. |
For more information, see the
[Safer Intents](https://developer.android.com/about/versions/16/behavior-changes-16#safer-intents)
section in the Android 16 (API level 36) behavior changes.
`android:isGame`
: Whether the application is a game. The system might group together applications classified
as games or display them separately from other applications. The default is `"false"`.
`android:isMonitoringTool`
: Indicates that this application is designed to monitor other individuals.
**Note:** If an app declares this attribute in its manifest, the developer must
follow the
[Stalkerware](https://support.google.com/googleplay/android-developer/answer/9888380#commercial-spyware)
policy to publish the app to Google Play.
There is no default value. The developer must specify one of the following values:
| Value | Description |
|---|---|
| `"parental_control"` | App caters to parental control and is specifically targeted at parents who want to keep their kids safe. |
| `"enterprise_management"` | App caters to enterprises that want to manage and track devices given to employees. |
| `"other"` | App caters to a use case not otherwise specified in this table. |
`android:killAfterRestore`
: Whether the application terminates after its
settings have been restored during a full-system restore operation.
Single-package restore operations never cause the application to
shut down. Full-system restore operations typically only occur once,
when the phone is first set up. Third-party applications don't normally
need to use this attribute.
The default is `"true"`, which means that after the application
finishes processing its data during a full-system restore, it terminates.
`android:largeHeap`
: Whether the application's processes are created with a large Dalvik heap. This applies to
all processes created for the application. It only applies to the first application loaded into a
process. If you're using a shared user ID to let multiple applications use a process, they all
must use this option consistently to avoid unpredictable results.
Most apps don't need this and instead focus on reducing their overall memory usage for
improved performance. Enabling this also doesn't guarantee a fixed increase in available memory,
because some devices are constrained by their total available memory.
To query the available memory size at runtime, use the methods `https://developer.android.com/reference/android/app/ActivityManager#getMemoryClass()` or `https://developer.android.com/reference/android/app/ActivityManager#getLargeMemoryClass()`.
`android:label`
: A user-readable label for the application as a whole and a default
label for each of the application's components. See the individual
`label` attributes for the
`https://developer.android.com/guide/topics/manifest/activity-element`,
`https://developer.android.com/guide/topics/manifest/activity-alias-element`,
`https://developer.android.com/guide/topics/manifest/service-element`,
`https://developer.android.com/guide/topics/manifest/receiver-element`, and
`https://developer.android.com/guide/topics/manifest/provider-element` elements.
The label is set as a reference to a string resource, so that
it can be localized like other strings in the user interface.
However, as a convenience while you're developing the application,
it can also be set as a raw string.
`android:localeConfig`
: A reference to an XML resource that specifies the list of locales
supported by the application. This is used by the system to support per-app
language preferences.
For more information, see the guide on
[per-app language preferences](https://developer.android.com/guide/topics/resources/app-languages).
`android:logo`
: A logo for the application as whole and the default logo for activities.
This attribute is set as a reference to a drawable resource containing
the image, such as `"@drawable/logo"`. There is no default logo.
`android:manageSpaceActivity`
: The fully qualified name of an `Activity` subclass that the system
launches to let users manage the memory occupied by the application
on the device. The activity is also declared with an
`https://developer.android.com/guide/topics/manifest/activity-element` element.
`android:name`
: The fully qualified name of an `https://developer.android.com/reference/android/app/Application`
subclass implemented for the application. When the application process
is started, this class is instantiated before any of the application's
components.
The subclass is optional. Most applications don't need one.
In the absence of a subclass, Android uses an instance of the base
`Application` class.
`android:networkSecurityConfig`
: Specifies the name of the XML file that contains your application's
[Network security
configuration](https://developer.android.com/training/articles/security-config). The value is a reference to the XML resource file
containing the configuration.
This attribute was added in API level 24.
`android:pageSizeCompat`
: Overrides the user or platform compatibility settings for 16 KB page
sizes, which lets you force page-agnostic compatibility mode on or off for
this application.
For more information, see the guide on
[supporting 16 KB page sizes](https://developer.android.com/guide/practices/page-sizes).
`android:permission`
: The name of a permission that clients need in order to interact
with the application. This attribute is a convenient way to set a
permission that applies to all of the application's components. It is
overwritten by setting the `permission` attributes of individual
components.
For more information about permissions, see the
[Permissions](https://developer.android.com/guide/topics/manifest/manifest-intro#perms)
section in the app manifest overview and
[Security tips](https://developer.android.com/guide/topics/security/security).
`android:persistent`
: Whether the application remains running at all times. It's
`"true"` if it does and `"false"` if not. The default value
is `"false"`. Applications don't normally set this flag.
Persistence mode is intended only for certain system applications.
`android:process`
: The name of a process where all components of the application run.
Each component can override this default by setting its own `process`
attribute.
By default, Android creates a process for an application when the first
of its components needs to run. All components then run in that process.
The name of the default process matches the package name set by the
`https://developer.android.com/guide/topics/manifest/manifest-element` element.
By setting this attribute to a process name that's shared with another
application, you can arrange for components of both applications to run in
the same process, but only if the two applications also share a
user ID and are signed with the same certificate.
If the name assigned to this attribute begins with a colon (`:`), a new
process, private to the application, is created when it's needed.
If the process name begins with a lowercase character, a global process
of that name is created. A global process can be shared with other
applications, reducing resource usage.
`android:restoreAnyVersion`
: Indicates that the application is prepared to attempt a restore of any
backed-up data set, even if the backup was stored by a newer version
of the application than is currently installed on the device. Setting
this attribute to `"true"` lets the Backup Manager
- `$1`
attempt a restore even when a version mismatch suggests that the data is incompatible. *Use with caution!*
- The default value of this attribute is `"false"`.
`android:requestLegacyExternalStorage`
: Whether the application wants to opt out of
[scoped storage](https://developer.android.com/training/data-storage/files/external-scoped).
**Note:** Depending on changes related to policy or app
compatibility, the system might not honor this opt-out request.
`android:requiredAccountType`
: Specifies the account type required by the application to function.
If your app requires an `https://developer.android.com/reference/android/accounts/Account`, the value for this attribute must
correspond to the account authenticator
type used by your app, as defined by `https://developer.android.com/reference/android/accounts/AuthenticatorDescription`,
such as `"com.google"`.
The default value is null and indicates that the application
can work *without* any accounts.
Because restricted profiles
can't add accounts, specifying this attribute makes your app
unavailable from a restricted profile unless you also declare
[`android:restrictedAccountType`](https://developer.android.com/guide/topics/manifest/application-element#restrictedAccountType) with
the same value.
**Caution:**
If the account data might reveal personally identifiable information, it's important
that you declare this attribute and leave [`android:restrictedAccountType`](https://developer.android.com/guide/topics/manifest/application-element#restrictedAccountType) null, so that restricted profiles cannot use
your app to access personal information that belongs to the owner user.
This attribute was added in API level 18.
`android:resizeableActivity`
:
Specifies whether the app supports [multi-window mode](https://developer.android.com/guide/topics/ui/multi-window).
> [!WARNING]
> **Warning:** To improve the layout of apps on form factors with smallest width \>= 600dp, the system ignores this attribute for apps that target Android 16 (API level 36). Your app can opt out of the Android 16 behavior, but the opt out will be eliminated in a future release. See [Device compatibility mode](https://developer.android.com/guide/practices/device-compatibility-mode#android_16).
You can set this attribute in either the [`<activity>`](https://developer.android.com/guide/topics/manifest/activity-element)
or `<application>` element.
If you set this attribute to `"true"`, the user can launch the activity in
split-screen and free-form modes. If you set the attribute to `"false"`, the app
can't be tested or optimized for a multi-window environment. The system can
still put the activity in multi-window mode with compatibility mode applied.
Setting this attribute to `"true"` doesn't guarantee that there are no
other apps in multi-window mode visible on screen, such as picture-in-picture, or
on other displays. Therefore, setting this flag doesn't mean that your app
has exclusive resource access.
For apps targeting API level 24 or higher, the default is `"true"`.
If your app targets API level 31 or higher, this attribute works differently on small and large
screens:
- **Large screens (sw \>= 600dp):** all apps support multi-window mode. The attribute indicates whether an app can be resized, not whether the app supports multi-window mode. If `resizeableActivity="false"`, the app is put into compatibility mode when necessary to conform to display dimensions.
- **Small screens (sw \< 600dp):** if `resizeableActivity="true"` and the minimum width and minimum height of the main activity are within the multi-window requirements, the app supports multi-window mode. If `resizeableActivity="false"`, the app doesn't support multi-window mode regardless of the activity minimum width and height.
> [!NOTE]
> **Note:**
>
> - Device manufacturers can override the API level 31 behavior to improve the layout of apps.
> - On devices with Android 16 (API level 36) or higher installed, virtual device owners (select trusted and privileged apps) can configure devices they manage to override (ignore) this attribute to improve app layout. See also [Companion app
> streaming](https://source.android.com/docs/core/permissions/app-streaming).
>
> See [Device compatibility mode](https://developer.android.com/guide/practices/device-compatibility-mode).
A task's root activity value is applied to all additional activities launched in the task. That is, if the root
activity of a task is resizable, then the system treats all other activities in the task as resizable. If the root
activity isn't resizable, the other activities in the task aren't resizable.
This attribute was added in API level 24.
`android:restrictedAccountType`
: Specifies the account type required by this application and indicates that restricted profiles
can access such accounts that belong to the owner user. If your app requires an
`https://developer.android.com/reference/android/accounts/Account` and restricted profiles *can*
access the primary user's accounts, the value for this attribute must
correspond to the account authenticator type used by your app, as
defined by `https://developer.android.com/reference/android/accounts/AuthenticatorDescription`, such as `"com.google"`.
The default value is null and indicates that the application can work *without* any
accounts.
**Caution:**
Specifying this attribute lets restricted profiles use your
app with accounts that belong to the owner user, which might reveal personally identifiable
information. If the account might reveal personal details, *don't*
use this attribute. Instead, declare the [`android:requiredAccountType`](https://developer.android.com/guide/topics/manifest/application-element#requiredAccountType) attribute
to make your app unavailable to restricted profiles.
This attribute was added in API level 18.
`android:supportsRtl`
: Declares whether your application is willing to support right-to-left (RTL) layouts.
If this is set to `"true"` and
[`targetSdkVersion`](https://developer.android.com/guide/topics/manifest/uses-sdk-element#target)
is set to 17 or higher, various RTL APIs are
activated and used by the system so your app can display RTL layouts.
If this is set to `"false"` or if `targetSdkVersion` is set to 16 or lower, the RTL APIs are ignored
or have no effect, and your app behaves the same regardless of the layout
direction associated to the user's locale choice. That is, your layouts are always left-to-right.
The default value of this attribute is `"false"`.
This attribute was added in API level 17.
`android:taskAffinity`
: An affinity name that applies to all activities within the application,
except for those that set a different affinity with their own
`https://developer.android.com/guide/topics/manifest/activity-element#aff`
attributes. See that attribute for more information.
By default, all activities within an application share the same
affinity. The name of that affinity is the same as the package name
set by the
`https://developer.android.com/guide/topics/manifest/manifest-element` element.
`android:testOnly`
: Indicates whether this application is only for testing purposes. For example,
it might expose functionality or data outside of itself that can cause a security
hole, but be useful for testing. This kind of APK only installs
through `https://developer.android.com/studio/command-line/adb`. You can't publish it to Google Play.
Android Studio automatically adds this attribute when you click **Run**
.
`android:theme`
: A reference to a style resource defining a default theme for all
activities in the application. Individual activities can override
the default by setting their own `https://developer.android.com/guide/topics/manifest/activity-element#theme`
attributes. For more information, see [Styles and themes](https://developer.android.com/guide/topics/ui/themes).
`android:uiOptions`
: Extra options for an activity's UI. Must be one of the following values:
| Value | Description |
|---|---|
| `"none"` | No extra UI options. This is the default. |
| `"splitActionBarWhenNarrow"` | Adds a bar at the bottom of the screen to display action items in the *app bar* , also known as the *action bar*, when constrained for horizontal space, such as when in portrait mode on a handset. Instead of a small number of action items appearing in the app bar at the top of the screen, the app bar splits into the top navigation section and the bottom bar for action items. This means a reasonable amount of space is available for the action items and for the navigation and title elements at the top. Menu items aren't split across the two bars. They always appear together. |
For more information about the app bar, see [Add the app bar](https://developer.android.com/training/appbar).
This attribute was added in API level 14.
`android:usesCleartextTraffic`
: Indicates whether the app intends to use cleartext network traffic, such as cleartext HTTP.
The default value for apps that target API level 27 or lower is `"true"`. Apps that
target API level 28 or higher default to `"false"`.
**Note:**
This attribute is getting deprecated and will be ignored for apps targeting API levels 38 and above.
Specify a [Network Security Configuration](https://developer.android.com/training/articles/security-config#CleartextTraffic) to control cleartext traffic for API levels 24 and above.
If your app targets API levels 23 and below, you must specify `android:usesCleartextTraffic` in addition to a Network Security Config.
When the attribute is set to `"false"`, platform components, for example, HTTP and FTP
stacks, `https://developer.android.com/reference/android/app/DownloadManager`, and
`https://developer.android.com/reference/android/media/MediaPlayer`, refuse the
app's requests to use cleartext traffic.
Third-party libraries are strongly encouraged to honor this
setting as well. The key reason for avoiding cleartext traffic is the lack of confidentiality,
authenticity, and protections against tampering. A network attacker can eavesdrop on transmitted
data and also modify it without being detected.
This flag is honored on a best-effort basis because it's impossible to prevent all cleartext
traffic from Android applications given the level of access provided to them. For example, there's
no expectation that the `https://developer.android.com/reference/java/net/Socket` API honors
this flag, because it can't determine whether its traffic is in cleartext.
However, most
network traffic from applications is handled by higher-level network stacks and components, which can
honor this flag by either reading it from
`https://developer.android.com/reference/android/content/pm/ApplicationInfo#flags`
or
`https://developer.android.com/reference/android/security/NetworkSecurityPolicy#isCleartextTrafficPermitted()`.
**Note:**
`https://developer.android.com/reference/android/webkit/WebView` honors this attribute for
applications targeting API level 26 and higher.
During app development, StrictMode can be used to identify any cleartext traffic from the app.
For more information, see
`https://developer.android.com/reference/android/os/StrictMode.VmPolicy.Builder#detectCleartextNetwork()`.
This attribute was added in API level 23.
This flag is ignored on Android 7.0 (API level 24) and above if an Android Network Security
Config is present.
`android:vmSafeMode`
: Indicates whether the app wants the virtual machine (VM) to operate
in safe mode. The default value is `"false"`.
This attribute was added in API level 8, where a value of `"true"`
disabled the Dalvik just-in-time (JIT) compiler.
This attribute was adapted in API level 22, where a value of `"true"`
disabled the ART ahead-of-time (AOT) compiler.introduced in: : API level 1
see also:
: https://developer.android.com/guide/topics/manifest/activity-element
`https://developer.android.com/guide/topics/manifest/service-element`
`https://developer.android.com/guide/topics/manifest/receiver-element`
`https://developer.android.com/guide/topics/manifest/provider-element`Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Google LLC
- Publisher
- Android (Google) (Official)
- Distributed by
- Android (Google)
- Source
- android/skills · identity/restore-credentials · commit bf68e2d
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.txt)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Google LLC or Android (Google).
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download restore-credentials.zip