Skip to content

android-compat: Room, WorkManager, location, sensors, services and Keystore - #6098

Merged
shai-almog merged 7 commits into
masterfrom
android-compat-platform-services
Oct 25, 2026
Merged

shai-almog merged 7 commits into
masterfrom
android-compat-platform-services

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Adds the Android APIs that imported Android applications use most and that
the compatibility runtime lacked, each over its Codename One equivalent:

  • Room: a build-time generator for the _Impl classes (no annotation
    processor, no reflection) over a SupportSQLite runtime; migrations are
    checked against the entity columns; live queries follow AndroidX threading.
  • WorkManager: one-time/periodic work, chains, unique work, backoff,
    LiveData queries, persisted queue; constraints go to BackgroundWork.
  • LocationManager over com.codename1.location, SensorManager over
    MotionSensorManager (rotation math rewritten from AOSP, Apache-2.0, in
    NOTICE).
  • Services: started/bound services, IntentService, startForeground
    as a ForegroundService, notifications and channels as local
    notifications; manifest <service> entries generate their factory.
  • AndroidKeyStore: AES-GCM/CBC; key material in the non-prompting
    SecureStorage (keychain / platform keystore).
  • iOS location usage descriptions and the location background mode are
    added to codenameone_settings.properties when the manifest asks for
    location and the project doesn't set them.
  • SQLite waits for another thread's transaction instead of failing.

Also fixes a core bug: Location.setAccuracy stored only NaN (inverted by an
earlier cleanup), so getAccuracy() answered 0 on every port; covered by
LocationExtrasTest.

Limitations are listed in the developer guide's Android chapter.

🤖 Generated with Claude Code

shai-almog and others added 4 commits October 24, 2026 12:10
…ystore

Adds the Android APIs over their Codename One equivalents, the iOS location
hints an imported manifest implies, and fixes Location.setAccuracy, which
only ever stored NaN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GCM refuses a second encryption under one IV; service stop/unbind/stopSelf
are judged in order with their start/bind; removed location and sensor
listeners hear nothing more; SQLite waits for another thread's transaction
instead of failing; Room observers and live queries follow AndroidX's
threading; migrations are checked against the entity columns; WorkStore
saves survive a cut-short write and are merged before the first enqueue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Service request sets are atomic copy-on-write and survive a stopSelf that
races a new start; a failed bind is forgotten; GCM refuses the last key and
IV on init; an unreadable saved work queue loads as empty, never partial;
the main thread does not busy-wait on another thread's transaction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A destroyed service leaves no start request behind; a failed bind keeps a
live binding's record; GCM records the key and IV at init; the main thread
waits two seconds for another thread's transaction instead of failing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 191 screenshots: 191 matched.

Native Android coverage

  • 📊 Line coverage: 18.90% (48254/255341 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.65% (229221/1299035), branch 12.04% (16822/139675), complexity 9.68% (12915/133466), method 14.57% (9124/62628), class 25.17% (1775/7052)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 18.90% (48254/255341 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.65% (229221/1299035), branch 12.04% (16822/139675), complexity 9.68% (12915/133466), method 14.57% (9124/62628), class 25.17% (1775/7052)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 251ms / native 351ms = 0.7x speedup
SIMD float-mul (64K x300) java 173ms / native 150ms = 1.1x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 80.000 ms
Base64 CN1 decode 84.000 ms
Base64 native encode 409.000 ms
Base64 encode ratio (CN1/native) 0.196x (80.4% faster)
Base64 native decode 265.000 ms
Base64 decode ratio (CN1/native) 0.317x (68.3% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 227 screenshots: 227 matched.
✅ JavaScript-port screenshot tests passed.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 56ms / native 5ms = 11.2x speedup
SIMD float-mul (64K x300) java 57ms / native 5ms = 11.4x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 77.000 ms
Base64 CN1 decode 88.000 ms
Base64 SIMD encode 117.000 ms
Base64 encode ratio (SIMD/CN1) 1.519x (51.9% slower)
Base64 SIMD decode 99.000 ms
Base64 decode ratio (SIMD/CN1) 1.125x (12.5% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 14.000 ms
Image createMask (SIMD on) 8.000 ms
Image createMask ratio (SIMD on/off) 0.571x (42.9% faster)
Image applyMask (SIMD off) 49.000 ms
Image applyMask (SIMD on) 48.000 ms
Image applyMask ratio (SIMD on/off) 0.980x (2.0% faster)
Image modifyAlpha (SIMD off) 83.000 ms
Image modifyAlpha (SIMD on) 29.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.349x (65.1% faster)
Image modifyAlpha removeColor (SIMD off) 72.000 ms
Image modifyAlpha removeColor (SIMD on) 31.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.431x (56.9% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-1-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.51x (base 1.22x, +23.6%) 0.57x (base 0.94x, -39.3%) ok
translator (self) 4 0.78x (base 0.60x, +28.2%) 0.55x (base 0.54x, +1.7%) ok
intArithmetic 4 1.10x (base 1.10x, +0.0%) 0.06x (base 0.06x, +2.8%) ok
longArithmetic 4 1.14x (base 1.08x, +5.0%) 0.06x (base 0.05x, +3.7%) ok
mathTranscendental 4 0.78x (base 0.79x, -0.7%) 0.06x (base 0.06x, +3.1%) ok
arraySequential 4 1.38x (base 1.36x, +1.3%) 0.39x (base 0.39x, +0.4%) ok
arrayRandom 4 1.18x (base 1.06x, +11.0%) 0.23x (base 0.23x, +0.7%) ok
objectAllocation 4 1.51x (base 1.56x, -3.0%) 0.30x (base 0.39x, -22.4%) ok
valueEscape 4 0.10x (base 0.10x, +0.3%) 0.05x (base 0.04x, +5.6%) ok
hashMapChurn 4 1.88x (base 1.80x, +4.4%) 0.09x (base 0.09x, -3.2%) ok
stringBuilding 4 1.30x (base 1.22x, +7.1%) 0.27x (base 0.32x, -17.1%) ok
recursion 4 1.40x (base 1.49x, -6.0%) 0.06x (base 0.06x, +1.8%) ok
quicksort 4 1.11x (base 1.13x, -2.2%) 0.12x (base 0.12x, +1.0%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 7763 64-Core Processor (baseline linux-x64@amd-epyc-7763-64-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.85x (base 0.85x, +0.7%) 0.66x (base 0.83x, -21.4%) ok
translator (self) 4 0.69x (base 0.64x, +7.5%) 0.44x (base 0.52x, -14.7%) ok
intArithmetic 4 1.10x (base 1.12x, -1.2%) 0.06x (base 0.06x, +1.8%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.08x (base 0.05x, +40.2%) ok
mathTranscendental 4 1.09x (base 1.08x, +0.2%) 0.06x (base 0.07x, -21.5%) ok
arraySequential 4 2.47x (base 2.00x, +23.3%) 0.36x (base 0.36x, -0.2%) ok
arrayRandom 4 1.00x (base 0.91x, +10.0%) 0.21x (base 0.21x, +0.7%) ok
objectAllocation 4 1.71x (base 1.65x, +3.4%) 0.30x (base 0.35x, -15.0%) ok
valueEscape 4 0.10x (base 0.10x, -0.3%) 0.04x (base 0.04x, +2.0%) ok
hashMapChurn 4 1.49x (base 1.48x, +0.5%) 0.10x (base 0.09x, +6.2%) ok
stringBuilding 4 1.42x (base 1.39x, +1.8%) 0.26x (base 0.31x, -16.9%) ok
recursion 4 1.19x (base 1.25x, -5.2%) 0.06x (base 0.08x, -23.3%) ok
quicksort 4 1.11x (base 1.07x, +3.2%) 0.11x (base 0.11x, -1.2%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.96x (base 1.02x, -5.6%) 0.67x (base 0.93x, -28.3%) ok
translator (self) 4 0.77x (base 0.70x, +9.9%) 0.46x (base 0.43x, +6.2%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, +4.4%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +4.4%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.5%) ok
arraySequential 4 0.40x (base 0.36x, +11.7%) 0.37x (base 0.37x, +0.2%) ok
arrayRandom 4 0.94x (base 0.94x, +0.1%) 0.20x (base 0.20x, +0.6%) ok
objectAllocation 4 1.79x (base 1.77x, +1.5%) 0.38x (base 0.37x, +3.9%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +4.5%) ok
hashMapChurn 4 0.80x (base 0.84x, -4.5%) 0.12x (base 0.12x, -3.7%) ok
stringBuilding 4 1.43x (base 1.57x, -8.8%) 0.26x (base 0.26x, +0.6%) ok
recursion 4 1.42x (base 1.43x, -1.2%) 0.04x (base 0.04x, +5.6%) ok
quicksort 4 1.00x (base 0.99x, +0.9%) 0.09x (base 0.09x, +2.1%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 49ms / native 3ms = 16.3x speedup
SIMD float-mul (64K x300) java 48ms / native 3ms = 16.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 69.000 ms
Base64 SIMD encode 78.000 ms
Base64 encode ratio (SIMD/CN1) 1.300x (30.0% slower)
Base64 SIMD decode 71.000 ms
Base64 decode ratio (SIMD/CN1) 1.029x (2.9% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 16.000 ms
Image applyMask (SIMD on) 19.000 ms
Image applyMask ratio (SIMD on/off) 1.188x (18.8% slower)
Image modifyAlpha (SIMD off) 16.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.813x (18.8% faster)
Image modifyAlpha removeColor (SIMD off) 13.000 ms
Image modifyAlpha removeColor (SIMD on) 9.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.692x (30.8% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.02x (base 1.11x, -7.9%) 0.58x (base 0.75x, -22.9%) ok
translator (self) 4 0.87x (base 0.84x, +3.8%) 0.50x (base 0.51x, -0.7%) ok
intArithmetic 4 1.04x (base 1.04x, +0.0%) 0.06x (base 0.06x, +3.0%) ok
longArithmetic 4 0.79x (base 0.80x, -0.1%) 0.06x (base 0.06x, +3.5%) ok
mathTranscendental 4 0.72x (base 0.72x, -0.4%) 0.07x (base 0.06x, +1.8%) ok
arraySequential 4 0.36x (base 0.46x, -20.6%) 0.39x (base 0.39x, +0.1%) ok
arrayRandom 4 0.94x (base 0.94x, -0.0%) 0.23x (base 0.23x, +0.2%) ok
objectAllocation 4 1.87x (base 1.82x, +2.9%) 0.33x (base 0.43x, -24.2%) ok
valueEscape 4 0.76x (base 0.76x, +0.1%) 0.05x (base 0.05x, +2.7%) ok
hashMapChurn 4 0.99x (base 0.98x, +0.5%) 0.12x (base 0.12x, -2.5%) ok
stringBuilding 4 1.60x (base 1.43x, +12.5%) 0.27x (base 0.27x, -0.3%) ok
recursion 4 1.55x (base 1.46x, +5.9%) 0.07x (base 0.07x, +1.1%) ok
quicksort 4 1.00x (base 1.00x, +0.3%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 880 total, 0 failed, 55 skipped

Benchmark Results

  • Execution Time: 5892 ms

  • Hotspots (Top 20 sampled methods):

    • 6.45% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (64 samples)
    • 5.85% com.codename1.tools.translator.BytecodeMethod.equals (58 samples)
    • 5.44% java.lang.System.identityHashCode (54 samples)
    • 5.34% java.util.ArrayList.indexOf (53 samples)
    • 4.03% java.lang.Object.hashCode (40 samples)
    • 3.63% com.codename1.tools.translator.IteratorEscape.mangle (36 samples)
    • 2.62% java.lang.String.equals (26 samples)
    • 2.42% java.lang.StringBuilder.append (24 samples)
    • 2.22% java.util.AbstractCollection.containsAll (22 samples)
    • 2.02% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (20 samples)
    • 1.71% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (17 samples)
    • 1.61% com.codename1.tools.translator.classfile.analysis.Frame.execute (16 samples)
    • 1.51% com.codename1.tools.translator.Parser.cullMethods (15 samples)
    • 1.41% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (14 samples)
    • 1.31% com.codename1.tools.translator.BytecodeMethod.addToConstantPool (13 samples)
    • 1.31% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (13 samples)
    • 1.21% java.util.HashMap.putVal (12 samples)
    • 1.21% java.io.FileOutputStream.writeBytes (12 samples)
    • 1.21% com.codename1.tools.translator.BytecodeMethod.optimize (12 samples)
    • 1.11% com.codename1.tools.translator.ReachabilityCull.run (11 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Flutter vs Codename One

Same application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor.

android

9 interleaved rounds; host load 0.86, 2.38, 1.73

Metric Codename One Flutter Ratio Winner
Installed size 78.2 MB 95.8 MB 1.22x Codename One
Executable code 4.6 MB 20.6 MB 4.42x Codename One
Download size (zipped) 78.2 MB 95.8 MB 1.22x Codename One
Cold start to first frame on screen 441 ms 1368 ms 3.10x Codename One
Memory at rest 44.6 MB 86.7 MB 1.94x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 79 ms 164 ms 2.08x
longArithmetic 56 ms 52 ms 0.93x
mathTranscendental 217 ms 277 ms 1.28x
arraySequential 26 ms 31 ms 1.19x
arrayRandom 199 ms 241 ms 1.21x
objectAllocation 59 ms 36 ms 0.61x
valueEscape 6 ms 6 ms 1.00x
hashMapChurn 119 ms 241 ms 2.02x
stringBuilding 75 ms 98 ms 1.31x
recursion 65 ms 236 ms 3.63x
quicksortBench 123 ms 132 ms 1.07x
Geometric mean 1.33x

Gate: within tolerance against scripts/flutter-bench/baseline.

Android sizes are for the arm64-v8a slice a phone is delivered, on both sides; Flutter's release apk carries three ABIs and would otherwise count its engine about three times.
Android start-up and memory come from an x86_64 emulator with a software GPU. They compare the two runtimes on one machine; they are not phone timings, and a renderer that leans on the GPU is penalised more there.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

ios

9 interleaved rounds; host load 23.93, 27.22, 19.41

Metric Codename One Flutter Ratio Winner
Installed size 108.1 MB 110.5 MB 1.02x Codename One
Executable code 17.1 MB 19.1 MB 1.11x Codename One
Download size (zipped) 80.0 MB 81.9 MB 1.02x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon.

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -7.50% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6098 --reason "<why these moved>" baseline-ios.json, then commit the overlay it writes.

iOS start-up and memory are not measured here: Flutter cannot AOT-compile for the simulator, so a simulator run would time a JIT debug build against a release build. Sizes come from release device bundles; timings need signed hardware.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

javascript

9 interleaved rounds; host load 1.82, 1.04, 0.44

Metric Codename One Flutter Ratio Winner
Installed size 103.9 MB 122.5 MB 1.18x Codename One
Executable code 12.9 MB 25.2 MB 1.96x Codename One
Download size (zipped) 76.3 MB 84.1 MB 1.10x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 683 ms wrong result Flutter: wrong result
longArithmetic 5985 ms did not run Flutter: did not run
mathTranscendental 508 ms did not run Flutter: did not run
arraySequential 223 ms 96 ms 0.43x
arrayRandom 769 ms wrong result Flutter: wrong result
objectAllocation 53 ms 29 ms 0.55x
valueEscape 128 ms 7 ms 0.06x
hashMapChurn 1107 ms 255 ms 0.23x
stringBuilding 513 ms 108 ms 0.21x
recursion 487 ms 448 ms 0.92x
quicksortBench 469 ms wrong result Flutter: wrong result
Geometric mean 0.29x

Gate: within tolerance against scripts/flutter-bench/baseline; BEHIND FLUTTER on Compute (geomean of the VM workloads) (reported, not gated: a loss to Flutter on the web is currently accepted).

the JavaScript adapter needs a Chrome DevTools driver; sizes are reported and timings are not
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

linux

9 interleaved rounds; host load 0.21, 2.88, 2.49

Metric Codename One Flutter Ratio Winner
Installed size 111.4 MB 143.8 MB 1.29x Codename One
Executable code 14.1 MB 16.1 MB 1.15x Codename One
Download size (zipped) 80.9 MB 92.9 MB 1.15x Codename One
Cold start to first frame on screen 157 ms 246 ms 1.58x Codename One
Memory at rest 85.3 MB 227.2 MB 2.67x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 74 ms 183 ms 2.47x
longArithmetic 56 ms 55 ms 0.98x
mathTranscendental 254 ms 276 ms 1.09x
arraySequential 16 ms 35 ms 2.19x
arrayRandom 284 ms 299 ms 1.05x
objectAllocation 24 ms 39 ms 1.62x
valueEscape 5 ms 7 ms 1.40x
hashMapChurn 50 ms 361 ms 7.22x
stringBuilding 33 ms 110 ms 3.33x
recursion 95 ms 258 ms 2.72x
quicksortBench 139 ms 149 ms 1.07x
Geometric mean 1.87x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

macos

9 interleaved rounds; host load 1.59, 8.23, 13.91

Metric Codename One Flutter Ratio Winner
Installed size 124.1 MB 139.4 MB 1.12x Codename One
Executable code 33.0 MB 47.9 MB 1.45x Codename One
Download size (zipped) 85.5 MB 93.3 MB 1.09x Codename One
Cold start to first frame on screen 238 ms 409 ms 1.25x Codename One
Memory at rest 36.7 MB 52.4 MB 1.43x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 8 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 119 ms 261 ms 2.19x
longArithmetic 75 ms 83 ms 1.11x
mathTranscendental 294 ms 371 ms 1.26x
arraySequential 12 ms 48 ms 4.00x
arrayRandom 269 ms 333 ms 1.24x
objectAllocation 69 ms 33 ms 0.48x
valueEscape 5 ms 13 ms 2.60x
hashMapChurn 38 ms 177 ms 4.66x
stringBuilding 24 ms 130 ms 5.42x
recursion 132 ms 270 ms 2.04x
quicksortBench 124 ms 136 ms 1.10x
Geometric mean 1.89x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -6.57% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6098 --reason "<why these moved>" baseline-macos.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

windows

9 interleaved rounds

Metric Codename One Flutter Ratio Winner
Installed size 107.8 MB 121.1 MB 1.12x Codename One
Executable code 11.3 MB 14.1 MB 1.25x Codename One
Download size (zipped) 77.8 MB 86.4 MB 1.11x Codename One
Cold start to first frame on screen 157 ms 243 ms 1.53x Codename One
Memory at rest 58.5 MB 92.4 MB 1.58x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 80 ms 183 ms 2.29x
longArithmetic 60 ms 57 ms 0.95x
mathTranscendental 200 ms 268 ms 1.34x
arraySequential 11 ms 35 ms 3.18x
arrayRandom 249 ms 301 ms 1.21x
objectAllocation 24 ms 39 ms 1.62x
valueEscape 1 ms 7 ms 7.00x
hashMapChurn 51 ms 315 ms 6.18x
stringBuilding 35 ms 122 ms 3.49x
recursion 199 ms 266 ms 1.34x
quicksortBench 143 ms 146 ms 1.02x
Geometric mean 2.11x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -10.80%; Download size (zipped) -0.78% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6098 --reason "<why these moved>" baseline-windows.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

Codename One wins 26 of 26 measured metrics across 6 platform(s).

shai-almog and others added 2 commits October 24, 2026 18:14
…le's AES

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ompat-testing

Resolves the conflicts with the Swing/JavaFX compatibility layers: the
Keystore shims join ANDROID_JDK_SHIMS, the Room and WorkManager generators
use the composed relocator, and RoomGeneratorTest runs its relocated app
with a Codename One of its own so another test's Display cannot reach it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 192 screenshots: 192 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 560 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 2ms = 27.0x speedup
SIMD float-mul (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 53.000 ms
Base64 CN1 decode 70.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 63.000 ms
Image applyMask (SIMD on) 69.000 ms
Image applyMask ratio (SIMD on/off) 1.095x (9.5% slower)
Image modifyAlpha (SIMD off) 61.000 ms
Image modifyAlpha (SIMD on) 56.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.918x (8.2% faster)
Image modifyAlpha removeColor (SIMD off) 74.000 ms
Image modifyAlpha removeColor (SIMD on) 60.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.811x (18.9% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.80x (base 0.96x, -16.3%) 0.88x (base 0.93x, -4.6%) ok
translator (self) 3 0.64x (base 0.62x, +2.4%) 0.72x (base 0.58x, +24.6%) ok
intArithmetic 3 1.04x (base 1.03x, +0.8%) 0.12x (base 0.12x, +1.4%) ok
longArithmetic 3 1.04x (base 1.03x, +1.3%) 0.11x (base 0.07x, +63.2%) ok
mathTranscendental 3 0.98x (base 1.01x, -2.3%) 0.12x (base 0.12x, +1.4%) ok
arraySequential 3 0.44x (base 0.42x, +5.9%) 0.53x (base 0.53x, +0.5%) ok
arrayRandom 3 1.00x (base 0.99x, +0.8%) 0.33x (base 0.32x, +0.5%) ok
objectAllocation 3 1.02x (base 1.11x, -7.6%) 0.80x (base 0.72x, +10.3%) ok
valueEscape 3 0.51x (base 0.51x, -0.3%) 0.08x (base 0.09x, -4.5%) ok
hashMapChurn 3 0.89x (base 1.18x, -23.9%) 0.07x (base 0.07x, +1.3%) ok
stringBuilding 3 0.90x (base 0.84x, +6.3%) 0.46x (base 0.46x, -1.4%) ok
recursion 3 1.15x (base 1.24x, -6.8%) 0.12x (base 0.12x, +1.1%) ok
quicksort 3 1.01x (base 1.01x, -0.5%) 0.11x (base 0.11x, +2.1%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 189 screenshots: 189 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 1489 seconds

Build and Run Timing

Metric Duration
Simulator Boot 51000 ms
Simulator Boot (Run) 0 ms
App Install 12000 ms
App Launch 1000 ms
Test Execution 420000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 93ms / native 9ms = 10.3x speedup
SIMD float-mul (64K x300) java 109ms / native 3ms = 36.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 90.000 ms
Base64 CN1 decode 57.000 ms
Base64 native encode 768.000 ms
Base64 encode ratio (CN1/native) 0.117x (88.3% faster)
Base64 native decode 861.000 ms
Base64 decode ratio (CN1/native) 0.066x (93.4% faster)
Base64 SIMD encode 93.000 ms
Base64 encode ratio (SIMD/CN1) 1.033x (3.3% slower)
Base64 SIMD decode 50.000 ms
Base64 decode ratio (SIMD/CN1) 0.877x (12.3% faster)
Base64 encode ratio (SIMD/native) 0.121x (87.9% faster)
Base64 decode ratio (SIMD/native) 0.058x (94.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.800x (20.0% faster)
Image applyMask (SIMD off) 44.000 ms
Image applyMask (SIMD on) 26.000 ms
Image applyMask ratio (SIMD on/off) 0.591x (40.9% faster)
Image modifyAlpha (SIMD off) 80.000 ms
Image modifyAlpha (SIMD on) 22.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.275x (72.5% faster)
Image modifyAlpha removeColor (SIMD off) 36.000 ms
Image modifyAlpha removeColor (SIMD on) 24.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.667x (33.3% faster)

@shai-almog

shai-almog commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 189 screenshots: 189 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 2620 seconds

Build and Run Timing

Metric Duration
Simulator Boot 69000 ms
Simulator Boot (Run) 2000 ms
App Install 20000 ms
App Launch 7000 ms
Test Execution 576000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 137ms / native 3ms = 45.6x speedup
SIMD float-mul (64K x300) java 119ms / native 6ms = 19.8x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 89.000 ms
Base64 CN1 decode 85.000 ms
Base64 native encode 2143.000 ms
Base64 encode ratio (CN1/native) 0.042x (95.8% faster)
Base64 native decode 2479.000 ms
Base64 decode ratio (CN1/native) 0.034x (96.6% faster)
Base64 SIMD encode 88.000 ms
Base64 encode ratio (SIMD/CN1) 0.989x (1.1% faster)
Base64 SIMD decode 80.000 ms
Base64 decode ratio (SIMD/CN1) 0.941x (5.9% faster)
Base64 encode ratio (SIMD/native) 0.041x (95.9% faster)
Base64 decode ratio (SIMD/native) 0.032x (96.8% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 18.000 ms
Image createMask (SIMD on) 6.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 451.000 ms
Image applyMask (SIMD on) 129.000 ms
Image applyMask ratio (SIMD on/off) 0.286x (71.4% faster)
Image modifyAlpha (SIMD off) 136.000 ms
Image modifyAlpha (SIMD on) 236.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.735x (73.5% slower)
Image modifyAlpha removeColor (SIMD off) 193.000 ms
Image modifyAlpha removeColor (SIMD on) 83.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.430x (57.0% faster)

@shai-almog

shai-almog commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 188 screenshots: 188 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 548 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 4ms = 13.5x speedup
SIMD float-mul (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 72.000 ms
Base64 CN1 decode 70.000 ms
Base64 native encode 875.000 ms
Base64 encode ratio (CN1/native) 0.082x (91.8% faster)
Base64 native decode 390.000 ms
Base64 decode ratio (CN1/native) 0.179x (82.1% faster)
Base64 SIMD encode 59.000 ms
Base64 encode ratio (SIMD/CN1) 0.819x (18.1% faster)
Base64 SIMD decode 69.000 ms
Base64 decode ratio (SIMD/CN1) 0.986x (1.4% faster)
Base64 encode ratio (SIMD/native) 0.067x (93.3% faster)
Base64 decode ratio (SIMD/native) 0.177x (82.3% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 14.000 ms
Image createMask ratio (SIMD on/off) 1.750x (75.0% slower)
Image applyMask (SIMD off) 66.000 ms
Image applyMask (SIMD on) 50.000 ms
Image applyMask ratio (SIMD on/off) 0.758x (24.2% faster)
Image modifyAlpha (SIMD off) 71.000 ms
Image modifyAlpha (SIMD on) 65.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.915x (8.5% faster)
Image modifyAlpha removeColor (SIMD off) 69.000 ms
Image modifyAlpha removeColor (SIMD on) 59.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.855x (14.5% faster)

@shai-almog

shai-almog commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 249 screenshots: 249 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 184 screenshots: 184 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog
shai-almog merged commit dea36d1 into master Oct 25, 2026
135 of 136 checks passed
@shai-almog
shai-almog deleted the android-compat-platform-services branch October 25, 2026 09:34
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