Skip to content

v0.2.17

Choose a tag to compare

@GGULBAE GGULBAE released this 03 Jul 10:53

Status: published to npm as the 0.2.17 latest release, tagged as v0.2.17.

This release does not enable AVIF output. It advances the v0.2.16 Android MediaCodec image/avif prototype from route discovery to a real static-file smoke attempt that either proves a minimal AVIF cache file can be encoded and decoded back, or records the blocker that keeps production AVIF output disabled.

Goals

  • Attempt a repo-owned 16x12 Bitmap to AVIF cache-file encode on an API 34+ Android emulator or device.
  • Validate the generated file has an ftyp box with avif or avis compatible brand.
  • Decode the generated file with ImageDecoder and assert 16x12 output dimensions.
  • Record a clear blocker when no encoder is exposed, the codec route fails, muxing fails, the signature is invalid, or decode-back fails.
  • Keep AVIF output capability reporting unchanged until a production path is intentionally implemented.
  • Align README, release notes, Android verification doctor checks, Vitest expectations, JVM tests, and Android instrumentation with the smoke result contract.

Findings

  • Android platform supported-media documentation lists AVIF baseline image encoder and decoder support as mandatory beginning with Android 14, but the current production implementation still cannot use Bitmap.compress() for AVIF because Bitmap.CompressFormat has no AVIF enum.
  • The smoke route creates a 16x12 ARGB bitmap pattern, converts it into YUV420 input through MediaCodec.getInputImage(), queues it into an image/avif encoder, and collects encoder output bytes and muxable samples.
  • The smoke validates direct encoder bytes first, then attempts a MediaMuxer.MUXER_OUTPUT_HEIF container path and validates the muxed output.
  • A passing smoke requires both AVIF ftyp avif / avis signature bytes and ImageDecoder decode-back dimensions. Anything less remains a documented blocker, not a partial production feature.
  • Current GitHub Android Instrumentation on the API 35 Google APIs emulator reports attempted=false, success=false, and blocker No image/avif encoder was discovered through MediaCodecList.findEncoderForFormat().; that keeps AVIF output disabled.

Capability Reporting Decision

  • v0.2.17 keeps runtime capability reporting unchanged: Android AVIF input=true on Android 14+ and output=false; iOS AVIF input remains gated by CGImageSourceCopyTypeIdentifiers() and AVIF output remains false.
  • Android may report AVIF output=true only after the smoke is promoted into a production encode path with metadata, target-size, unsupported-path, and public API behavior tests.
  • metadata: 'preserve' remains unsupported for AVIF output unless explicitly designed and validated.
  • output.maxBytes remains unsupported for AVIF output until AVIF quality and size-search semantics are validated.
  • Animated AVIF preservation remains out of scope.

Included

  • package.json version bump to 0.2.17.
  • Internal Android AndroidAvifOutputPrototype.runEncodeDecodeBackSmoke() route with MediaCodec input image writing, direct output validation, MediaMuxer.MUXER_OUTPUT_HEIF fallback, AVIF signature checking, and ImageDecoder decode-back validation.
  • Android JVM tests for smoke blocker reporting below API 34 and when no image/avif encoder is discovered.
  • Android instrumentation smoke that runs on API 34+, logs RNICK_AVIF_OUTPUT_SMOKE, accepts either a validated static AVIF file or a documented blocker, and asserts getImageCompressionCapabilities().formats.avif.output=false.
  • README and verification expectations that keep getImageCompressionCapabilities().formats.avif.output=false.
  • npm package publication under the latest dist-tag.
  • Git tag v0.2.17 and GitHub Release v0.2.17.

Not Included

  • Production AVIF output encoding.
  • AVIF output capability enablement.
  • HEIC / HEIF output encoding.
  • Metadata preservation for AVIF output.
  • Target-size AVIF output.
  • Animated AVIF preservation.

Release Checklist

Before npm publish:

git status --short --branch
pnpm verify
pnpm example:typecheck
git diff --check
pnpm pack --dry-run
pnpm release:dry-run

After npm publish:

npm publish --tag latest
npm view react-native-image-compression-kit version dist-tags time.modified --json
pnpm smoke:registry -- --version 0.2.17
git tag -a v0.2.17 -m "v0.2.17"
git push origin v0.2.17

Release promotion also requires GitHub Actions CI, Android Instrumentation, and iOS Validation to pass on the pushed release commit. The Android Instrumentation RNICK_AVIF_OUTPUT_SMOKE log must be reviewed. If the route fails to produce a decodeable AVIF file there, keep AVIF output disabled and carry the logged blocker into the next production-path decision.

Publication Results

  • npm view react-native-image-compression-kit version dist-tags time.modified --json confirmed package version 0.2.17, latest: 0.2.17, and registry modified time 2026-07-03T09:25:30.216Z.
  • npm view react-native-image-compression-kit@0.2.17 version dist.tarball dist.integrity dist.shasum time.modified --json confirmed tarball https://registry.npmjs.org/react-native-image-compression-kit/-/react-native-image-compression-kit-0.2.17.tgz.
  • Registry integrity is sha512-QMoXmU5VL5dPvhJIVe1GPJxK5u2OilbAVzL1UHH8gHaf7nDeL/7Cu2JdDY4yqgCLe+HvYG+MTJNEQ2cqjAsi7g==.
  • Registry shasum is a7a99058a1f67f6907e57d3a5080129655b0314b.
  • pnpm smoke:registry -- --version 0.2.17 passed against the real registry tarball with fileCount: 50, packageSize: 54863, unpackedSize: 242110, and a clean consumer tsc --noEmit.
  • Published tarball README inspection found pre-publish package-page wording because 0.2.17 was published before the post-publish README refresh. The npm tarball is immutable, so correcting the npm package-page README requires a later docs-only package version.
  • Release promotion gate passed on commit f142dcb8bccd0d6955048fb9a762356c076d7167: CI, Android Instrumentation, and iOS Validation.
  • Git tag and GitHub Release: v0.2.17 at https://github.com/GGULBAE/react-native-image-compression-kit/releases/tag/v0.2.17.