239 captures
05 Oct 2017 - 29 Jan 2026
Apr MAY Jun
30
2020 2021 2022
success
fail

About this capture

COLLECTED BY

Collection: Save Page Now

TIMESTAMPS

The Wayback Machine - http://web.archive.org/web/20210530171527/https://developer.android.com/topic/arc
 





















Documentation  



















Platform  

Android Studio  

Google Play  

Jetpack  

Kotlin  

Docs  

Overview  

Guides  

Reference  

Samples  

Design & Quality  



News  





App Basics

Introduction


Build your first app
Overview
Create an Android project
Run your app
Build a simple user interface
Start another activity

App fundamentals


App resources
Overview
Handle configuration changes
 
Localization
Localize your app
Test your app with pseudolocales
Unicode and internationalization support
Language and locale resolution
Complex XML resources
 
Resource types
Overview
Animation
Color state list
Drawable
Layout
Menu
String
Style
Font
More types


App manifest file
Overview
<action>
<activity>
<activity-alias>
<application>
<category>
<compatible-screens>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<path-permission>
<permission>
<permission-group>
<permission-tree>
<profileable>
<provider>
<queries>
<receiver>
<service>
<supports-gl-texture>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-native-library>
<uses-permission>
<uses-permission-sdk-23>
<uses-sdk>

Devices


Device compatibility
Overview
Screen compatibility overview
Support different pixel densities
Support display cutouts
Declare restricted screen support
 
Multiple APK support
Overview
Create multiple APKs for different API levels
Create multiple APKs for different screen sizes
Create multiple APKs for different GL textures
Create multiple APKs with several dimensions
Support different languages and cultures
Support different platform versions
Filters on Google Play


Tablets, Large screens, and Foldables
Responsive layouts for tablets, large screens, and foldables
Support different screen sizes
Multi-window support
Building apps for foldables


Wear
Get started
Principles of Wear OS development
Upgrade to the latest version of Wear OS
Wear OS versus mobile development
Wear OS developer pathway
Ongoing Activities
Wear OS user interface
Tiles
 
Getting started
Create and run a wearable app
Debug a Wear OS app
Capture Wear UI screenshots
 
Overlays
Overview
Use the Wear UI library
Handle different watch face shapes
Screen options
Create lists
Navigation
Exit full screen activities on Wear
Show confirmations
Use speakers on wearables
Wet mode
Keep your app visible on Wear
Authentication
Standalone app
 
Notifications
Notifications on Wear OS
Bridging options for notifications
 
Handling data
Send and sync data on Wear OS
Network access and sync on Wear OS
Access the Wearable Data Layer
Transfer assets
Send and receive messages
Handle data layer events
Sync data items with the Data Layer API
Request permissions
Detect location
 
User input
Physical buttons
Rotary input
Create input method editors in Wear
Voice
 
Creating watch faces
Overview
Design watch faces
Build a watch face service
Draw watch faces
Watch face complications
Adding complications to a watch face
Creating interactive watch faces
Provide configuration activities
Address common issues
Improve performace with hardware acceleration
Optimize performance and battery life
 
Health services
Overview
Active data and exercise
Passive data updates
Use synthetic data providers
 
Design
Introduction
Design principles
Getting started
Interaction types
Notifications
Complications
Tiles
Overlays
Ongoing activities
Confirmation overlay
Disconnection indicators
Permission messages
Selection controls
Launch and latency
Nagivation
Permissions
Sign in
Hardware buttons
Color
Typography
Icons
Downloads
Wear app quality
Distribute to Wear OS


Android TV
Overview
 
Build TV Apps
Overview
Get started with TV apps
AndroidX TV libraries
Handle TV hardware
Manage TV controllers
Build TV layouts
On-screen keyboard
Create TV navigation
Best practices for driving engagement on Google TV
 
Build TV playback apps
Overview
Create a catalog browser
Provide a card view
Build a details view
Use Leanback transport controls
Playback controls on TV
Display a Now Playing card
Add a guided step
Introduce first-time users to your app
Enable background playback
 
Help users find content on TV
Overview
 
Recommend TV content
Overview
Channels on the home screen
Video program attributes
Audio program attributes
Game program attributes
 
Watch Next
Add programs
Attributes
Guidelines for app developers
Guidelines for TV providers
Preview videos
Recommendations in Android N and earlier
Make TV apps searchable
Search within TV Apps
Build TV games
 
Build TV input services
Overview
Develop a TV input service
Work with channel data
Manage TV user interaction
Support time-shifting
Support content recording
TV Apps checklist
 
TV Accessibility
Non Native Apps Accessibility Support
Non Native Apps Accessibility Best Practices
TalkBack evaluation examples for TV apps
Android 12 Developer Preview for TV


Android for Cars
Overview
 
Build media apps for cars
Build media apps for cars
Add support for Android Auto
Add support for Android Automotive OS
Build messaging apps for Android Auto
Build navigation, parking, and charging apps for Android Auto
Test Android apps for cars
Google Play services
Notifications on Android Automotive OS


Android Things
Overview
Platform differences
Google services
 
Supported hardware
Overview
NXP i.MX7D
Raspberry Pi 3
 
Advanced setup
Overview
Manually flash an image
Recover a device
Connecting to Wi-Fi with adb
 
Build apps
 
Create a Things app
Overview
Create a project
Connect the hardware
Interact with peripherals
Integrate peripheral drivers
 
Communicate with wireless devices
Bluetooth
LoWPAN
 
Configure devices
Settings
Updates
 
Interact with peripherals
Overview
GPIO
PWM
I2C
SPI
UART
Native PIO
CLI tool
Integrate native code
 
Build user-space drivers
Overview
Location
Input
Sensors
LoWPAN
Samples
 
Manage devices
Overview
Create a product
Configure a product
 
Create a build
Overview
Manage apps
 
Push an update
Overview
Automatic updates
Monitor analytics
 
Terms
Console Terms of Service
SDK License Agreement
Android Things Console


Chrome OS devices
Overview
Building apps for Chrome OS
Optimizing Apps for Chrome OS
Preparing your development environment
App Manifest Compatibility for Chromebooks
Chrome OS Device Support for Apps
App Rendering Differences on Chromebooks
Window management
Input compatibility for Chromebooks
Adapting Games on Chrome OS
Smooth animation on Chrome OS
Test Cases for Android Apps on Chrome OS

Core topics


Activities
Introduction to activities
The activity lifecycle
Activity state changes
Test your activities
Tasks and back stack
Processes and app lifecycle
Parcelables and bundles
 
Fragments
Overview
Create a fragment
Fragment manager
Fragment transactions
Animate transitions between fragments
Fragment lifecycle
Saving state with fragments
Communicate with fragments
Working with the app bar
Displaying dialogs with DialogFragment
Test your fragments
 
Handling app links
Overview
Enabling links to app content
Verify app links
Create app links for instant apps
Loaders
Recents screen
Restrictions on starting activities from the background
 
App shortcuts
Overview
Create shortcuts
Add capabilities
Manage shortcuts
Best practices for shortcuts
 
App widgets
Overview
Build an app widget
Build an app widget host


App compatibility
Overview
Compatibility framework tools
Restrictions on non-SDK interfaces


Architecture Components
Overview
Adding Components to your Project
App Startup
DataStore
 
View Binding
Overview
Migrate from Kotlin synthetics to view binding
 
Data Binding Library
Overview
Get started
Layouts and binding expressions
Work with observable data objects
Generated binding classes
Binding adapters
Bind layout views to Architecture Components
Two-way data binding
Handling Lifecycles
LiveData
 
Paging Library
Overview
Load and display paged data
Page from network and database
Transform data streams
Test your Paging implementation
Migrate to Paging 3
 
Paging 2
Overview
Display paged lists
Load paged data
ViewModel
 
WorkManager
Overview
Getting Started
 
How-To Guides
Defining your WorkRequests
Work states
Managing work
Observing intermediate Worker progress
Chaining work together
Testing Worker implementation
Integration tests with WorkManager
Debugging WorkManager
 
Advanced Concepts
Configuration and Initialization
 
Threading in WorkManager
Overview
Threading in Worker
Threading in CoroutineWorker
Threading in RxWorker
Threading in ListenableWorker
Support for long-running workers
Migrating from Firebase JobDispatcher
Migrating from GCMNetworkManager
Saving States
Saved State module for ViewModel
Use Kotlin coroutines with Architecture components
Release notes
Additional resources


Navigation component
Overview
Principles of Navigation
Getting started
Create destinations
Design for different form factors
Design navigation graphs
Nested graphs
Global actions
Navigate to a destination
Conditional navigation
Pass data between destinations
Create a deep link for a destination
Animate transitions between destinations
Update UI components with NavigationUI
Kotlin DSL
Create swipe views with tabs using ViewPager
Create swipe views with tabs using ViewPager2
Interact programmatically
Navigate with feature modules
Test navigation
Handling configuration changes
Add new destination types
Provide custom back navigation
Migrate to the Navigation component


Interact with other apps
Overview
Sending the user to another app
Getting a result from an activity
Allowing other apps to start your activity
 
Package visibility
Overview
Know which packages are visible automatically
Declare package visibility needs
Fulfill common use cases
Test package visibility


Intents and intent filters
Overview
Common intents


User interface
Overview
 
Layouts
Overview
Build a responsive UI with ConstraintLayout
 
Add motion to your layout with MotionLayout
Overview
Carousel with MotionLayout
MotionLayout examples
 
MotionLayout XML reference
Overview
<MotionScene>
<ConstraintSet>
<Constraint>
<Transition>
<onClick>
<onSwipe>
<KeyFrameSet>
<KeyPosition>
<KeyAttribute>
Create a list with RecyclerView
Advanced RecyclerView customization
Create a card-based layout
Create a two pane layout
 
Improving layout performance
Overview
Optimizing layout hierarchies
Re-using layouts with <include/>
Delayed loading of views
Linear layout
Adapter view
Relative layout
 
Custom view components
Overview
Creating a custom view class
Implementing custom drawing
Making the view interactive
Optimizing the view
Designing for foldables
 
Look and feel
Material design
Styles and themes
Dark theme
Adaptive icons
Add a floating action button
Create shadows and clip views
 
Text
Autosizing TextViews
Downloadable fonts
Fonts in XML
Emoji compatibility
Magnifier widget
Spans
Buttons
Checkboxes
Radio buttons
Toggle buttons
Spinners
Pickers
Tooltips
 
Notifications
Overview
Create a notification
Create an expandable notification
Display time-sensitive notifications
Start an activity from a notification
Create a group of notifications
Create and manage notification channels
Modify a notification Badge
Create a custom notification
Conversations
Bubbles
 
Add the app bar
Overview
Set up the app bar
Add and handle actions
Add an up action
Use action views and action providers
 
Control the system UI visibility
Overview
Dim the system bars
Hide the status bar
Hide the navigation bar
Enable fullscreen mode
Respond to UI visibility changes
 
Supporting swipe-to-refresh
Overview
Adding swipe-to-refresh to your app
Responding to a refresh gesture
Toasts overview
 
Pop-up messages overview
Overview
Build and display a pop-up message
Add an action to a message
Dialogs
Menus
 
Settings
Overview
Organize your settings
Customize your settings
Use saved values
Build a hierarchy in code
Handle other form factors
Preference components and attributes
 
Search
Overview
Creating a search interface
Adding recent query suggestions
Adding custom suggestions
Searchable configuration
 
Adding search functionality
Overview
Setting up the search interface
Storing and searching for data
Remaining backward compatible
Copy and paste
Drag and drop
Picture-in-picture Support
 
Creating backward-compatible UIs
Overview
Abstracting the new APIs
Proxying to the new APIs
Creating an implementation with older APIs
Using the version-aware component
Device control
 
Home channels for mobile apps
Overview
Media Home Books
Media Home Video


Animations & transitions
Overview
Introduction to animations
Property animation overview
Animate drawable graphics
Reveal or hide a view using animation
Move a view using animation
Move a view using a fling animation
Enlarge a view using a zoom animation
Animate movement using spring physics
Auto animate layout updates
Animate layout changes using a transition
Create a custom transition animation
Start an activity using an animation
Slide between fragments using ViewPager
Slide between fragments using ViewPager2
Migrate from ViewPager to ViewPager2
Additional resources


Images & graphics
Overview
Drawables overview
Vector drawables overview
Handling bitmaps
Selecting colors with the palette API
Reducing image download sizes
Hardware acceleration
OpenGL ES
 
Displaying graphics with OpenGL ES
Overview
Building an OpenGL ES environment
Defining shapes
Drawing shapes
Applying projection and camera views
Adding motion
Responding to touch events
 
Rendering
Overview
Reducing overdraw
Performance and view hierarchies
Analyzing with profile GPU rendering
Enhancing graphics with wide color content


Audio & video
Audio & video overview
Media controls
Supported media formats
Media codecs
 
Media app architecture
Media app architecture overview
Using a media session
 
Building an audio app
Audio app overview
Building a media browser service
Building a media browser client
Media session callbacks
Using the media controller test app
 
Building a video app
Video app overview
Building a video player activity
Media session callbacks
Responding to media buttons
Handling changes in audio output
Managing audio focus
 
The Google Assistant
The Google Assistant and media apps
Media apps on Google Assistant driving mode
 
Routing between devices
Routing overview
MediaRouter overview
MediaRouteProvider overview
Control amplitude with VolumeShaper
MediaPlayer overview
MediaRecorder overview
ExoPlayer
Sharing audio input
Playback capture
Frame rate
Best practices for sharing video
Additional Resources for Media


Services
Overview
Foreground services
Bound services
AIDL overview


Background tasks
Overview
Background threads
Background optimizations
 
Broadcasts
Overview
Implicit Broadcast Exceptions
 
Manage device awake state
Overview
Keep the device awake
Schedule repeating alarms


Permissions
Overview
Evaluate whether your app needs permissions
Declare app permissions
Request app permissions
App permissions best practices
Permissions used only in default handlers
Restrict interactions with other apps
Define custom permissions


App data & files
Overview
Storage overview
Save to app-specific storage
 
Save to shared storage
Overview
Media
Documents and other files
Datasets
Manage all files on a storage device
Save key-value data
 
Save data in a local database
Overview
Define data using entities
Access data using DAOs
Define relationships between objects
Write asynchronous DAO queries
Create views into a database
Prepopulate your database
Migrate your database
Test and debug your database
Reference complex data
Migrate from SQLite to Room
Save data using SQLite
Storage use cases and best practices
 
Sharing simple data
Overview
Sending simple data to other apps
Receiving simple data from other apps
 
Sharing files
Overview
Setting up file sharing
Sharing a file
Requesting a shared file
Retrieving file information
 
Sharing files with NFC
Overview
Sending files to another device
Receiving files from another device
 
Printing files
Overview
Printing photos
Printing HTML documents
Printing custom documents
 
Content providers
Overview
Content provider basics
Creating a content provider
Open files using storage access framework
Create a custom document provider
App install location


User data & identity
Overview
Add sign-in workflow
Show a biometric authentication dialog
 
Autofill framework
Overview
Optimize your app for autofill
Build autofill services
Integrate autofill with keyboards
Audit data access
Get a user-resettable advertising ID
Calendar provider overview
 
Contacts provider
Overview
Retrieving a list of contacts
Retrieving details for a contact
Modifying contacts using intents
Displaying the quick contact badge
Account transfer
 
Data backup
Overview
Back up user data
Back up key-value pairs
Test backup and restore
Best practices for unique identifiers
 
Remember and authenticate users
Overview
Remember your user
Authenticate to OAuth2 services
Create a custom account type


User location
Overview
Request location permissions
Get the last known location
Change location settings
Request location updates
Access location in the background
Create and monitor geofences
Detect when users start an activity
Optimize location for battery
Migrate to location and context APIs
Add maps


Touch & input
Overview
Input events
 
Using touch gestures
Overview
Detect common gestures
Track touch and pointer movements
Animate a scroll gesture
Support navigation gestures
Implement edge-to-edge
Handle multi-touch gestures
Drag and scale
Manage touch events in a ViewGroup
 
Handling keyboard input
Overview
Specifying the input method type
Handling input method visibility
Supporting keyboard navigation
Handling keyboard actions
 
Supporting game controllers
Overview
Handling controller actions
Supporting controllers across Android versions
Supporting multiple game controllers
 
Input method editors
Creating an input method
Image keyboard
Spelling checker


CameraX
Overview
CameraX architecture
Configuration
Preview
Analyze images
Image capture
Vendor extensions
Transform output
Use case rotations
CameraX devices


Camera2
Overview
Camera capture sessions and requests
Camera enumeration
Use multiple camera streams simultaneously
Multi-Camera API


Camera
Overview
Taking photos
Recording videos
Controlling the camera
Camera API


Sensors
Overview
Sensors overview
Motion sensors
Position sensors
Environment sensors
Raw GNSS measurements


Connectivity
Overview
 
Performing network operations
Overview
Connect to the network
Manage network usage
Reading network state
Optimize network data usage
Parse XML data
 
Transmit network data using Volley
Overview
Send a simple request
Set up RequestQueue
Make a standard request
Implement a custom request
 
Perform network operations using Cronet
Overview
Send a simple request
Cronet request lifecycle
 
Reference
 
org.chromium.net
Overview
CallbackException
 
CronetEngine
Overview
 
CronetEngine.Builder
Overview
LibraryLoader
CronetException
InlineExecutionProhibitedException
NetworkException
QuicException
UploadDataProvider
UploadDataProviders
UploadDataSink
 
UrlRequest
Overview
Builder
Callback
Status
StatusListener
 
UrlResponseInfo
Overview
HeaderBlock
Enhance your apps with 5G
Build client-server applications with gRPC
 
Transferring data without draining the battery
Overview
Optimize downloads for efficient network access
Minimize the effect of regular updates
Avoid redundant downloads
Modify patterns based on the connectivity type
 
Reduce network battery drain
Overview
Collecting network traffic data
Analyzing data traffic
Optimizing user-initiated network use
Optimizing app-initiated network use
Optimizing server-initiated network use
Optimizing general network use
 
Transfer data using Sync Adapters
Overview
Create a Stub Authenticator
Create a Stub Content Provider
Create a Sync Adapter
Run a Sync Adapter
 
Bluetooth
Overview
Set up Bluetooth
Find Bluetooth devices
Connect Bluetooth devices
Transfer Bluetooth data
Bluetooth permissions
Bluetooth profiles
 
Bluetooth Low Energy
Overview
Find BLE devices
Connect to a GATT server
Transfer BLE data
 
NFC
Overview
NFC basics
Advanced NFC
Host-based card emulation overview
 
Telecom
Overview
Build a calling app
Prevent caller ID spoofing
Telephony IDs
 
Wi-Fi
Wi-Fi scanning overview
Wi-Fi peer-to-peer
Wi-Fi aware overview
Wi-Fi location with RTT
Local Only Hotspot
Companion device pairing
 
Wi-Fi infrastructure
Wi-Fi infrastructure overview
Wi-Fi suggestion API for internet connectivity
Wi-Fi Network Request API for peer-to-peer connectivity
Passpoint
Save networks and Passpoint configurations
 
USB
Overview
Accessory overview
Host overview
VPN
Session initiation protocol overview
 
Discover and connect
Overview
Use network service discovery
Create P2P connections with Wi-Fi
Use Wi-Fi P2P for service discovery
Wi-Fi Easy Connect
Open Mobile API reader support


Renderscript
Overview
Advanced RenderScript
Migrating from RenderScript
 
Runtime API reference
Overview
Numerical types
Object types
Conversion functions
Mathematical constants and functions
Vector math functions
Matrix functions
Quaternion functions
Atomic update functions
Time functions and types
Allocation data access functions
Object characteristics functions
Kernel invocation functions and types
Input/output functions
Debugging functions
Graphics functions and types
Index


Web-based content
Overview
Building web apps in WebView
Managing WebView objects
Darken web content
User privacy in WebView crash reporting
Migrating to WebView in Android 4.4
Supporting different screens in web apps
Debugging web apps
Best practices for web apps


Android App Bundles
Overview
Configure the base module
Build and test your app bundle
The app bundle format


Google Play
Google Play Billing
Play Core Library
 
Play Asset Delivery
Overview
Integrate asset delivery (Java)
Integrate asset delivery (native)
Integrate asset delivery (Unity)
Target texture compression formats
Test asset delivery
 
Play Feature Delivery
Overview
Configure install-time delivery
Configure conditional delivery
Configure on-demand delivery
On-demand delivery best practices
Configure instant delivery
Additional resources
 
In-app reviews
Overview
Integrate using Kotlin or Java
Integrate using native code
Integrate using Unity
Test in-app reviews
 
In-app updates
Overview
Support in-app updates (Kotlin or Java)
Support in-app updates (Native)
Support in-app updates (Unity)
Test in-app updates
 
Google Play Instant
Overview of Google Play Instant
 
Get started with instant apps
Create an instant-enabled app bundle
UX best practices for apps
 
Get started with instant games
Overview
Unity plugin
UX best practices for games
Migrate to Android App Bundles
Implement cloud delivery of assets
Support Google Play Games Services
Instant Play games
Instant Play games checklist
Reduce the size of your instant app or game
Add ads to your instant app or game
Provide multiple entry points
 
Integrate with Firebase
Add Google Analytics for Firebase to your instant app
Use Firebase Dynamic Links with instant apps
Technical requirements checklist
Google Play Instant policy
 
Resources
Reference
Code samples
SDK release notes
Instant App Intents
 
Support
Known issues
StackOverflow
Play Developer API
 
Play Install Referrer
Overview
 
Play Install Referrer Library
Overview
Reference
Release notes
Play Install Referrer API
 
Application Licensing
Overview
Licensing Overview
Setting Up for Licensing
Adding Server-Side Verification
Adding Client-Side Verification
Licensing Reference
APK Expansion Files

App Actions


Slices
Overview
Getting Started
Slice templates

On-device search

Games


Develop
Developer previews
Build your game in Unity
Build your game in Unreal
Create a seamless sign-in experience
Determine sensitive data access needs
Secure your game
Develop games for all screens
Learn about rendering in game loops


Optimize
Tools for optimizing your game
Support 64-bit architectures
Improve your game's performance
Manage memory effectively in games
Detect and diagnose crashes
Identify CPU hot spots
 
Implement the Android Game SDK
Overview
Release notes
 
Achieve proper frame pacing
Overview
 
OpenGL renderers
Integrate
Update your build settings
Add frame pacing functions
Verify frame pacing improvement
 
Vulkan renderers
Integrate
Update your build settings
Add frame pacing functions
Verify frame pacing improvement
 
Optimize your frame rate
Overview
 
Custom engine integration
Overview
Run the demo app
Enable the API
Update your build settings
Define annotations, fidelity parameters, and settings
Add frame timing functions
Add loading time recording functions
Validate, package, and publish the APK
Troubleshoot common errors
Advanced usage
 
Unity integration
Overview
Enable the API
Integrate the plugin
Initialize the library and verify operation
Define annotations, fidelity parameters, and quality levels
Add loading time recording functions
Run the monitor app
Review and publish
Troubleshoot common errors
 
Incorporate high-performance audio
Overview
Update your build settings
Use Oboe
Code samples
Full guide to Oboe
 
Reference
 
Frame Pacing library
Overview
Modules
Swappy common tools
Swappy for OpenGL
Swappy for OpenGL extras
Swappy for Vulkan
Structs
SwappyStats
SwappyThreadFunctions
SwappyTracer
SwappyVkFunctionProvider
 
Performance Tuner library
 
Custom engine
Overview
Modules
Tuning Fork cache utilities
Tuning Fork extra utilities
Tuning Fork main interface
Structs
TuningFork_CProtobufSerialization
TuningFork_Cache
TuningFork_LoadingTimeMetadata
TuningFork_MetricLimits
TuningFork_Settings
 
Unity
Overview
Classes
AndroidPerformanceTuner< TFidelity, TAnnotation >
LoadingTimeMetadata
Result< T >
Structs
MetricLimits
Namespaces
Google
Google.Android
Google.Android.PerformanceTuner
Reduce game size
Profile graphics
Debugging native memory use


Launch and iterate
Launch your game on Google Play
Create an Android App Bundle in Unity
Add support for instant access
Stay connected with your user base

Best practices


Dependency injection
Overview
Manual dependency injection
Dependency injection with Hilt
Hilt in multi-module apps
Hilt and Jetpack integrations
Hilt testing guide
Hilt and Dagger annotations cheat sheet
 
Dagger
Dagger basics
Using Dagger in Android apps
Using Dagger in multi-module apps


Testing
Overview
Fundamentals of testing
Set up project
 
Building effective unit tests
Overview
Building local unit tests
Building instrumented unit tests
 
Automating UI tests
Overview
Testing UI for a single app
Testing UI for multiple apps
 
Testing app component integrations
Overview
Testing your service
Testing your content provider
Testing UI performance
 
Espresso
Overview
Setup instructions
Basics
Recipes
Multiprocess
Accessibility checking
Lists
Intents
Web
Idling resource
Cheat sheet
Additional resources
UI Automator
App Crawler
JUnit4 Rules
AndroidJUnitRunner
Release notes
Additional resources


Performance
Overview
 
Android Vitals
Overview
Stuck Partial Wake Locks
Excessive Wakeups
Excessive Background Wi-Fi Scans
Excessive Background Network Usage
ANRs
Crashes
Slow Rendering
Frozen Frames
Permission Denials
App Startup Time
App Standby Buckets
Processes and Threads Overview
Better Performance through Threading
 
Optimizing for Battery Life
Overview
Optimize for Doze and App Standby
Monitor the battery level and charging state
Monitor connectivity status and connection metering
Determine and monitor the docking state and type
Power management restrictions
Profile battery usage with Batterystats and Battery Historian
Analyze power use with Battery Historian
Testing power-related issues
Reduce your app size
 
Manage memory
Overview of Memory Managemement
Memory Allocation among Processes
Manage Your App's Memory
 
System tracing
Overview
Capture a trace from the command line
Capture a trace on a device
Navigate a report
Define custom events
Custom trace events in native code
Inspect GPU rendering
Designing for Seamlessness
Keeping Your App Responsive
Performance Tips
SMP Primer for Android
Verifying App Behavior on the Android Runtime (ART)


Accessibility
Overview
 
Build and test apps for accessibility
Make apps more accessible
Principles for improving app accessibility
Test your app's accessibility
 
Advanced topics
Make custom views more accessible
Create your own accessibility service
Additional resources


Privacy
Privacy best practices


Security
App security best practices
Security tips
Security with data
Security with data across additional Android versions
Security with HTTPS and SSL
Network security configuration
Updating your security provider to protect against SSL exploits
 
Protecting against security threats with SafetyNet
Overview
SafetyNet Attestation API
SafetyNet Safe Browsing API
SafetyNet reCAPTCHA API
SafetyNet Verify Apps API
Cryptography
Android Keystore System
Verifying hardware-backed key pairs with key attestation
Android Protected Confirmation
Supporting Direct Boot
Running embedded DEX code
App security improvement program


Build for Billions
Overview
Connectivity
Device capability
Data cost
Battery consumption
UI and content


Build for Enterprise
Overview
Developer guide
Work profiles
Set up managed configurations
 
App feedback
Send app feedback to EMMs
Test app feedback
Work contacts
Device management policies
 
Device management
Overview
Build a device policy controller
 
Dedicated devices
Overview
Lock task mode
Multiple users
Cookbook
Device control
Networking and telephony
Security
System updates
Network activity logging
 
Android versions
Overview
Android 11
Android 10
Android 9
Android 8.0
Android 7.0
Device administration
 





Android Developers  


Docs  


Guides  


Start building apps for Chrome OS

 

Chrome OS devices, such as Chromebooks, now support the Google Play Store and Android apps. This article assumes you have an existing Android app designed for phones or tablets that you want to optimize for Chromebooks. To learn the basics of building Android apps, see Build your first app.

Update your app's manifest file


To get started, update your manifest file to account for some key hardware and software differences between Chromebooks and other devices running Android.

As of Chrome OS version M53, all Android apps that don't explicitly require the android.hardware.touchscreenfeature will also work on Chrome OS devices that support the android.hardware.faketouchfeature. However, to ensure your app works on all Chromebooks, go to your manifest file and adjust the settings so that the android.hardware.touchscreenfeature is not required, as shown in the following example. Removing the requirement for touch input means you should also review your app's support for mouse and keyboard interactions.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          ... >
    <!-- Some Chromebooks don't support touch. Although not essential,
         it's a good idea to explicitly include this declaration. -->
    <uses-feature android:name="android.hardware.touchscreen"
                  android:required="false" />
</manifest>

Different hardware devices come equipped with different sets of sensors. Although Android handheld devices often have GPS and accelerometers, these sensors are not guaranteed to be available in every Chromebook. However, there are cases where the functionality of a sensor is provided in another way. For example, Chromebooks may not have GPS sensors, but they still provide location data based on Wi-Fi connections. See the Sensors overview document for an overview of all of the sensors that the Android platform supports. If you want your app to run on Chromebooks regardless of sensor availability, you should update your manifest file so that none of the sensors are required.

Some software features are unsupported on Chromebooks. For example, apps that provide custom IMEs, app widgets, live wallpapers, and app launchers aren't supported and won't be available for installation on Chromebooks. For a complete list of software features that aren't currently supported on Chromebooks, see incompatible software features.

Update your target SDK


By updating the targetSdkVersionattribute to the latest API level available, your app can take advantage of all the improvements in the Android platform. For example, Android 7.0 (API level 24) brings enhancements to multi-window support. It allows you to resize activities with free-form resizing, making them feel more natural. You can also access APIs for drag-and-drop operations across apps and custom mouse cursors.

Check for networking requirements


Chromebooks run the entire Android OS in a container, similar to Docker or LXC. This means that Android will not have direct access to the system's LAN interface. Instead, IPv4 traffic will pass through an internal layer of network address translation (NAT), and IPv6 unicast traffic will be routed through an extra hop. Outbound unicast connections from an Android app to the internet should mostly work as-is; but in general, inbound connections are blocked. Multicast or broadcast packets from Android will not be forwarded to the LAN through the firewall.

As a special exception to the multicast restriction, Chrome OS runs a service that forwards mDNS traffic between Android and the LAN interface, so the standard Network Service Discovery APIs are the recommended way to discover other devices on the LAN segment. After finding a device on the LAN, an Android app can use standard TCP or UDP unicast sockets to communicate with it.

IPv4 connections originating from Android will use the Chrome OS host's IPv4 address. Internally, the Android app will see a private IPv4 address assigned to the network interface. IPv6 connections originating from Android will use a different address from the Chrome OS host, as the Android container will have a dedicated public IPv6 address.

Use cloud and local storage effectively


One of the strongest features of Chromebooks is that users can easily migrate from one device to another. That is, if someone stops using one Chromebook and starts using another, they simply have to sign in, and all of their apps appear.

To further improve this experience, you should back up your app's data to the cloud to enable syncing across devices. That said, apps should not depend on an internet connection for normal operation. Apps should save a user's work locally if the device is offline and sync to the cloud once the device is back online. For example, Google Docs allows users to edit their docs offline and sync the changes to the cloud once the device gets connectivity.

Chromebooks can also be shared among a large number of people, such as in schools. Since local storage is not infinite, entire accountstogether with their storagecan be removed from the device at any point. For educational settings, it's a good idea to keep this scenario in mind.

Update the NDK libraries


If your app uses the Android NDK libraries, and its target SDK version is 23 or higher, ensure that text relocations are removed from both the ARM and x86 versions of your NDK libraries, as they're not compatible in Android 6.0 (API level 23) and higher. By leaving text relocations in your NDK libraries, you may also cause incompatibility errors with Chromebooks, especially when running on a device that uses an x86 architecture.

Develop new test cases for your app


First, make sure that the proper manifest flags are specified. These flags include the desired orientation, where setting screenOrientationunspecifiedis best. If you specify the orientation as landscape, consider using sensorLandscapeinstead to make sure that the experience on a tablet is optimal. If you have special size or orientation requests you should also consider adding the new meta tags as size or orientation hintswhich only affects desktop environments. If you also want to change it on phones, you should specify layout defaultHeight, defaultWidth, or minHeightinstead.

If you are interested in specific input device handling for specific device categories, you should specify android.hardware.type.pcto disable the input compatibility mode.

If you are using any kind of networking, make sure that the app is able to reconnect to the network after a connection problem is resolved or the device wakes from sleep mode.

Google recommends checking the Test cases for Android apps on Chrome OS, which you can use in your own test plan. The test cases cover a wide array of common scenarios that Android apps should be prepared for if they are expected to run on Chrome OS devices.

Multi-window and orientation changes


Chrome OS's multi-window environment can make state persistence and recall issues more obvious. You should use ViewModelto save and restore your state when appropriate.

To test state persistence you should minimize your app for some time, start another resource intensive process and then restore your app to validate that it returns to the state in which you left it.

Test window resizing by pressing the full screen key (F4), maximizing, and restoring. Test free resizing by enabling it in the developer options and checking that your app smoothly resizes without crashing.

If your Chrome OS device supports it, change from laptop into tablet mode to see that everything works as expected. Rotate the device once in tablet mode to test orientation changes. Transition back into laptop mode. Repeat this step a few times.

Make sure that the top bar is not breaking your app by offsetting UI elements or location-based touch input. For Chrome OS devices, make sure that your app does not place important information in the status bar area.

If you are using the camera or other hardware featureslike the penmake sure that it behaves properly when performing the window and device changes as outlined above.
 



Next
  Optimizing Apps for Chrome OS  


Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2021-02-24 UTC.