Skip to content

feat(experimental): Android Client SDK FDv2 EAP#369

Draft
tanderson-ld wants to merge 4 commits into
mainfrom
sdk-2429-android-fdv2-eap
Draft

feat(experimental): Android Client SDK FDv2 EAP#369
tanderson-ld wants to merge 4 commits into
mainfrom
sdk-2429-android-fdv2-eap

Conversation

@tanderson-ld
Copy link
Copy Markdown
Contributor

@tanderson-ld tanderson-ld commented Jun 4, 2026

Summary

Umbrella PR for the Android Client SDK FDv2 Early Access Program release. Tracks SDK-2429.

What lands when this PR merges

Three sub-task PRs are already on the umbrella branch and would land together:

Additional commits expected before merge (one per pending code sub-task above).

Pre-merge checklist

  • Rebase or merge onto current main (umbrella branch is currently behind main by 5.12.2 release + a few fixes).
  • Land remaining code sub-tasks: SDK-2439, SDK-2444.
  • Confirm the introduced version in .sdk_metadata.json matches the actual EAP minor at release time.
  • Update fdv2-eap-release-notes.md placeholders (or hand-paste content into the release-please-generated notes) at cut time.
  • Confirm docs PR (SDK-2446) is open against launchdarkly/ld-docs-private and ready to merge alongside this release.
  • Confirm hello-android PR (SDK-2445) is open and ready to merge alongside.
  • CI green on this branch.

## Summary
- Adds `"fdv2": { "introduced": "5.13" }` to `.sdk_metadata.json` so
downstream sdk-meta tooling lists the Android Client SDK as
FDv2-capable.
- Inserted alphabetically between `experimentation` and `flagChanges`.

Mirrors the cross-SDK convention used by Python (#375 / metadata in
9.13), .NET (#221 / metadata in 8.11), Java (#120 / metadata in 7.11),
Go (#342), Node (#1066).

Tracking:
[SDK-2443](https://launchdarkly.atlassian.net/browse/SDK-2443).

## Test plan
- [x] JSON file parses (validated by the diff being a clean one-line
add).
- [ ] CI passes on this branch.

## Note on the version pin
The `introduced` version assumes the EAP ships as `5.13`. If the
umbrella branch advances past that minor before EAP cut, update this
value to match the actual release version before merging
`sdk-2429-android-fdv2-eap`.

[SDK-2443]:
https://launchdarkly.atlassian.net/browse/SDK-2443?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Metadata-only JSON change with no effect on SDK runtime behavior.
> 
> **Overview**
> Registers **FDv2** as a supported Android Client SDK feature in
`.sdk_metadata.json`, with `"introduced": "5.13"`, so sdk-meta and
related tooling can treat this SDK as FDv2-capable (aligned with other
LaunchDarkly client SDKs).
> 
> The new entry is placed alphabetically in the `features` map between
`experimentation` and `flagChanges`. No runtime or SDK code changes in
this PR.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e1dd7d1. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…#367)

## Summary
- Uncomments the v3 contract-test invocation in the Makefile and pins it
to sdk-test-harness `v3.1.0-alpha.6` — the first published alpha that
includes [sdk-test-harness PR
#325](launchdarkly/sdk-test-harness#325)
("updates so FDv2 tests can run against client side sdks").
- Moves the `-stop-service-at-end` flag from the v2 invocation to the v3
invocation (v3 is now the final harness run).
- Deletes the obsolete "Uncomment this..." instruction block.

Targets the `sdk-2429-android-fdv2-eap` umbrella branch.

Tracking:
[SDK-2442](https://launchdarkly.atlassian.net/browse/SDK-2442).

## Test plan
- [x] `make build-contract-tests` succeeds.
- [x] `make start-contract-test-service` installs and starts the APK on
the emulator.
- [x] `make run-contract-tests` runs both harnesses cleanly:
  - v2 (FDv1): 798 total, 14 skipped, 784 ran — all passed.
- v3 (FDv2, `v3.1.0-alpha.6`): 784 total, 21 skipped, 763 ran — all
passed.
- [x] Test service stops cleanly after v3 completes.
- [ ] CI passes on this branch.

[SDK-2442]:
https://launchdarkly.atlassian.net/browse/SDK-2442?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Makefile-only CI/contract-test wiring with no production SDK or
runtime behavior changes.
> 
> **Overview**
> **`make run-contract-tests` now runs both harnesses in sequence:** v2
(FDv1) unchanged except **`-stop-service-at-end` is removed**, then a
new **v3** step pinned to **`sdk-test-harness/v3.1.0-alpha.6`** with
**`SUPPRESSION_FILE_FDV2`**, **`TEST_HARNESS_PARAMS_V3`**, and
**`-stop-service-at-end`** so the contract test service stops after the
final run.
> 
> The old commented-out v3 block and “uncomment when ready” note are
deleted; the Makefile comment still documents that only the last harness
should pass **`-stop-service-at-end`**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
54f04b5. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#361)

- Make Components.dataSystem() and LDConfig.Builder.dataSystem() public
again so customer code can opt in to FDv2 for the EAP. PR #351 had
hidden these while the surface was being finalized.
- Add package-private no-arg constructors to InitializerEntry and
SynchronizerEntry so external code cannot subclass them; the SDK's
concrete entry types in the same package continue to compile.
- Remove InternalDataSystemAccess (a pure pass-through wrapper) and
switch contract-tests SdkClientEntity to call the now-public
Components.dataSystem() / LDConfig.Builder.dataSystem() directly.

SDK-2438

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Expands the public API for an unstable EAP data path (FDv2 vs legacy
dataSource), but runtime wiring is unchanged aside from visibility and
contract-test call sites.
> 
> **Overview**
> Re-opens the **early-access FDv2 data system** configuration surface
for customer opt-in by making **`Components.dataSystem()`** and
**`LDConfig.Builder.dataSystem()`** **public** again (reversing the
package-private hiding from PR #351).
> 
> **`InternalDataSystemAccess`** is **removed** as a pass-through;
contract-tests now call the public **`Components.dataSystem()`** /
**`builder.dataSystem(...)`** APIs directly.
> 
> **`InitializerEntry`** and **`SynchronizerEntry`** gain
**package-private no-arg constructors** so code outside the SDK cannot
subclass those abstract bases; in-package concrete entry types (e.g.
polling/streaming entries) are unchanged.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
24eb4c0. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant