releases.shpreview
LaunchDarkly/Android SDK

Android SDK

$npx -y @buildinternet/releases show launchdarkly-android-sdk
Mon
Wed
Fri
AprMayJunJulAugSepOctNovDecJanFebMarApr
Less
More
Releases1Avg0/wkVersionsv5.11.0
Sep 28, 2022

[3.2.1] - 2022-09-28

Fixed:

  • The SDK now detects and cancels any repeating polling task that might have been left over from a previous run of the application. The potential problem was that if an application crashed or otherwise did not shut down cleanly, an "alarm" notification used by the SDK for polling could continue to exist, causing the application to be started again and to keep polling for LaunchDarkly flag data, even though the user intended to shut down the application. With this fix, such an unintended restart could still happen once, but the SDK will detect this condition and stop the notification from continuing to fire. In the future the SDK may be changed more broadly to stop using the AlarmManager API so that such restarts cannot happen at all, but this fix mitigates the problem in the meantime. (#188)
Aug 23, 2022

[3.2.0] - 2022-08-23

The purpose of this release is to introduce a new logging facade, com.launchdarkly.logging, to streamline how logging works in LaunchDarkly Java and Android code.

Previously, the Android SDK always used Timber for logging. This sometimes led to conflicts with an application's separate use of Timber, as described in #88 and #147.

In this release, the default behavior is still to use Timber, but the logging facade can also be configured programmatically to do simple Android logging without Timber, or to forward output to another framework such as java.util.logging, or to multiple destinations, or to capture output in memory. In a future major version release, the default behavior may be changed so that the SDK does not require Timber as a dependency.

Added:

  • In LDConfig.Builder, the new methods logAdapter, logLevel, and loggerName, for the new logging capabilities mentioned above.
  • New class LDTimberLogging for configuring the SDK's Timber integration.
  • New class LDAndroidLogging for configuring the SDK to use the Android logging API without Timber.

[3.1.8] - 2022-08-23

Changed:

  • Changed throttling/jitter logic that used java.util.Random to use java.security.SecureRandom. Even though in this case it is not being used for any cryptographic purpose, but only to produce a pseudo-random delay, static analysis tools may still report every use of java.util.Random as a security risk by default. The purpose of this change is simply to avoid such warnings; it has no practical effect on the behavior of the SDK.

Fixed:

  • The map of existing LDClient instances was not being cleared after calling close(). (#108)
  • Fixed a bug that caused an ExecutorService object to be unnecessarily created when flush() was called.
  • The SDK did not correctly persist versioning information when a flag was deleted or archived. In an edge case where flag updates are received out of order, this could cause a deleted flag to appear to be undeleted.
  • Setting baseUri or streamUri to a URI with a trailing slash could cause requests to fail. Now the SDK works correctly regardless of whether these URIs have a trailing slash or not.
  • The SDK was including "anonymous": false in analytics event data for users where the anonymous property had not been set at all. In the current user model, "anonymous": false is subtly different from not setting the property (flag rules referencing anonymous will only work if it is explicitly set), so the event data should accurately represent this by omitting the property if it was omitted.
  • Fixed a bug that could cause a NullPointerException when calling variation methods, in an edge case where the SDK received inconsistent data of a kind that the LaunchDarkly services would not normally send (an evaluation result with a value but no variation). This should not be possible in practice, but could happen in test scenarios.
Aug 17, 2022

[3.1.7] - 2022-08-17

Fixed:

  • All Timber logs now use a consistent tag LaunchDarklySdk. (Thanks, audkar!)
Aug 1, 2022

[3.1.6] - 2022-08-01

Added:

  • CI builds now include the SDK test harness, a standardized contract test suite that validates the SDK's behavior against simulated LaunchDarkly endpoints.

Fixed:

  • Deadlock between Throttler and ConnectivityManager. (Thanks, res0nance!)
  • Remove object-level locking in LDClient that caused synchronous init()s to unnecessarily block other methods, resulting in ANRs.
May 5, 2022

[3.1.5] - 2022-05-05

Fixed

  • Prevent NullPointerException when event buffer is full and diagnosticOptOut is true. (Thanks, mattyway!)
Mar 23, 2022

[3.1.4] - 2022-03-23

Fixed

  • Removed Android Appcompat dependency.
  • Bump version of okhttp from 4.9.1 to 4.9.2.
  • Prevent multiple allocations of the DiagnosticEventProcessor.
  • Removed application android:label attribute from the SDK's manifest. (Thanks, Exaper!)
Feb 24, 2022

[3.1.3] - 2022-02-24

Fixed

  • Add explicit proguard directives for keeping BroadcastReceivers
  • Bump version of git-publish gradle plugin from 3.0.0 to 3.0.1.
Dec 17, 2021

[3.1.2] - 2021-12-17

Fixed

  • Bump version of gson dependency from 2.8.6 to 2.8.9.
Sep 3, 2021

[3.1.1] - 2021-09-03

Fixed

  • Removed the android:allowBackup tag from the SDK's AndroidManifest.xml file to avoid requiring applications to explicitly replace the tag if given a different value. (#138)
  • Changed the SDK's network detection check to consider network transport over a VPN as a connected state. This fixes an issue where the SDK would prevent network requests on a VPN due to considering the network to be unavailable. (Thanks, lguipeng!)
Aug 6, 2021

[3.1.0] - 2021-08-06

Added

  • The SDK now supports the ability to control the proportion of traffic allocation to an experiment. This works in conjunction with a new platform feature now available to early access customers.
Jul 19, 2021

[3.0.2] - 2021-07-16

Fixed

  • Catch SecurityException when thrown on call to getNetworkCapabilities used to detect current network availability. (#129)
  • Explicitly flag PendingIntents as FLAG_IMMUTABLE on Android SDK versions that support doing so. Explicitly specifying mutability is required when targeting Android S+. (#133)
Jun 25, 2021

[3.0.1] - 2021-06-25

Fixed

  • The Android manifest has been updated to explicitly specify the android:exported attribute on declared receiver elements. This is to meet new requirements in the upcoming Android 12 release.
  • Increased the compile-time dependency on jackson-databind to 2.10.5.1, due to CVE-2020-25649.
  • Update the dependency on the shared launchdarkly/java-sdk-common to 1.1.2 to prevent Jackson from showing up as a transitive dependency in tools that inspect module metadata.
Jun 2, 2021

[2.14.2] - 2021-06-02

Fixed

  • Added check to prevent NullPointerException in DiagnosticEventProcessor.stopScheduler when LDClient.close is called before the application is foregrounded when the SDK was initialized in the background. (#127)
  • Log message warning that JSON flag was requested as a String has been updated to include the key of the flag requested to assist in discovering which flag is being requested with an unexpected type. (#116)
May 8, 2021

[3.0.0] - 2021-05-07

This major version has an accompanying Migration Guide. Please see the guide for more information on updating to this version of the SDK, as the following is just a summary of the changes.

Usages of Gson provided types have been removed from the public API, replacing JsonElement with LDValue provided by the SDK. LDValue can represent the same values as a JsonElement, but has a diferent API. See the API documentation for a detailed reference.

Added

  • LDConfig.Builder customization:
    • The autoAliasingOptOut configuration option that is used to control the new automatic aliasing behavior of the identify method; by setting autoAliasingOptOut to true, identify will not automatically generate alias events.
    • The headerTransform configuration option that supersedes the previous additionalHeaders configuration option by allowing fully dynamic updating of headers for requests the SDK makes to the LaunchDarkly service.
    • The privateAttributes configuration option that replaces setPrivateAttributeNames, specifying the private attributes as vararg UserAttribute arguments rather than a Set<String>. This allows easily specifying built-in attributes.
  • LDUser(String) constructor that creates a fully default user.
  • New accessors for LDUser
    • getAttribute(UserAttribute) for programmatically retrieving attribute values.
    • getCustomAttributes() for retrieving the currently set custom attributes.
    • getPrivateAttributes() for retrieving the attributes set to be private on this user.
    • isAttributePrivate(UserAttribute) for checking if a given attribute is private.
    • Getters for all built-in attributes, e.g. getName()
  • New LDUser.Builder methods overloads for custom and privateCustom:
    • custom(String, boolean) and privateCustom(String, boolean) for setting custom attributes to boolean values.
    • custom(String, int), privateCustom(String, int), custom(String, double), and privateCustom(String, double) for setting custom attributes to numeric values.
    • custom(String, LDValue) and privateCustom(String, LDValue) for setting custom attributes to arbitrary data.
  • The UserAttribute class, which provides a less error-prone way to refer to user attribute names in configuration. This class can also be used to get arbitrary attribute
  • LDClient functionality:
    • The alias method that is used to associate two user objects for analytics purposes with an alias event.
    • jsonValueVariation and jsonValueVariationDetail. These are equivalent to the removed jsonVariation and jsonVariationDetail other than using LDValue instead of JsonElement.
    • trackData(String, LDValue) which replaces track(String, JsonElement). Other than changing to use LDValue the behavior is the same.
    • trackMetric(String, LDValue, double) which replaces track(String, JsonElement, Double). This also uses LDValue rather than JsonElement, and requires a metric value. Otherwise use trackData.
  • The LDGson and LDJackson classes, which allow SDK classes like LDUser to be easily converted to or from JSON using the popular Gson and Jackson frameworks.
  • EvaluationDetail.fromValue and EvaluationDetail.error factory methods.
  • LDHeaderUpdater interface for the new headerTransform configuration option.

Fixed

  • Fixed an issue where the SDK could log error level messages when attempting to send diagnostic events without an internet connection. The SDK will no longer attempt to send diagnostic events when an internet connection is known to be unavailable, and will not log an error level message if the connection fails. Thanks to @valeriyo for reporting (#107).
  • Fixed an issue where LDUser instances created before calling LDClient.init without specifying a key would have the key UNKNOWN_ANDROID rather than a device unique key.
  • Fixed an issue where flags listeners would be informed of changes to unchanged flags whenever the SDK receives an entire flag set (on a new stream connection, a poll request, or any stream updates behind a relay proxy).
  • Fixed an issue where a NullPointerException is thrown if LDClient.close() is called multiple times.
  • Improved the proguard/R8 configuration to allow more optimization. Thanks to @valeriyo for requesting (#106)
  • Fixed a potential issue where the SDK could cause additional throttling on requests to the backend service when previously throttled requests had been cancelled before completion.

Changed (requirements/dependencies/build)

  • Migrated from using the Android Support Libraries to using AndroidX from Jetpack. Using AndroidX requires the android.useAndroidX Android Gradle plugin flag to be set to true in your application's gradle.properties file. If your application previously set the android.enableJetifier Android Gradle plugin flag to true in it's gradle.properties file soley for the LaunchDarkly SDK, this flag can now be removed. Thanks to everyone who requested this enhancement (#103).
  • The minimum Android API version has been raised from API level 16 (Android 4.1 Jelly Bean) to API level 21 (Android 5.0 Lollipop).
  • The SDK no longer has a dependency on Google Play Services. This dependency was only used on pre-21 Android API levels to improve TLS 1.2 compatibility, as the minimum Android version has been raised to 21, the dependency is no longer necessary.
  • The SDK is now built with modern Gradle (6.7, Android plugin 4.1.3) and uses Java 8.

Changed (API)

  • Package names have changed: the main SDK classes are now in com.launchdarkly.sdk and com.launchdarkly.sdk.android.
  • All LDConfig.Builder setters have been renamed to remove the set prefix, e.g. LDConfig.Builder.setMobileKey has been renamed to LDConfig.Builder.mobileKey.
  • LDClient API changes:
    • boolVariation and intVariation no longer use nullable object types for argument and return values, instead using primitive types, e.g. Boolean boolVariation(String, Boolean) became boolean boolVariation(String, boolean).
    • boolVariationDetail and intVariationDetail no longer use nullable object types for argument values, instead using primitive types, e.g. boolVariationDetail(String, Boolean) became boolVariationDetail(String, boolean).
    • floatVariation and floatVariationDetail have been changed to have the same behavior as the removed doubleVariation and doubleVariationDetail.
    • allFlags() now returns Map<String, LDValue> rather than Map<String, ?>. Rather than the returned Map containing Boolean, Float, and String typed objects, with JSON values represented as strings, the Map contains LDValue typed objects which return the source type (including complex types such as JSON arrays and objects).
  • EvaluationDetail.getVariationIndex() now returns int instead of Integer. No variation index is now represented as the constant EvaluationReason.NO_VARIATION.
  • EvaluationReason is now a single concrete class rather than an abstract base class. Usages of the sub-classes can be replaced with the base class.

Changed (behavioral)

  • The default polling domain (configurable with LDConfig.Builder.pollUri) has changed from app.launchdarkly.com to clientsdk.launchdarkly.com.
  • The default eventsUri used to send events to the service has changed from https://mobile.launchdarkly.com/mobile to https://mobile.launchdarkly.com. The SDK will now append the expected endpoint path (/mobile) to the configured Uri, which is more consistent with other LaunchDarkly SDKs.
  • For compatibility with older SDK behavior, the LDClient.stringVariation method could be used to retrieve JSON flags in a serialized representation. This compatibility behavior has been removed, and attempts to request a JSON valued flag using stringVariation will behave the same as other mismatched type variation calls.
  • The LDClient.identify method will now automatically generate an alias event when switching from an anonymous to a known user. This event associates the two users for analytics purposes as they most likely represent a single person. This behavior can be disabled with the autoAliasingOptOut configuration option.
  • All log messages are now tagged LaunchDarklySdk for easier filtering. Thanks to @valeriyo for the suggestion (#113).
  • LDUser now overrides equals, hashCode, and toString with appropriate implementations.
  • LDUser.Builder.country(String) and LDUser.Builder.privateCountry(String) no longer attempt to look up the country from the provided String (attempting to match it as an ISO-3166-1 alpha-2, alpha-3 code; or a country name) and set the country to the resultant IOS-3166-1 alpha-2 only if successful. The SDK no longer gives this attribute special behavior, and sets the user's country attribute directly as the provided String.

Removed

  • LDConfig.Builder:
    • setBaseUri(Uri) has been removed. Please use setPollUri(Uri) instead.
    • setAdditionalHeaders(Map<String,String>) has been removed. Please use headerTransform(LDHeaderUpdater) instead.
    • setPrivateAttributeNames(Set<String>) has been removed. Please use privateAttributes(UserAttribute...) instead.
  • LDUser.Builder:
    • country(LDCountryCode) and privateCountry(LDCountryCode) have been removed. Use country(String) or privateCountry(String) to set the country value on a user.
    • custom(String, Number) and privateCustom(String, Number) have been removed. Use the (String, int) or (String, double) overloads instead.
    • custom(String, Boolean) and privateCustom(String, Boolean) have been removed. Use custom(String, boolean) or privateCustom(String, boolean) instead.
    • custom(String, List<String>), LDUser.customString(String, List<String>), LDUser.privateCustomString(String, List<String>). Use custom(String, LDValue) and privateCustom(String, LDValue) instead.
    • customNumber(String, List<Number>) and LDUser.privateCustomNumber(String, List<Number>). Use custom(String, LDValue) and privateCustom(String, LDValue) instead.
  • LDClient:
    • doubleVariation and doubleVariationDetail have been removed. Use floatVariation and floatVariationDetail instead.
    • jsonVariation and jsonVariationDetail have been removed. Use jsonValueVariation and jsonValueVariationDetail instead.
    • track(String, JsonElement) and track(String, JsonElement, Double) overloads have been removed, please use the designated methods trackData(String, LDValue) and trackMetric(String, LDValue, double) instead.
  • The public constructor for EvaluationDetail has been hidden. Use the new factory methods EvaluationDetail.fromValue and EvaluationDetail.error instead.
  • The concrete sub-classes of EvaluationReason have been removed in favor of making EvaluationReason a concrete class. The accessors on the sub-classes have been moved to the base class. Instead of using instanceOf to determine the type, use getKind().
  • LDCountryCode has been removed as no SDK APIs use this class.
  • All classes and interfaces in the com.launchdarkly.sdk.android.flagstore, com.launchdarkly.sdk.android.gson, com.launchdarkly.sdk.android.response, and com.launchdarkly.sdk.android.tls packages. These classes and interfaces were not intended for external use.
  • Debounce, FeatureFlagFetcher, SummaryEventSharedPreferences, UserSummaryEventSharedPreferences, and Util in com.launchdarkly.sdk.android. These deprecated classes and interfaces were not intended for external use.
Jan 14, 2021

[2.14.1] - 2021-01-14

Fixed

  • Before this release, the SDK could cause an uncaught exception on certain Android implementations, when scheduling a future poll request under certain situations. This fix extends a previous fix implemented in the 2.9.1 release of the SDK, which catches SecurityExceptions thrown by the alarm manager when registering an alarm for the next poll. This SecurityException was introduced by Samsung on their Lollipop and later Android implementions, and is thrown when the application has at least 500 existing alarms when registering a new alarm. After recent reports of the alarm manager throwing an IllegalStateException rather than a SecurityException under the same conditions but different Android implementations, this release broadens the exception handling when scheduling a poll request to safeguard against other exception types.
Dec 18, 2020

[2.14.0] - 2020-12-17

Added

  • Added LDConfig.Builder.setPollUri configuration setter that is equivalent to the now deprecated setBaseUri.
  • Added LDConfig.getPollUri configuration getter that is equivalent to the now deprecated getPollUri.
  • Added LDClient.doubleVariation for getting floating point flag values as a double. This is preferred over the now deprecated floatVariation.

Fixed

  • Improved event summarization logic to avoid potential runtime exceptions. Thanks to @yzheng988 for reporting (#105).
  • Internal throttling logic would sometimes delay new poll or stream connections even when there were no recent connections. This caused switching active user contexts using identify to sometimes delay retrieving the most recent flags, and therefore delay the completion of the returned Future.

Changed

  • The maximum delay the internal throttling logic could delay a flag request has been reduced to 60 seconds.

Deprecated

  • Deprecated LDConfig.Builder.setBaseUri and LDConfig.getBaseUri, please use setPollUri and getPollUri instead.
  • Deprecated LDClient.floatVariation, please use doubleVariation for evaluating flags with floating point values.
Aug 7, 2020

[2.13.0] - 2020-08-07

Added

  • Allow specifying additional headers to be included on HTTP requests to LaunchDarkly services using LDConfig.Builder.setAdditionalHeaders. This feature is to enable certain proxy configurations, and is not needed for normal use.
May 29, 2020

[2.12.0] - 2020-05-29

Added

  • Added a new configuration option, maxCachedUsers to LDConfig. This option allows configuration of the limit to how many users have their flag values cached locally in the device's SharedPreferences.

Fixed

  • Fixed a NPE that could occur when calling a variation methods with a flag key that does not exist locally or is of the wrong type. This issue could only occur if a null fallback value was provided.
  • Previously, the SDK manifest required the SET_ALARM permission. This permission was never used, so it has been removed.

Changed

  • For polling requests, the SDK uses OkHttp with a cache configured. Previously the cache directory was set to the main application cache directory. This has been changed to a subdirectory of the application cached directory.

Deprecated

  • Packages that contained only deprecated classes. flagstore, flagstore.sharedprefs, gson, response, and tls.
Feb 28, 2020

[2.11.0] - 2020-02-28

Added

  • The SDK now periodically sends diagnostic data to LaunchDarkly, describing the version and configuration of the SDK, the Android API SDK version number, and performance statistics. No credentials, Android device IDs, or other identifiable values are included. This behavior can be disabled with LDConfig.Builder.setDiagnosticOptOut(boolean) or configured with LDConfig.Builder.setDiagnosticRecordingInterval(int).
  • New LDConfig.Builder field setters setWrapperName(String) and setWrapperVersion(String). These allow a library wrapping the SDK (for example, the React Native SDK) to identify itself for usage data.

Fixed

  • Fixed an issue where in some cases the future associated with an init or identify call would never complete if the network status or foreground state changed before the future had completed. Also improved test coverage of this behavior.

Deprecated

  • UserSummaryEventSharedPreferences, SummaryEventSharedPreferences, FeatureFlagFetcher, Util, and Debounce. These classes were only intended for internal SDK use, and will be removed in the next major release to reduce the number of exposed classes.
Latest
5.11.1
Tracking Since
Sep 29, 2016
Last fetched Apr 18, 2026