Skip to content

fix(playscan): close Android scanning gaps from review, and tag Revyl links for attribution - #21

Merged
ethanzhoucool merged 1 commit into
mainfrom
docs/revyl-cta-attribution
Jul 28, 2026
Merged

fix(playscan): close Android scanning gaps from review, and tag Revyl links for attribution#21
ethanzhoucool merged 1 commit into
mainfrom
docs/revyl-cta-attribution

Conversation

@ethanzhoucool

@ethanzhoucool ethanzhoucool commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Two things landed together here: the README attribution work stranded by #20's squash-merge, and fixes for a review of the Android support.

Android / playscan fixes

Five findings from a review of the Play support, all reproduced before fixing.

  • preflight could not inspect an Android artifact. --ipa existed, --apk / --aab did not. Both added, and preflight now runs the source and archive scans together since they see different things.
  • Artifact scans silently skipped the Gradle-backed checks. ScanArchive passes an empty GradleInfo, so Play Billing version, ads-SDK detection, and auth-SDK detection could not fire. Their absence read as a pass. The scan now reports the gap and names the three checks it skipped.
  • AABs false-passed native checks. Native code was only read from base/lib/, so a misaligned library in a feature module passed the 16 KB check. Every module is scanned now. Added the missing 64-bit parity rule: a 32-bit ABI without its 64-bit counterpart is CRITICAL, skipped on config splits (which legitimately carry one ABI).
  • Deadline logic ignored form factors. Play runs a separate target API schedule for Wear OS, TV, Automotive and XR, so those apps could get a CRITICAL that Play would not produce. They now get a WARN naming their own track. android:required="false" is honoured, so a phone app that also ships to TV keeps its CRITICAL.
  • preflight --verify hardcoded iOS. An Android-only project ran its flows against the wrong store and had its .apk rejected. Platform now follows the artifact extension, then the project layout.

Two bugs found in review of the first pass, plus one I found chasing my own doubt:

  • The form-factor fix was inert on the artifact path: applyElement had no uses-feature case, so compiled manifests never populated it.
  • frameworkAttrIDs had no entry for android:required, and aapt2 emits empty string-pool names for framework attrs, so the attribute was dropped on both compiled paths. 0x0101028e was read back from aapt2 dump xmltree on android-34, -35 and -36 rather than recalled, per the rule that table.
  • A failing archive scan discarded source findings that had already succeeded.

Verified end to end against real aapt2-linked APKs: a watch app at targetSdk 33 reports WARN naming Wear OS; a phone app declaring leanback required="false" still reports CRITICAL.

Every fix has a regression test, and each test was confirmed to fail with its fix reverted. Full suite, -race, vet, and gofmt all pass.

Known follow-ups, deliberately not in this PR: BundleConfig.pb PAGE_ALIGNMENT_16K, per-library (rather than per-ABI) 64-bit parity, and cutting a release so playscan actually ships — v0.1.0 predates it, so Homebrew and go install users still get an Apple-only binary.

README attribution

Every Revyl link was bare, so traffic off the repo arrived unattributed. All links now carry utm_medium=readme with a per-placement campaign, following the pattern #13 set for the CLI. Also reframes the runtime tier to lead with what it catches, adds a "Where a static scan stops" section, a badge row, and a one-month code on the last line. The "every check runs against the artifact" claim was wrong and is corrected to match the coverage-gap behaviour above.

Follow-up to #20, which merged before these landed.

Every Revyl link in the README was bare, so traffic off the repo arrived
unattributed. Now tagged with utm_medium=readme and a campaign per
placement (badge, intro, verify, static-ceiling, footer, easter-egg),
matching the pattern #13 set for the CLI signup link.

- Reframe the runtime tier. The intro led with "it needs an account and
  it is opt-in", which sells against it. It now leads with what verify
  catches and discloses the requirement after.
- Add "Where a static scan stops": the honest ceiling of text matching,
  with three flows that ship GREENLIT and get rejected anyway. Lands on
  verify --dry-run, which needs no account and works with the revyl CLI
  absent (tested with it off PATH).
- Two-minute setup block in the verify section, and a --verify CI example.
- Badge row and a footer with a real next action.
- One month of Revyl (ng32jDS9) as an easter egg on the last line.
@ethanzhoucool ethanzhoucool changed the title docs: tag Revyl links for attribution and add the runtime-tier CTA fix(playscan): close Android scanning gaps from review, and tag Revyl links for attribution Jul 28, 2026
@ethanzhoucool
ethanzhoucool merged commit d0b675f into main Jul 28, 2026
4 checks passed
@ethanzhoucool
ethanzhoucool deleted the docs/revyl-cta-attribution branch July 28, 2026 19:50
ethanzhoucool added a commit that referenced this pull request Jul 28, 2026
Adds --apk/--aab to preflight, scans AAB feature-module native code, adds the 64-bit ABI parity rule, reports the Gradle-only coverage gap on artifact scans, respects Play's per-form-factor target API schedules (honouring android:required), and makes preflight --verify follow the project platform instead of hardcoding iOS.

Also decodes uses-feature and android:required on the compiled-manifest paths, where they were silently dropped, and stops a failed archive scan from discarding source findings.

The code intended for #21, which merged with only its README commit.
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