Migration guide for Snowplow Android Tracker SDK from version 1.x to 2.0
This section describes the main changes when converting an applications instrumentation of the Snowplow Android tracker SDK from version 1.x to version 2.0.
The new approach
The main objective of this new release is a revision of the public API. Currently, the tracker configuration requires the creation of the Tracker and Emitter components. Optionally, the Subject component can be configured as well. Then both need to be passed to the Tracker component. The version 2.0 simplifies this process, letting the developer to specify the configuration with Configuration objects and passing them to a createTracker
method able to return the tracker ready to use, without any other extra steps.
Setup of the tracker
The entry point to setup the tracker is now the Snowplow
static class and the createTracker
methods. They need a namespace string which is now mandatory. The namespace string uniquely identifies the tracker in the app. It's important to note that all the events not sent to the collector but stored in the tracker are attached to the namespace string. This means that if a new configuration uses a different namespace, all those unsent event will still stored in the tracker, in a sort of zombie state, with no way to send them to any collector. To send them you need to reuse the original namespace string or delete them.
Fine tuning of the tracker is now possible with Configuration classes.
These are the classes now available:
NetworkConfiguration
: to configure network connection with the Snowplow collector.TrackerConfiguration
: to configure contexts and automatic events of the tracker, and general behavior.SessionConfiguration
: to configure session behavior.EmitterConfiguration
: to fine tune about how the tracker sends events to the collector.SubjectConfiguration
: to specify details to send with events about the user and the platform.GdprConfiguration
: to configure the GDPR context.GlobalContextsConfiguration
: to configure the GlobalContexts feature to dynamically send created contexts with some selected events.
They replace many of the settings previously set on the builders for the Tracker, Subject and Emitter components.
An example configuration:
TrackerController initAndroidTracker(Context context, String trackerNamespace) {
NetworkConfiguration networkConfiguration = new NetworkConfiguration("https://snowplow-collector-url.com");
TrackerConfiguration trackerConfiguration = new TrackerConfiguration("example-of-app-id")
.sessionContext(true)
.platformContext(true)
.applicationContext(true)
.geoLocationContext(true)
.lifecycleAutotracking(true)
.screenViewAutotracking(true)
.screenContext(true)
.exceptionAutotracking(true)
.installAutotracking(true)
.diagnosticAutotracking(true);
SessionConfiguration sessionConfiguration = new SessionConfiguration(
new TimeMeasure(60, TimeUnit.SECONDS),
new TimeMeasure(30, TimeUnit.SECONDS)
);
GdprConfiguration gdprConfiguration = new GdprConfiguration(
Basis.CONSENT,
"someId",
"0.1.0",
"this is a demo document description"
);
return Snowplow.createTracker(context,
trackerNamespace,
networkConfiguration,
trackerConfiguration,
sessionConfiguration,
gdprConfiguration
);
}
The tracker can be controlled by the TrackerController
(the Tracker
class is now deprecated). Through the TrackerController
it will be possible to update settings at runtime and get information about the tracking state. From the TrackerController
it's also possible to access all the other controllers. This allows you to access and update settings about communication with the collector, emission of the events, session of the tracker (if enabled) and so on. In general, there is a specific controller for each area covered by a configuration. All of them are accessible through the TrackerController
.
Note: Please, don't retain a reference to the sub-controllers. If you invalidate or recreate the tracker, all the sub-controller instances will no longer be active.
Low level migration from 1.x
- Minimum supported version is API 21 (Android 5).
- Migrated from Android Support Library to AndroidX.
- Minimum OkHttpClient dependency is 4.9.1.
lifecycleAutotracking
(background and foreground events and indexes on sessions) are optional and off by default.lifecycleAutotracking
requiresandroidx.lifecycle:lifecycle-extensions
among the dependencies of the app.RequestSecurity
class has been renamedProtocol
.mobileContext
property has been renamedplatformContext
.DevicePlatforms
has been renamedDevicePlatform
.ReadyRequest
has been replaced byRequest
(not needed in the new API).namespace
on Tracker is now mandatory for the correct operativity.name
field onScreenView
is now mandatory.EcommerceItem
s aren't forced to have the same timestamp of theEcommerceTransaction
event.SPEcommerceItem
constructor doesn't requireitemId
as it's added by the tracker when the e-commerce event is sent.- Deprecated classes of the previous API (Tracker, Emitter, Subject, ...) are now accessible from the
internal
sub-package. - The
internal
package is considered private API so it doesn't follow the restrictions of the Semantic Version policy. Although we will keep the legacy deprecated API with minimum changes until the release of the version 3.0. - Global Contexts implementation is changed and uniformed to the one on iOS tracker.
- For the versions 2.0 and 2.1, the application install events report the timestamp of when installation happened in the
true_timestamp
rather than thedevice_timestamp
. It caused an issue with thederived_timestamp
. For this reason, since the version 2.2, the application install events report the timestamp of then installation happened in thedevice_timestamp
like the previous 1.x versions.
Migrate to new Global Contexts API
- The
ContextGenerator
no longer owns thetag
string used to identify the Global Context generator in the tracker. TheContextGenerator
replacement is simply calledGlobalContext
which is the new generator class for the Global Contexts feature. - The generator
GlobalContext
is added to the tracker and associated to the specified tag through the methodadd
ofGlobalContextsConfiguration
. - The classes
FilterProvider
andRulesetProvider
have been removed.GlobalContext
class andContextGenerator
protocol can be used to filter events through specific event fields or rulesets.