Skip to content

fix(skills): Android and KMP platform file audit findings - #67

Open
skydoves wants to merge 5 commits into
fix/compile-deprecated-apisfrom
fix/android-kmp-audit
Open

skydoves wants to merge 5 commits into
fix/compile-deprecated-apisfrom
fix/android-kmp-audit

Conversation

@skydoves

@skydoves skydoves commented Oct 1, 2026 •

Copy link
Copy Markdown
Member

Stacked on #66.

Description

  • Log checks that can pass on Android and KMP ([Purchases] tag, real configure lines)
  • Play test purchases need a license tester who opted in to an internal or closed track; sideloaded builds work after that, and other accounts cannot buy or pay real money on any track
  • Current Play Console menu paths
  • minSdk 23, or 24 with purchases-ui and purchases-kmp-ui, plus current version floors
  • Test Store dialog labels on every platform
  • purchases-kmp 3.x setup: plain versions, no PurchasesHybridCommon pods, no Context overload, the Amazon module, docs links that list purchases-kmp-ui

Note

Low Risk
Markdown-only updates to integration skills; no application or SDK code changes.

Overview
This PR refreshes RevenueCat agent skills (Android, KMP, testing, troubleshoot, migrate, paywall, Customer Center) after a platform audit—documentation only, no runtime code.

Android & verification: Docs now require minSdk 23 (24 with purchases-ui / Customer Center), point migration at purchases-android 10.x and Play Billing 8, and replace misleading configure checks with adb logcat | grep "\[Purchases\]" and SDK Version / Package name debug lines (including notes on custom logHandler).

Google Play testing: Guidance is rewritten so sandbox purchases need a license tester who opted in to an internal/closed track; sideloaded/debug builds can work after opt-in; non-testers may be charged on testing tracks. Play Console paths and propagation timing are updated, and the mistaken “internal testing won’t work” checklist item is removed.

KMP 3.x: Install/configure docs drop the wrapper+deps version format, document plain 3.10+ versions, Kotlin 2.3.20+, no manual iOS pods / PurchasesHybridCommon, API-key-only PurchasesConfiguration with AndroidX App Startup, Amazon module pinning, and updated official doc links.

Cross-platform: Test Store UI labels are Test valid purchase / Test failed purchase everywhere; Android Test Store failure documents TestStoreSimulatedPurchaseError; Customer Center notes cite purchases-ui 8.12.0 / 8.13.0 minimums.

Reviewed by Cursor Bugbot for commit 206bf8f. Bugbot is set up for automated code reviews on this repo. Configure here.

The verify steps told agents to filter logcat with `adb logcat -s Purchases`
and wait for "😻‍👼 Purchases is configured". purchases-android logs under the
tag "[Purchases] - <LEVEL>", so the exact-tag filter matches nothing, and that
banner string does not exist in the SDK. The check could never pass, and
troubleshoot then blamed the manifest for a failure the filter caused.

The steps now grep for "[Purchases]" and look for the real configure lines
("SDK Version - ...", "Package name - ..."), which the SDK prints at debug
level from PurchasesFactory. An empty result still only usually means
configure never ran, because a custom Purchases.logHandler also hides the
lines.

The KMP files expected the same banner, on iOS too, and purchases-ios does not
log it either. purchases-kmp keeps the native log handlers, so every KMP check
now looks for the "SDK Version - ..." line both SDKs print at debug level
during configure, and troubleshoot states it instead of deferring to the
native files. The line shows the native SDK's version, not the purchases-kmp
version.

Source: purchases-android common/logUtils.kt, ConfigureStrings.kt,
PurchasesFactory.kt; purchases-ios ConfigureStrings.swift, Purchases.swift;
purchases-kmp Purchases.apple.kt
The testing and troubleshooting skills said a sideloaded debug build cannot
buy even for license testers, and in one place that internal testing won't
work. Google's billing test guide says license testers bypass the check that
blocks apps not uploaded to Google Play, so sideloaded debug builds with debug
signatures can buy, and internal testing is a regular test track. RevenueCat's
sandbox guide adds that products do not load until the tester opens the
track's opt-in link, and that a debug build fails for a license tester who
has not opted in.

So every sandbox path now asks for a license tester who has opted in to an
internal or closed testing track, and only then allows sideloaded builds.
Flutter and React Native files carried the same claims and change with it.

Accounts that are not license testers either cannot buy or pay real money on
any track, internal testing included: Google says testers pay unless they are
license testers, and RevenueCat's test matrix shows a real charge for a
sideloaded debug build. The skills now say that instead of promising that
development never charges real money or that only closed and open tracks
charge. Play Console paths follow Google's current help pages (Settings >
License testing, Test and release > Testing), and the signing check names the
Play app signing page rather than a menu path. The React Native track build
uses the production EAS profile, because the default preview profile builds
an APK for internal distribution. Google's few-hours availability delay is
stated.

Source: https://developer.android.com/google/play/billing/test,
https://support.google.com/googleplay/android-developer/answer/6062777,
https://support.google.com/googleplay/android-developer/answer/9845334,
https://support.google.com/googleplay/android-developer/answer/9842756,
https://www.revenuecat.com/docs/test-and-launch/sandbox/google-play-store,
https://docs.expo.dev/build/internal-distribution/
integrate said minSdk 21. purchases-android requires API 23 since 10.0.0, and
purchases-ui requires 24, so an app following the skill fails the manifest
merge, and the 21 floor contradicted the minSdk 24 advice in troubleshoot.
migrate pointed at "a recent 8.x" while the current major is 10.x, and
customer-center said "8.x or newer" for APIs that arrived in 8.12.0
(CustomerCenter) and 8.13.0 (ShowCustomerCenter).

migrate also notes that 10.x brings Play Billing Library 8.3.0. The observer
mode path keeps the app's own billing code, which then has to compile against
Billing Library 8.

Source: purchases-android README requirements, gradle/libs.versions.toml,
ui/revenuecatui/build.gradle.kts, CHANGELOG.md (10.0.0)
The skills named the buttons "Successful Purchase" and "Failed Purchase". The
Test Store dialog shows "Test valid purchase", "Test failed purchase", and
"Cancel" on both Android and iOS, and on Android the failure surfaces as
TestStoreSimulatedPurchaseError. An agent asking a user to tap a button that
does not exist slows every test session, and the error code is what tests
should assert on. The shared SKILL.md and the iOS, Flutter, React Native, and
KMP files change together because the hybrids show the native dialogs.

Source: purchases-android SimulatedStoreBillingWrapper.kt,
purchases-ios Sources/Purchasing/SimulatedStore/SimulatedStorePurchaseUI.swift
The KMP files explained `2.10.2+17.55.1` style versions with a bundled
purchases-hybrid-common, told iOS users to wire the bridge pod or run
`pod deintegrate`, and told users to pin the native SDKs themselves. All of
that is 2.x behavior. Since 3.0.0, versions are plain (3.10.1 today), the iOS
SDK ships inside purchases-kmp so the PurchasesHybridCommon pods and packages
must be removed, and purchases-android comes in as a dependency. Current
releases need Kotlin 2.3.20+ and API 23, or 24 with purchases-kmp-ui, whose
Android artifact declares minSdk 24. 3.0 to 3.9 can log upgraded iOS users
out, so everyone should be on 3.10.0+.

The files also said the Android configuration needs a Context overload.
purchases-kmp has none: PurchasesConfiguration.Builder takes only the API key
and the Application comes from AndroidX App Startup, so the skill now says to
keep that provider in the manifest.

The pointers that sent readers to the purchases-kmp README, which covers
none of this, now go to pages that do: the Paywalls and Customer Center docs
list the purchases-kmp-ui coordinate, which the KMP installation page does
not, and the purchases-kmp API reference lists the ktx await functions.
troubleshoot also covers the Amazon module that 3.0.0 makes you add yourself,
and no longer assumes the Android module is called :app.

Source: purchases-kmp README, migrations/3.0.0-MIGRATION.md, CHANGELOG.md
(3.9.0 warning, 3.10.0 fix), gradle/libs.versions.toml (10.22.1), core and
revenuecatui klib API dumps, revenuecatui/build.gradle.kts, API reference
(com.revenuecat.purchases.kmp.ktx); RevenueCat docs for Kotlin Multiplatform
installation (ExperimentalForeignApi, isStatic), Paywalls installation, and
Customer Center for KMP
@skydoves
skydoves requested a review from a team as a code owner October 1, 2026 08:05
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.

2 participants