v0.2.17
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
ftypbox withaviforaviscompatible brand. - Decode the generated file with
ImageDecoderand 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 becauseBitmap.CompressFormathas no AVIF enum. - The smoke route creates a 16x12 ARGB bitmap pattern, converts it into YUV420 input through
MediaCodec.getInputImage(), queues it into animage/avifencoder, and collects encoder output bytes and muxable samples. - The smoke validates direct encoder bytes first, then attempts a
MediaMuxer.MUXER_OUTPUT_HEIFcontainer path and validates the muxed output. - A passing smoke requires both AVIF
ftypavif/avissignature bytes andImageDecoderdecode-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 blockerNo 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=trueon Android 14+ andoutput=false; iOS AVIF input remains gated byCGImageSourceCopyTypeIdentifiers()and AVIF output remainsfalse. - Android may report AVIF
output=trueonly 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.maxBytesremains unsupported for AVIF output until AVIF quality and size-search semantics are validated.- Animated AVIF preservation remains out of scope.
Included
package.jsonversion bump to0.2.17.- Internal Android
AndroidAvifOutputPrototype.runEncodeDecodeBackSmoke()route withMediaCodecinput image writing, direct output validation,MediaMuxer.MUXER_OUTPUT_HEIFfallback, AVIF signature checking, andImageDecoderdecode-back validation. - Android JVM tests for smoke blocker reporting below API 34 and when no
image/avifencoder 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 assertsgetImageCompressionCapabilities().formats.avif.output=false. - README and verification expectations that keep
getImageCompressionCapabilities().formats.avif.output=false. - npm package publication under the
latestdist-tag. - Git tag
v0.2.17and GitHub Releasev0.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-runAfter 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.17Release 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 --jsonconfirmed package version0.2.17,latest: 0.2.17, and registry modified time2026-07-03T09:25:30.216Z.npm view react-native-image-compression-kit@0.2.17 version dist.tarball dist.integrity dist.shasum time.modified --jsonconfirmed tarballhttps://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.17passed against the real registry tarball withfileCount: 50,packageSize: 54863,unpackedSize: 242110, and a clean consumertsc --noEmit.- Published tarball README inspection found pre-publish package-page wording because
0.2.17was 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.17athttps://github.com/GGULBAE/react-native-image-compression-kit/releases/tag/v0.2.17.