Release Notes

GVR SDK and NDK for Android v.1.80.0 (August 2017)

  • Performance HUD, a performance overlay enabled for all Daydream applications built with Google VR SDK 1.60.0 and above, is now available.
  • Added APIs related to head tracking with 6 degrees-of-freedom (DoF):
    • gvr_get_current_properties to obtain stateful properties about the GVR head tracker and context.
    • gvr_get_head_space_from_start_space_transform to obtain a 6DoF head pose when supported (3DoF otherwise).
    • gvr_poll_event to query events related to head tracking.
  • The sdk-videoplayer sample now uses an Intent to configure DRM instead of a hardcoded file.

GVR SDK and NDK for Android v.1.70.0 (July 2017)

  • Fixed several graphics memory leaks and artifacts related to asynchronous reprojection.


  • Various performance optimizations (SIMD optimized channel de/interleaving, reduced memory allocations during runtime, improved early reflection rendering).
  • Fixed glitch in reverb update when changing from very dry to very wet.
  • Improved audio engine performance (multi-threaded sound asset preloading and initialization).

GVR SDK and NDK for Android v.1.60.1 (May 2017)

  • Removed extraneous jsr305_annotations annotation file that caused a build problem if an app also included play-services-ads as a dependency.

GVR SDK and NDK for Android v.1.60.0 (May 2017)

  • Added GvrView.onBackPressed() and GvrLayout.onBackPressed() to ensure consistent back button behavior for Daydream apps.


  • Performance improvements for higher-order ambisonics decoding.
  • Switched to a new HRTF set that shows statistically significant improvements in terms of user preference and localization performance. For more information, see the spatial-media page on GitHub.

GVR SDK and NDK for Android v1.40.0

GVR SDK and NDK for Android v1.30.0

  • GvrView.undistortTexture has been removed; it was deprecated in v0.9.0. Current clients can use the lower level NDK APIs as necessary.
  • Added support for getting the controller battery level, and whether the controller is charging. See also gvr_controller_get_battery_level in the NDK and Controller.batteryLevelBucket in the SDK.
  • Added support for MPEG-DASH in VrVideoView. (issue)
  • Fixed issue where VrView classes running would require the Google VR Services app to be installed on Android N phones (issue)
  • Added GvrView.setRenderTargetScale to adjust the size of the render target use by an app.
  • The :extractNdk task properly cleans up after a gradlew clean. (issue).
  • Added a new "Force Undistorted Renderering" toggle in the VR Settings' Developer Options. For applications built with the latest SDK, this will 1) disable distortion correction, 2) disable asynchronous projection, 3) disable vignetting. For applications built with older SDKs, this toggle will only disable distortion correction. When this toggle is enabled, developers can capture their app using adb shell screenrecord --bit-rate RATE-IN-BYTES --size WIDTHxHEIGHT.
  • Added the experimental Controller Touchpad Gesture API. See gvr_gesture.h in the NDK for details.

GVR Audio

  • Added room effects support for soundfields.
  • Removed const references from NDK API to support C interface.

GVR SDK and NDK for Android v1.20.0

  • Released a new sample which uses video viewports to create a VR video player. Video viewports are described in more detail in the API overview.
  • VrVideoView now depends on ExoPlayer2.1.0 and above instead of ExoPlayer1. (issue)
  • Added gvr_controller_state_get_position API, reserved for future elbow model simulations.
  • Fixed NPE in GvrLayout during Display addition on certain devices. (issue).
  • Fixed an issue where SDK resources were duplicated between base.aar and common.aar. (issue)
  • Fixed issue where VrVideoView ignored inputType option after first video. (issue)
  • Fixed issue where VrVideoView failed to play HLS videos without audio track. (issue)

GVR Audio

  • Added the Surround Renderer API for Java and C. You can read in PCM buffers of surround sound as well as ambisonic soundfield content in order to render binaural stereo. In contrast to the Spatial Audio API, the Surround Renderer API is designed to be integrated into media players to enable head-tracked binaural audio in VR movie and 360° video experiences.
  • Fixed sound object distance attenuation when the minimum distance is greater than 1.0.
  • Fixed soundfield rotation updates when multiple soundfields are present in the scene.
  • Fixed reverb audio artifacts during continuous room updates.
  • Changed reverb brightness modifier to scale by the reverb time modifier.

GVR SDK and NDK for Android v1.10.0

  • GVR now uses a Maven repository for distributing AARs. See the Getting Started for Android guides for new instructions. The AARs are still included in the libraries directory, but you should use the Maven repository when starting your own project.
  • The SDK TreasureHunt sample is now Daydream-compatible. See also the new Cardboard trigger emulation APIs. (issue)

SDK API changes

  • Added GvrView.enableCardboardTriggerEmulation and GvrLayout.enableCardboardTriggerEmulation hooks. When applicable, these APIs will emulate Cardboard trigger events using Daydream controller button clicks.
  • Added BufferSpec.setColorFormat and BufferSpec.setDepthStencilFormat to Java bindings. (issue)
  • Added GvrApi.getEyeFromHeadMatrix(int, float[]) which returns the head- from-eye matrix via an output parameter. The variant that returns an array is deprecated.
  • Added GvrView.setMultisampling to allow MSAA Control.
  • Added async reprojection video API (to a quad). See the Using video viewports section in the NDK walkthrough for details.
  • Added option to hide the transition view in VrPanoramaView and VrVideoView.
  • Added option to hide the info button in VrPanoramaView and VrVideoView.

NDK restructuring

  • The NDK directory is removed.
  • ndk/demos are now in the samples directory. The NDK samples are disabled by default and the settings.gradle file will need to be edited to enable them. See the Getting Started for Android - C/C++ guide for more details.
  • NDK include files are in the libraries/headers directory.
  • NDK .so libraries are shipped in the AARs and need to be extracted to the libraries/jni directory before building samples by running ./gradlew :extractNdk. See the Getting Started for Android - C/C++ guide for more details.


  • Fixed minor shader issues in samples. (issue)
  • Fixed memory issues with an NDK sample. (issue)
  • Fixed Activity lifecycle issues related to orientation changes in the NDK samples. (issue)
  • Fixed an issue where the controller.aar failed to specify a minSdkVersion. (issue)

GVR SDK and NDK for Android v1.0.3

  • Fixed an issue with async reprojection on Daydream-ready phones.

GVR SDK and NDK for Android v1.0.2

  • Fixed an issue where VR-related optimizations were not properly applied.

GVR SDK and NDK for Android v1.0.1

  • Added the DaydreamApi.exitFromVr() method to allow graceful VR->2D transitions.
  • Fixed various controller recentering issues.
  • Improved tracker behavior during VR->VR transitions.

GVR SDK for Android v1.0.0

The Google VR SDK 1.0 with support for Daydream has graduated out of beta! Our updated SDK simplifies common VR development tasks so you can focus on building immersive, interactive mobile VR applications for Daydream-ready phones and headsets, and supports integrated asynchronous reprojection, high fidelity spatialized audio, and interactions using the Daydream controller.

SDK API changes

  • GvrView now requires an Activity Context upon creation.
  • Added the DaydreamApi class for Daydream-specific functionality.
  • GvrView.setAlignmentMarkerEnabled and GvrView.setSettingsButtonEnabled methods have both been removed. The UI layer is now completely enabled by default in stereo mode, and disabled when stereo mode is disabled.
  • The experimental GvrView.setUseProtectedBuffers API has been removed.
  • The SDK now has ProGuard support. root/proguard-gvr.txt has been added with a GVR ProGuard config. The Treasure Hunt sample has an example using the Proguard config.
  • All AARs now contain multiple architectures for their native libraries. If you want to exclude these alternative architectures from your apk, you will need to configure your build file appropriately.
  • The exoplayer and protobuf dependencies have been removed from the GVR AARs. They are now pulled in via JCenter. See the video widget sample for information on how to add them to your dependencies.

NDK API changes

  • GvrLayout now requires an Activity Context upon creation.
  • Added gvr_get_viewer_type. This API can be used to detect whether the current, paired viewer is a Cardboard or Daydream-ready viewer.
  • Added gvr_set_surface_size. This method was previously usable only from GvrLayout.setFixedPresentationSurfaceSize, and is useful for scenarios where the underlying fullscreen surface dimensions differ from the display dimensions, e.g., when hardware scaling is enabled.
  • Added gvr_apply_neck_model, a convenient utility method for transforming the head pose based on a simple neck model approximation.
  • Added a simple error code API: gvr_get_error, gvr_clear_error and gvr_get_error_string.
  • Renamed gvr_set_default_framebuffer_active to gvr_bind_default_framebuffer, better documenting its semantics.
  • Added new methods to all C++ wrapper types, improving C/C++ interoperability: cobj(), release(), and a public constructor that takes the corresponding C type. Removed the static BufferViewport::Wrap method.
  • Renamed gvr_get_head_pose_in_start_space to gvr_get_head_space_from_start_space_rotation to make it clear that only rotation will be returned, and that we are returning the transform between spaces, which is actually the inverse of the head pose. C++ wrappers also updated.
  • GvrApi::CreateSwapchain renamed to CreateSwapChain for consistency.
  • Added a user preferences API, gvr_get_user_prefs and gvr_user_prefs_get_controller_handedness.
  • Added experimental async reprojection video API. See the NDK Walkthrough for details.

Spatial audio changes

  • Added higher order ambisonic playback support in the Google VR audio engine.
  • Added the Metal material type to surface materials of Google VR audio rooms.
  • Added a no distance attenuation option to distance rolloff methods for sound object sources.
  • Major performance improvements in binaural rendering of audio sources.
  • Fixed stuttering on Bluetooth headphones.
  • Fixed reverb gain parameter adjustments to ensure smoother transitions.

VR View changes

  • VrVideoView now has a setVolume() method.
  • Fixed issue #202.

GVR SDK for Android v0.9.1

  • Fixed a bug in VR View -- the onClick() event callback was not called correctly when the view was in FULLSCREEN_STEREO_MODE.

GVR SDK for Android v0.9.0

General changes

  • "VR mode" renamed to "Stereo mode" in GvrView, VrPanoramaView and VrVideoView, differentiating the setting from Android N’s "VR mode".
  • GvrView.undistortTexture() is now deprecated, and will be removed in a future release. Current clients can use the lower level NDK APIs as necessary.
  • "Scanling racing" is now referred to as “Asynchronous Reprojection” in the public APIs. GvrView/GvrLayout.setScanlineRacingEnabled() is now setAsyncReprojectionEnabled().
  • GvrView.setElectronicDisplayStabilization() has been removed. This API was purely experimental, and on Daydream-compatible devices is superseded by asynchronous reprojection.
  • GvrView.StereoRenderer.onRendererShutdown() is now called properly during shutdown.
  • GvrView no longer supports magnet trigger detection or NFC-based pairing for v1 Cardboard viewers.

NDK API changes

  • A new swapchain-based rendering pipeline replaces the previous framebuffer pipeline. This approach allows the use of multiple pixel buffer inputs per frame. See the TreasureHunt and ControllerPaint NDK samples for an example of how to use this pipeline. You can also take a look at the updated NDK Walkthrough.
  • gvr_buffer_spec now supports multi-sampling, color and depth-stencil format configuration. See gvr_buffer_spec_set_samples(), gvr_buffer_spec_set_color_format() and gvr_buffer_spec_set_depth_stencil_format().
  • gvr_render_params is now an opaque struct, and has been renamed to gvr_buffer_viewport - Use gvr_buffer_viewport_* methods to interact with a given gvr_buffer_viewport instance.
  • gvr_render_params_list has been renamed to gvr_buffer_viewport_list.
  • gvr_head_pose has been removed - Existing methods now use a gvr_mat4f in its place.
  • gvr_set/get_bool_parameter have been removed - Chromatic aberration and synchronous reprojection (EDS) are no longer supported, and asynchronous reprojection (scanline racing) is configured with an explicit API on Android (can be queried via gvr_get_async_reprojection_enabled()).
  • Various minor type tweaks for ABI stability.
  • C++ wrapper code in the GVR headers can be excluded by defining GVR_NO_CPP_WRAPPER. (issue #94)

Spatial audio changes

  • Added support for playback of stereo sources.
  • Added SetAmbisonicRotation() method to enable the rotation of ambisonic soundfield sources.

VR View changes

  • Added API to get the rotation angles (yaw, pitch) of the user's head.
  • Added API to change display mode (embedded, fullscreen, or fullscreen stereo) programmatically.
  • Added support for manual override of the view's yaw via touch gestures. This is enabled by default but can be disabled.
  • Fixed following issues:

GVR SDK for Android v0.8.5


  • Added option in VrVideoView to specify that a remotely streamed video is stereoscopic or monocular (issue #112)

  • Added new APIs for GvrView (SDK) and GvrLayout (NDK) for recentering head tracking.

  • Added additional (NDK) API support for framebuffer creation, including multisampling support.

  • Spatial audio changes

    • Increased global audio volume by +3dB.
    • Using createSoundObject() and createSoundfield() with non-preloaded sound files initializes streamed playback.
    • Adds PauseSound() and ResumeSound() methods.


  • Fixed VrVideoView’s rendering issues on Samsung phones running Android 6.0.1. (issue #75)

  • Correctly set right eye to null in Renderer.onDrawFrame() when VR Mode is disabled. (issue #120)

  • Fixed scanline racing issues (on supported devices) when pausing and resuming.

  • GvrView's setUseProtectedBuffers() experimental function now works correctly when scanline racing is enabled.

GVR SDK for Android v0.8.1


  • Added native recentering API for head tracking.
  • Added support for HLS streams in VrVideoView (issue #92)


  • The VrVideoView class’ loadVideo() method now correctly accepts URIs to local paths (e.g., /sdcard/FILENAME.MP4) without needing to prefix the paths with “file:///” (issue #97)

  • Resolved issues when pausing/resuming apps with scanline racing enabled

  • Improved baseline performance for scanline racing.

Google VR SDK for Android v0.8.0


  • Google VR SDK renaming. The Google VR SDK -- sometimes shortened as GVR -- has replaced the Cardboard SDK. The top level packages are now for the Java SDK and for the NDK. Correspondingly, classes like CardboardView, CardboardActivity are now called GvrView and GvrActivity respectively. See the migration guide below for more details.

  • Beta NDK. This release contains a beta Native Development Kit (NDK) package, intended for developers using lower-level, native APIs and custom rendering pipelines. The Java SDK, in particular GvrView and GvrActivity, remain the recommended primitives for most (casual or otherwise) VR apps. The NDK documentation and samples are the best references for getting started with the native GVR APIs for rendering, controllers and audio. As a beta release, the NDK is likely to evolve in the near future.

  • Beta Controller Java SDK and NDK APIs. This release contains beta Java SDK and NDK APIs for the Daydream Controller. These Controller APIs are only functional on Daydream-ready devices. There are sample apps in the SDK and NDK demonstrating these APIs. Even though Daydream-ready devices aren't available yet, you can already get started with development by installing Android N Developer Preview on a Nexus 6P and using it in combination with the Controller Emulator app running on a secondary phone. This setup will allow you to start developing apps that use the controller. For more details, see Set up a Daydream Development Kit.

  • GvrAudioEngine supports streamed decoding and rendering of ambisonic sound files.

  • Support for Android API <19 (KitKat) has been removed from the Java SDK.

  • First generation (v1) Cardboard headsets with magnet clickers won’t be supported in future SDK updates, and should be considered deprecated with this update.


Known issues

  • Scanline racing - Scanline racing (low latency) is a beta feature now available via both NDK and SDK APIs. However, this feature will be supported only on “Daydream-ready” devices with the Android N release, and is currently only operational on the Nexus 6p running the latest Android N preview. There are several known issues with scanline racing:

    • When scanline racing is enabled, apps may crash or freeze when paused and resumed. This will be fixed in the next SDK release.

    • Driver issues with the N preview build may cause 32-bit ARM builds to exhibit lower than expected performance when scanline racing. This will be resolved in the final N release.

    • Scanline racing only works when the display is in the “landscape left” orientation.

  • Magnet trigger detection - The current native GVR API does not support Cardboard v1 magnet trigger callback detection. This feature will soon be deprecated in the SDK, and all recent and upcoming Cardboard-like devices will rely solely on touch events for trigger activation.

  • Controller gesture detection - The current native controller API does not report high-level gestures (such as swipes, flings, clicks, etc). If you need gestures in your application, you will need to implement the gesture recognition on your own for now. We may add gestures to the API in a future release.

Migration guide

  • Packages have been migrated from to The package is now

  • Top-level Cardboard-prefixed classes are now Gvr-prefixed:

    • CardboardActivity -> GvrActivity
    • CardboardView -> GvrView
    • CardboardAudioEngine -> GvrAudioEngine
  • The SDK library naming has also changed:

    • core.aar -> base.aar
  • The following GvrView methods have been removed

    • setRestoreGLStateEnabled (always disabled)
    • setVignetteEnabled (always enabled)
    • setGyroBiasEstimationEnabled (always enabled)

Cardboard SDK for Android v0.7.0

New features

  • Added VR Views. These are easy-to-use components that you can insert in your existing Android application to display 360 imagery and video with support for fullscreen and VR mode. The API is still in its early stages and we're looking forward to your feedback. See the dedicated VR View overview for more detail.

  • CardboardAudioEngine -- added room effects to simulate rooms of different sizes and different surface materials, added support for streamed playback of ambisonic audio files.

  • Added a transition screen, which guides users to put their phone into their Cardboard viewer and fades into your 3D scene when it detects that the phone is in landscape left orientation. If you want to enable the transition screen in your app, call CardboardView's setTransitionViewEnabled(true).


  • The SDK is now packaged as a set of .AARs instead of jars. .AAR is a better format to distribute SDK libraries that contain native code and resources. See the updated Get Started section for more details on how to use the SDK AARs in your project.

  • CardboardView is now a FrameLayout and doesn't inherit from GLSurfaceView anymore. Migrating your code should be smooth as CardboardView re-declares common functions from GLSurfaceView, such as queueEvent() and setEGLConfigChooser().

  • The following CardboardView methods are deprecated and likely to be removed in next release -- setRestoreGLStateEnabled (now disabled by default), setVignetteEnabled (enabled by default) and setGyroBiasEstimationEnabled (enabled by default).

  • In CardboardAudioEngine, added an update() method which needs to be called regularly, typically every frame.


  • Cardboard SDK clients can now target Android API level 23. This release fixes a bug where if you targetted API level 23 and your app ran on an Android M phone, the Cardboard viewer pairing would be broken. The SDK now asks for external storage permission when the user presses the Settings icon.

Known issues

  • VrVideoView (for 360 video playback) has some rendering issues on phones running KitKat or lower. The video can sometimes exhibit artifacts and the client's Activity theme can be affected after a video is played -- e.g. the background of your Activity title can turn black.

Cardboard SDK for Android v0.6.0

  • Added audio engine to spatialize sound sources in 3d space. See how this engine is used in the Treasure Hunt sample code to help the user locate cubes in the scene thanks to spatial sounds coming from each cube.

  • Removed the separate nano proto library which used to be in CardboardSample/libs/libprotobuf-java-2.6-nano.jar. It is now bundled together with the cardboard.jar library. If you're upgrading an existing project by copying only cardboard.jar, make sure you also delete libprotobuf-java-2.6-nano.jar. Otherwise you'll get a "Multiple dex files define" exception or similar.


  • Calling CardboardView's setVRModeEnabled(false) correctly results in onDrawEye() being called once per frame.

  • CardboardActivity is now properly garbage-collected and is not leaked when the application stops.

  • GL_REPEAT can now be used successfully with ES3.

Known issues

  • Cardboard viewer pairing is broken if your app targets Android API level 23 and runs on an Android M phone. The impact is that if a user has paired their specific Cardboard viewer using the QR code reader in Google's Cardboard app, the viewer profile won't be correctly read by your app, potentially leading to stereo rendering not optimized for that particular Cardboard viewer.

We're working on a replacement to our current solution of storing the viewer profile on the S/D card. In the mean time, some possible work-arounds are: * if possible, have your app target Android API level 22 or below instead of Android API level 23. * add a run-time dialog to request users to explicit grant the Manifest.permission.READ_EXTERNAL_STORAGE permission to your app. More detail at

Cardboard SDK for Android v0.5.8

  • Fixed a crash when clicking on the Settings icon.

Cardboard SDK for Android v0.5.7

  • Improved drift correction so that the head tracking is stable even on phones with low quality sensors.

  • Performance improvements that help developers ship apps at a stable 60 fps.

  • Strings in 'Settings' menu are now available in 40 languages.

Cardboard SDK for Android v0.5.6

  • Fixes a crash that was occurring on phones without any magnetometer sensor.

Cardboard SDK for Android v0.5.5

  • Core functionalities of the SDK are now implemented in c++. Overall behavior of existing API should not change.

  • Added CardboardView's setElectronicDisplayStabilizationEnabled() to enable and disable Electronic Display Stabilization. When this feature is turned on, the stereo frames are warped just before rendering using the most up-to-date sensor data, which improves latency. This is turned off by default as it is an experimental feature.

Cardboard SDK for Android v0.5.4

  • Improved gyro drift correction. It now uses the uncalibrated gyro sensor if it's supported by the phone. Also auto-calibration will kick in less frequently now. For really drifty phones, it might be necessary to put them down on a flat surface for a few seconds to be better calibrated.

  • CardboardActivity's onCardboardTrigger() is now correctly called the first time a user clicks on the screen on phones with Android API versions from 16 to 18 included.

  • onCardboardTrigger() is now called on screen touch down events, while it was previously called on touch up. This makes triggering via screen touch more responsive.

  • CardboardView now renders when not in full-screen when VR mode is enabled. In previous versions, no rendering was performed and the screen would stay black. Not being in full-screen breaks our assumptions used for frustrum computation, so it's not ideal. But we relaxed this contraint as some phones like Galaxy Note Edge don't give access to all screen pixels.

  • CardboardView now offers a way to register a callback to listen to onCardboardTrigger events.

Cardboard SDK for Android v0.5.3

  • Added gyroscope bias correction to CardboardView, to reduce drift in head tracking. This can be disabled by calling CardboardView.setGyroBiasEstimationEnabled(false)
  • Added support for a simple neck model in CardboardView, for more natural head rotations. This is enabled by default, and can be disabled by calling CardboardView.setNeckModelEnabled(false)
  • When using CardboardActivity, clicking on a CardboardView now results in calling CardboardActivity.onCardboardTrigger(), to better support headsets with no magnet clicker. This behavior can be disabled by calling CardboardActivity.setConvertTapIntoTrigger(false)
  • Fixed rendering bug when CardboardView.setDistortionCorrectionEnabled(false) is called.

Cardboard SDK for Android v0.5.2

  • Improved head tracking prediction, which should result in better observable latency.
  • Added support for more phone vertical alignment options in headset parameters.
  • Added resetHeadTracker() function in CardboardView class.

Cardboard SDK for Android v0.5.1

  • Removed Guava library dependency.

Cardboard SDK for Android v0.5.0

General functionality

  • Settings button – in VR mode, by default, a settings icon now appears at the bottom of the display between the rendered eye views. Clicking on the icon gives user the choice to navigate to the vrtoolkit settings page housed in the Cardboard App.
  • Library is aware of currently-paired cardboard viewer parameters

Significant API changes

  • CardboardView class
    • The former classes EyeParams and EyeTransform have been combined into a single class Eye. This affects CardboardView.Renderer.onDrawFrame() and CardboardView.StereoRenderer.onDrawEye()
    • setInterpupillaryDistance() has been removed. IPD is currently assumed to match interlens distance, and tuning is not yet supported.
    • setZPlanes(), getZNear(), getZFar() have been removed.
  • CardboardActivity class
    • Removed isDeviceInCardboard(), as there is not a reliable way to know when a phone is in the cardboard device.
  • CardboardDeviceParams class
    • Methods {get,set}LensDiameter() and {get,set}EyeToLensDistance() were removed. In their place the default maximum field of view is now provided by a getLeftEyeMaxFov() method returning a FieldOfView object (the right eye's field of view is assumed to be a mirror of the left eye's field of view).
  • Distortion class
    • The screen units were changed from meters to tangent angle. This would only affect apps using the getCoefficients(), which is not common.
  • HeadMountedDisplay class
    • Method renaming: {get,set}Cardboard() → {get,set}CardboardDeviceParams(); {get,set}Screen() → {get,set}ScreenParams().