summaryrefslogtreecommitdiffstats
path: root/mobile/android/docs/adjust.rst
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/docs/adjust.rst')
-rw-r--r--mobile/android/docs/adjust.rst179
1 files changed, 179 insertions, 0 deletions
diff --git a/mobile/android/docs/adjust.rst b/mobile/android/docs/adjust.rst
new file mode 100644
index 000000000..16cb85b2b
--- /dev/null
+++ b/mobile/android/docs/adjust.rst
@@ -0,0 +1,179 @@
+.. -*- Mode: rst; fill-column: 100; -*-
+
+======================================
+ Install tracking with the Adjust SDK
+======================================
+
+Fennec (Firefox for Android) tracks certain types of installs using a third party install tracking
+framework called Adjust. The intention is to determine the origin of Fennec installs by answering
+the question, "Did this user on this device install Fennec in response to a specific advertising
+campaign performed by Mozilla?"
+
+Mozilla is using a third party framework in order to answer this question for the Firefox for
+Android 38.0.5 release. We hope to remove the framework from Fennec in the future.
+
+The framework consists of a software development kit (SDK) built into Fennec and a
+data-collecting Internet service backend run by the German company `adjust GmbH`_. The Adjust SDK
+is open source and MIT licensed: see the `github repository`_. Fennec ships a copy of the SDK
+(currently not modified from upstream) in ``mobile/android/thirdparty/com/adjust/sdk``. The SDK is
+documented at https://docs.adjust.com.
+
+Data collection
+~~~~~~~~~~~~~~~
+
+When is data collected and sent to the Adjust backend?
+======================================================
+
+Data is never collected (or sent to the Adjust backend) unless
+
+* the Fennec binary is an official Mozilla binary [#official]_; and
+* the release channel is Release or Beta [#channel]_.
+
+If both of the above conditions are true, then data is collected and sent to the Adjust backend in
+the following two circumstances: first, when
+
+* Fennec is started on the device [#started]_.
+
+Second, when
+
+* the Fennec binary was installed from the Google Play Store; and
+* the Google Play Store sends the installed Fennec binary an `INSTALL_REFERRER Intent`_, and the
+ received Intent includes Google Play Store campaign tracking information. This happens when thea
+ Google Play Store install is in response to a campaign-specific Google Play Store link. For
+ details, see the developer documentation at
+ https://developers.google.com/analytics/devguides/collection/android/v4/campaigns.
+
+In these two limited circumstances, data is collected and sent to the Adjust backend.
+
+Where does data sent to the Adjust backend go?
+==============================================
+
+The Adjust SDK is hard-coded to send data to the endpoint https://app.adjust.com. The endpoint is
+defined by ``com.adjust.sdk.Constants.BASE_URL`` at
+https://hg.mozilla.org/mozilla-central/file/f76f02793f7a/mobile/android/thirdparty/com/adjust/sdk/Constants.java#l27.
+
+The Adjust backend then sends a limited subset of the collected data -- limited but sufficient to
+uniquely identify the submitting device -- to a set of advertising network providers that Mozilla
+elects to share the collected data with. Those advertising networks then confirm or deny that the
+identifying information corresponds to a specific advertising campaign performed by Mozilla.
+
+What data is collected and sent to the Adjust backend?
+======================================================
+
+The Adjust SDK collects and sends two messages to the Adjust backend. The messages have the
+following parameters::
+
+ V/Adjust ( 6508): Parameters:
+ V/Adjust ( 6508): screen_format normal
+ V/Adjust ( 6508): device_manufacturer samsung
+ V/Adjust ( 6508): session_count 1
+ V/Adjust ( 6508): device_type phone
+ V/Adjust ( 6508): screen_size normal
+ V/Adjust ( 6508): package_name org.mozilla.firefox
+ V/Adjust ( 6508): app_version 39.0a1
+ V/Adjust ( 6508): android_uuid <guid>
+ V/Adjust ( 6508): display_width 720
+ V/Adjust ( 6508): country GB
+ V/Adjust ( 6508): os_version 18
+ V/Adjust ( 6508): needs_attribution_data 0
+ V/Adjust ( 6508): environment sandbox
+ V/Adjust ( 6508): device_name Galaxy Nexus
+ V/Adjust ( 6508): os_name android
+ V/Adjust ( 6508): tracking_enabled 1
+ V/Adjust ( 6508): created_at 2015-03-24T17:53:38.452Z-0400
+ V/Adjust ( 6508): app_token <private>
+ V/Adjust ( 6508): screen_density high
+ V/Adjust ( 6508): language en
+ V/Adjust ( 6508): display_height 1184
+ V/Adjust ( 6508): gps_adid <guid>
+
+ V/Adjust ( 6508): Parameters:
+ V/Adjust ( 6508): needs_attribution_data 0
+ V/Adjust ( 6508): app_token <private>
+ V/Adjust ( 6508): environment production
+ V/Adjust ( 6508): android_uuid <guid>
+ V/Adjust ( 6508): tracking_enabled 1
+ V/Adjust ( 6508): gps_adid <guid>
+
+The available parameters (including ones not exposed to Mozilla) are documented at
+https://partners.adjust.com/placeholders/.
+
+Notes on what data is collected
+-------------------------------
+
+The *android_uuid* uniquely identifies the device.
+
+The *gps_adid* is a Google Advertising ID. It is capable of uniquely identifying a device to any
+advertiser, across all applications. If a Google Advertising ID is not available, Adjust may fall
+back to an Android ID, or, as a last resort, the device's WiFi MAC address.
+
+The *tracking_enabled* flag is only used to allow or disallow contextual advertising to be sent to a
+user. It can be, and is, ignored for general install tracking of the type Mozilla is using the
+Adjust SDK for. (This flag might be used by consumers using the Adjust SDK to provide in-App
+advertising.)
+
+It is not clear how much entropy their is in the set of per-device parameters that do not
+*explicitly* uniquely identify the device. That is, it is not known if the device parameters are
+likely to uniquely fingerprint the device, in the way that user agent capabilities are likely to
+uniquely fingerprint the user.
+
+Technical notes
+~~~~~~~~~~~~~~~
+
+Build flags controlling the Adjust SDK integration
+==================================================
+
+Add the following to your mozconfig to compile with the Adjust SDK::
+
+ export MOZ_INSTALL_TRACKING=1
+ export MOZ_NATIVE_DEVICES=1
+ export RELEASE_OR_BETA=1
+ ac_add_options --with-adjust-sdk-keyfile="$topsrcdir/mobile/android/base/adjust-sdk-sandbox.token"
+
+``MOZ_NATIVE_DEVICES`` && ``RELEASE_OR_BETA`` are required for an unknown
+reason. If you build without them, the ``StubAdjustHelper`` will be
+returned.
+
+No trace of the Adjust SDK should be present in Fennec if
+``MOZ_INSTALL_TRACKING`` is not defined.
+
+Access to the Adjust backend is controlled by a private App-specific
+token. Fennec's token is managed by Release Engineering and should not
+be exposed if at all possible; for example, it should *not* leak to build
+logs. The value of the token is read from the file specified using the
+``configure`` flag ``--with-adjust-sdk-keyfile=KEYFILE`` and stored in
+the build variable ``MOZ_ADJUST_SDK_KEY``. The mozconfig specified above
+defaults to submitting data to a special Adjust sandbox allowing a
+developer to test Adjust without submitting false data to our backend.
+
+We throw an assertion if ``MOZ_INSTALL_TRACKING`` is specified but
+``--with-adjust-sdk-keyfile`` is not to ensure our builders have a proper
+adjust token for release and beta builds. It's great to catch some
+errors at compile-time rather than in release. That being said, ideally
+we'd specify a default ``--with-adjust-sdk-keyfile`` for developer builds
+but I don't know how to do that.
+
+Technical notes on the Adjust SDK integration
+=============================================
+
+The *Adjust install tracking SDK* is a pure-Java library that is conditionally compiled into Fennec.
+It's not trivial to integrate such conditional feature libraries into Fennec without pre-processing.
+To minimize such pre-processing, we define a trivial ``AdjustHelperInterface`` and define two
+implementations: the real ``AdjustHelper``, which requires the Adjust SDK, and a no-op
+``StubAdjustHelper``, which has no additional requirements. We use the existing pre-processed
+``AppConstants.java.in`` to switch, at build-time, between the two implementations.
+
+Notes and links
+===============
+
+.. _adjust GmbH: http://www.adjust.com
+.. _github repository: https://github.com/adjust/android_sdk
+.. [#official] Data is not sent for builds not produced by Mozilla: this would include
+ redistributors such as the Palemoon project.
+.. [#channel] Data is not sent for Aurora, Nightly, or custom builds.
+.. [#started] *Started* means more than just when the user taps the Fennec icon or otherwise causes
+ the Fennec user interface to appear directly. It includes, for example, when a Fennec service
+ (like the Update Service, or Background Sync), starts and Fennec was not previously running on the
+ device. See http://developer.android.com/reference/android/app/Application.html#onCreate%28%29
+ for details.
+.. _INSTALL_REFERRER Intent: https://developer.android.com/reference/com/google/android/gms/tagmanager/InstallReferrerReceiver.html