Skip to content

feat!: upgrade V8 to 14.9.207.39 - #1987

Merged
NathanWalker merged 24 commits into
mainfrom
feat/v8-14
Aug 3, 2026
Merged

feat!: upgrade V8 to 14.9.207.39#1987
NathanWalker merged 24 commits into
mainfrom
feat/v8-14

Conversation

@edusperoni

@edusperoni edusperoni commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

Upgrades the runtime from V8 10.3.22 → 14.9.207.39. Companion to NativeScript/ios#412.

Status

Runtime test suite (API 35, arm64) 594 tests, 0 failures, 0 errors, 5 skipped
Inspector / CDP verified end to end
Release (optimized) configuration compiles and links
All four ABIs built green in buildscripts CI
Size vs the current release +2.7 MiB raw / +1.5 MB download

The five skips are the pre-existing xit()s already in the suite.

The libraries are no longer committed

./download_v8.sh installs them from the release pinned in V8_RELEASE, verifying every archive against the SHA256SUMS published with it. It is a no-op once they are in place, V8_SKIP_DOWNLOAD=1 skips it entirely, and build.sh calls it — deliberately not a Gradle task, matching how the iOS runtime treats download_llvm.sh. Keeping it out of the build means a stale or unreachable release cannot wedge an otherwise working build.

Two reasons this had to change:

  • The arm64-v8a and x86_64 monoliths are 100.7 MiB and 106.1 MiB, over GitHub's hard 100 MiB per-file push limit. Stripping recovers ~2%, leaving x86_64 still over.
  • More fundamentally, the full matrix cannot be produced on any single machine. The 32-bit ABIs need an ia32-capable host — v8config.h refuses anything else — and the Apple variants need macOS. Hand-assembled artifacts are therefore neither reproducible nor verifiable.

The vendored headers are ignored along with the libraries, not just the binaries. Keeping a copy in git is how it drifts out of step with the libraries it describes — the iOS runtime was carrying 10.3 crdtp headers against a 14.9 libcrdtp.a for exactly that reason. Sourcing both from one verified artifact makes the mismatch impossible. libzip.a and zip.h stay tracked; they are not V8.

tools/v8/vendor_inspector_sources.py stays too: it recomputes the inspector's internals by closure from the release's src-headers artifact. What the glue includes is this repo's business, not the build repo's.

V8_RELEASE pins v8-14.9.207.39-1. Contributors with a local V8 build can use V8_SKIP_DOWNLOAD=1.

What changed

Build config. JIT and WebAssembly stay on, i18n stays off — same shape as the 10.3 build. The gn args live in buildscripts now; the reasoning is in docs/knowledge/v8-14-migration.md. The one worth repeating here:

v8_array_buffer_internal_field_count / ..._view_... defaulted to 2 in 10.3 and default to 0 in 14.9. JSToJavaObjectsConverter marshals an ArrayBuffer/SharedArrayBuffer/typed array to a Java NIO buffer by calling ObjectManager::Link on the buffer object itself, and Link stores its JSInstanceInfo in internal field 0. With zero fields every such conversion throws "Trying to link invalid 'this' to a Java object" — this was the only test failure in the first full run. v8-array-buffer.h still falls back to 2 when the macro is undefined, so the gn default also put V8 and the embedder silently out of agreement.

NDK r27d → r29. Forced: V8 14.9's src/base/atomicops.h uses std::atomic_ref unconditionally and r27d ships libc++ 18, which does not implement it. The runtime compiles that header because v8_inspector vendors V8 internals. minSdk is unchanged at 21. V8 must be built against the same NDK — libc++ is only ABI-compatible with itself across a static link, and V8's bundled NDK is newer than any released one (mixing fails on std::__ndk1::__hash_memory).

API migration. Mostly mechanical — full table in the doc. The one part that is not:

PropertyCallbackInfo no longer exposes the receiver at all, and SetNativeDataProperty is not a drop-in for SetAccessor on anything inherited from. Six MetadataNode accessors live on an object other than the one they are read through — class, nullObject and static fields on the constructor, super on the implementation object, instance fields and properties on the prototype template — and are now SetAccessorProperty with FunctionTemplate-backed callbacks, whose This() is still the receiver. Static fields are the sharp edge: they have a setter, and a data-like property would let Derived.baseField = x shadow the base with an own property and silently never reach the native setter.

One guard could not be translated directly. The field accessors used thiz->StrictEquals(info.Holder()) to catch an instance field read straight off the prototype; function-backed accessors have no holder, so that is now !objectManager->IsJsRuntimeObject(thiz) — being a runtime-managed object is what actually separates an instance from the prototype. The two agree for every receiver the old check could see.

Flags. V8::Initialize() freezes the flag list and changing a flag afterwards aborts the process, so v8Flags is applied once in InitializeV8() instead of per isolate.

Performance

Measured on an arm64 emulator against the shipped 10.3 runtime, both sides arm64-v8a with the runtime C++ at the same optimization level. Best-of-3 runs, each case auto-calibrated to =120 ms.

14.9 vs 10.3
Pure JS (16 workloads) 1.26x faster geomean
Java/JNI (14 workloads) 1.09x geomean - effectively flat
WebAssembly 39x faster to compile, ~1.9x faster calls

Biggest JS wins are JSON round-trip (1.96x), float math (1.58x) and integer loops (1.46x); already-JIT-friendly property and typed-array loops are unchanged because they were already optimal on 10.3.

JNI being flat is the expected result - bridge cost is the runtime's own marshalling plus JNI, and V8 barely participates. Worth noting the absolute numbers rather than the ratio: a JNI instance call is ~540 ns against ~0.5 ns for a JS property access, on both versions.

WebAssembly works on 10.3 - every capability probe returns identically on both (sync/async compile, host imports, Memory, validate). It is not broken today, merely unused. The compile speedup was verified against a caching artifact by compiling bytes never seen before, so 39x is real rather than a cache hit.

Maglev is worth its size. Disabling it costs ~1.8x on warm, short-lived functions - the shape most app code has - while leaving peak throughput untouched, so v8_enable_maglev=false is not a good trade for 3.4 MiB.

Full tables, methodology and caveats in V8_14_PERFORMANCE_AND_SIZE.md.

Three build bugs found while measuring size

All three predate this PR and are fixed here; each is independently validated at 594/0/0/5.

  • The link flags were never applied (4b201927). set_target_properties(... PROPERTIES ...) takes key/value pairs, so LINK_FLAGS got only -Wl,--allow-multiple-definition while -Wl,--exclude-libs=ALL was parsed as a property name whose value was -Wl,--gc-sections, and silently discarded. The optimized runtime was exporting 72,670 dynamic symbols, 59,442 of them v8::internal::, costing 12.1 MiB of .dynstr.

    The fix is a linker version script rather than --exclude-libs=ALL, so plugins linking V8's public API keep working: 1,749 symbols exported, -20.7 MB off the stripped .so. Blanket hiding would have saved only 393 KB more.

  • -O3 never reached a release AAR (bab7ce38). CMake appends CMAKE_CXX_FLAGS_<CONFIG> after CMAKE_CXX_FLAGS and clang honours the last -O, so RelWithDebInfo's -O2 silently overrode it in every published variant.

  • OPTIMIZED_WITH_INSPECTOR_BUILD never reached CMake (9b7c0a1e). The arguments.add(...) was commented out, so nativescript-optimized-with-inspector fell back to the unoptimized link configuration - byte-identical to nativescript-regular. That variant is the default for non-release app builds, so this cost ~21 MB on every debug APK; shipped apps were unaffected.

One consequence worth flagging for reviewers: because --exclude-libs=ALL was being dropped, the optimized runtime already exported every V8 symbol, so useV8Symbols has always been a no-op for its stated purpose. The version script keeps public V8 linkable, so it stays harmlessly inert rather than becoming load-bearing.

Size impact

Optimized, stripped, arm64-v8a libNativeScript.so, against the published nativescript-optimized.aar:

raw gzip
10.3.22 (current release) 22.2 MiB 7.4 MB
14.9.207.39 (this branch) ~24.9 MiB ~8.9 MB
delta +2.7 MiB +1.5 MB

Before the build fixes above this was +22.4 MiB raw / +5.0 MB gzip. The three fixes are version-independent, so 10.3 would shrink too if they were backported - the comparison above is "what users have installed today versus what they would get", not a like-for-like V8 comparison.

Roughly half the remaining growth is V8's two new compiler tiers, which did not exist in 10.3: Turboshaft 6.1 MiB + Maglev 3.4 MiB. The one large lever left is v8_enable_webassembly=false (-9.9 MiB raw / -2.5 MB gzip), left on here since the benchmarks show WASM works today and got dramatically faster; turning it off would also need MessageLoopTimer::Init guarded, as its proxy script references the bare WebAssembly identifier at every isolate startup.

Not addressed here: NS_DEFAULT_MIN_SDK_VERSION=21 forces extractNativeLibs="true", so the library is stored twice on device - deflated in the retained APK and extracted raw. Raising the default to 23 would save a further ~8.9 MB installed, but it is a runtime-wide default change and belongs in its own PR.

Notes for review

  • Only the tip compiles — headers, vendored internals and source have to move together for a version bump. The commits are split for reviewability, not for bisect.
  • docs/knowledge/v8-14-migration.md carries the full API table and the reasoning behind every build-config pin.
  • V8_STATIC_ROOTS is deliberately not defined by the runtime. V8 is built with it and it would let Value::IsUndefined()/IsNull() use the inline static-root comparison, but the root addresses are hardcoded constants in v8-internal.h that must match the library exactly. 10.3 had no such fast path, so this is parity; enabling it is a separate, measurable change.
  • Unrelated, found while validating: reading SomeClass.null permanently breaks that class's static valueOf(). Confirmed pre-existing on 10.3, filed as Reading SomeClass.null permanently breaks that class's static valueOf() #1986.

Summary by CodeRabbit

  • New Features
    • Upgraded the bundled Android runtime to V8 14.9 and switched the Android NDK to r29.
    • Added an Android Gradle option to limit which ABIs get built.
  • Build Improvements
    • Automatically fetches pinned, checksum-verified prebuilt V8 libraries/headers before packaging and tests.
  • Documentation
    • Added/expanded V8 migration guidance, including Android build/config compatibility notes.
  • Bug Fixes
    • Improved devtools/inspector and console integration behavior for more consistent interactions.
  • Chores
    • Updated V8 release pin and git ignore rules for prebuilt artifacts.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

V8 is upgraded to 14.9 with NDK r29. Prebuilt libraries and headers are downloaded and verified, Android ABI selection is configurable, runtime bindings are migrated to updated V8 APIs, inspector sources are refreshed, and supporting Abseil headers are vendored.

Changes

V8 14.9 migration

Layer / File(s) Summary
Prebuilt distribution and build wiring
download_v8.sh, build.sh, .github/workflows/*, test-app/*/build.gradle, package.json
Pinned V8 artifacts are downloaded, checksum-verified, installed, and used by builds with NDK r29 and configurable ABI filters.
Runtime API compatibility
test-app/runtime/src/main/cpp/*
Isolate acquisition, external pointer tagging, creation-context access, script origins, startup flags, and POSIX includes are updated for V8 14.9.
Callback and accessor migration
test-app/runtime/src/main/cpp/{MetadataNode*,URLImpl*,URLPatternImpl.cpp,URLSearchParamsImpl.*}
Callback signatures, holder lookup, interceptor returns, native/accessor property registration, and embedder pointer tags are updated.
Inspector and vendored support
test-app/runtime/src/main/cpp/v8_inspector/*, tools/v8/vendor_inspector_sources.py
Inspector trust and console APIs are updated, and the matching inspector dependency tree plus Abseil support headers are vendored.
Migration documentation
docs/README.md, docs/knowledge/v8-14-migration.md
Build constraints, API migrations, test status, inspector validation, and follow-up items are documented.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested reviewers: nathanwalker

Poem

A rabbit hops through V8’s new gate,
Tagged pointers align just right.
NDK r29 keeps watchful pace,
Inspector sources join the race.
Prebuilt bundles bloom in flight.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the main change: upgrading V8 to version 14.9.207.39.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Base automatically changed from feat/error-handling to main July 27, 2026 19:13
Reproduces the prebuilt libv8_monolith.a from source:

- fetch_v8.sh pins 14.9.207.39 and applies the patches
- build_v8_source.sh builds an ABI and vendors the matching headers
- build_v8_linux_docker.sh covers the two 32-bit ABIs, which cannot be
  built on macOS -- mksnapshot has to run V8's simulator for a 32-bit
  target and v8config.h only permits that from an ia32 host
- vendor_inspector_sources.py refreshes the V8 internals that the
  inspector glue compiles against, by transitive closure from what it
  actually includes

v8_resurrecting_finalizers.patch restores WeakCallbackType::kFinalizer,
removed upstream right after 10.3.22; ObjectManager depends on it.
android_build_on_macos.patch relaxes chromium's linux-host assert and
makes android_ndk_root selectable.
Refreshed wholesale from the pinned checkout by build_v8_source.sh. The
deletions are 10.3-era headers that no longer exist upstream; nothing
includes them.

zip.h/zipconf.h belong to libzip and inspector/ holds the generated
protocol headers, so both are left alone by the vendoring step.
JsV8InspectorClient and ns-v8-tracing-agent-impl compile against
src/inspector, which is not public API, so this copy has to move with
libv8_monolith.a or it is an ABI mismatch.

Regenerated by transitive closure from the six headers the runtime
actually includes. src/common/globals.h now reaches abseil through
base/numbers/double.h, so the needed absl headers come along and land at
the top of the tree, where the "absl/..." spelling already resolves.
Mechanical, except where noted:

- Context/Object/Function/Promise/Message::GetIsolate() removed ->
  Isolate::GetCurrent()
- External::New/Value() and the aligned internal-field accessors take a
  type tag
- Object::CreationContext() -> GetCreationContext(isolate)
- ScriptOrigin no longer takes an isolate; AccessControl is gone
- GetInternalField returns Local<Data>
- V8Inspector::connect takes a trust level; createForConsoleAPI takes a
  span
- FunctionCallbackInfo is no longer copyable, so ArgsWrapper holds a
  reference -- every instance is a local in the callback it wraps

Accessors are the part that is not mechanical. PropertyCallbackInfo no
longer exposes the receiver at all, and SetNativeDataProperty is not a
drop-in for SetAccessor on anything that is inherited from. Six
MetadataNode accessors live on an object other than the one they are read
through -- class, nullObject and static fields on the constructor, super
on the implementation object, instance fields and properties on the
prototype template -- and are now SetAccessorProperty with
FunctionTemplate-backed callbacks, whose This() is still the receiver.
Static fields matter most: they have a setter, and a data-like property
would let Derived.baseField = x shadow the base and silently never reach
it.

The field accessors used thiz->StrictEquals(info.Holder()) to detect an
instance field read straight off the prototype. Function-backed accessors
have no holder, so that is now !IsJsRuntimeObject(thiz) -- being a
runtime-managed object is what actually separates an instance from the
prototype.

The array wrapper's indexed handler returns v8::Intercepted; both paths
handle the access completely and neither ever fell through.

V8::Initialize() freezes the flag list and changing a flag afterwards
aborts, so the app's v8Flags are applied once in InitializeV8() rather
than per isolate.

unistd.h is included explicitly where usleep/read used to arrive
transitively.
V8 14.9's src/base/atomicops.h uses std::atomic_ref unconditionally, and
r27d ships libc++ 18, which does not implement it. The runtime compiles
that header because v8_inspector vendors V8 internals, so the bump is
forced rather than opportunistic. r29 is the first released NDK new
enough. minSdk is unchanged at 21.

V8 has to be built against the same NDK: libc++ is only ABI-compatible
with itself across a static link, and V8's bundled NDK is newer than any
released one -- mixing them fails the link on std::__ndk1::__hash_memory.

-Pabis=arm64-v8a,x86_64 restricts abiFilters, which is needed while the
32-bit monoliths can only be produced on a linux/amd64 host.
The 32-bit build runs for hours. With stdin attached the container died
along with whatever shell started it, losing the work. It now starts
detached and the logs are followed separately, so interrupting the script
leaves the build running; --attach picks the stream back up.
Only the host assert in that patch is macOS-specific, and widening it is a
no-op on Linux. The API 21 floor and the android_ndk_root gn arg are
needed everywhere -- gating the whole patch on Darwin broke the linux
container at gn gen with "default_min_sdk_version (21) must be >=
min_supported_sdk_version (23)".

Renamed to match what it actually does.
depot_tools and the ~3GB NDK were fetched into the container filesystem,
so every retry re-downloaded them; they now live in the same volume as the
V8 checkout.

The mounted build script also moves off mktemp and loses its cleanup
trap. bash reads a script incrementally, so deleting it when the launching
shell exits could break a container that is still running -- the whole
point of detaching.
Building a 32-bit Android target makes mksnapshot and the bytecode
builtins generator 32-bit x86 host binaries. Without i386 multiarch they
link and then fail to run, which surfaces as a failed
generate_bytecode_builtins_list action rather than anything mentioning
architecture.
The libraries and the headers that must match them now come from a
pinned release of NativeScript/v8-buildscripts, installed by
tools/v8/fetch_prebuilt_v8.sh and verified against the SHA256SUMS
published with it. tools/v8/V8_RELEASE is the pin.

Two reasons they cannot stay in git. The arm64-v8a and x86_64 monoliths
are 100.7 MiB and 106.1 MiB, over GitHub's hard 100 MiB per-file push
limit. More importantly the full matrix cannot be produced on any single
machine -- the 32-bit ABIs need an ia32-capable host, the Apple variants
need macOS -- so hand-assembled binaries are neither reproducible nor
verifiable.

The vendored headers are ignored along with the libraries, not just the
binaries. Keeping a copy in git is how it drifts out of step with the
libraries it describes; the iOS runtime was carrying 10.3 crdtp headers
against a 14.9 libcrdtp for exactly that reason. Sourcing both from one
verified artifact makes the mismatch impossible.

libzip.a and zip.h stay tracked -- they are not V8.
Moved to a root-level download_v8.sh rather than a Gradle task, so it is a
prerequisite you run once, a no-op when the artifacts are already in
place, and trivial to skip.

V8_SKIP_DOWNLOAD=1 makes it exit immediately, which is what you want when
you have built V8 yourself and do not want a pinned release overwriting
it.

Keeping it out of Gradle also means a stale or unreachable release cannot
wedge an otherwise working build -- you just skip it.
fetch_v8.sh, build_v8_source.sh, build_v8_linux_docker.sh and both
patches now live in NativeScript/v8-buildscripts, which owns producing V8
for both runtimes. Keeping a second copy here means two sets of gn args
that can disagree -- the same drift this whole change removes, and these
are the args where disagreeing is expensive
(v8_array_buffer_internal_field_count silently breaks ArrayBuffer
marshalling).

vendor_inspector_sources.py stays: the closure roots are what this
runtime's glue includes, which is not the build repo's business. iOS has
five roots, this has six.
Alongside error-handling.md they read like current instructions; they are
a record of a completed migration. Lowercase-hyphenated to match the
neighbours.
CI invokes gradle directly rather than build.sh, so nothing installed the
V8 libraries and every ABI failed with "libv8_monolith.a ... missing and
no known rule to make it". Both workflows now run ./download_v8.sh before
the first gradle invocation.

NDK_VERSION also moves r27d -> r29. V8 14.9 uses std::atomic_ref, which
r27d's libc++ 18 does not implement, and the runtime compiles that header
because v8_inspector vendors V8 internals.

download_v8.sh picks sha256sum or shasum depending on what the host has;
it was written on macOS, where only the latter exists.
@edusperoni
edusperoni marked this pull request as ready for review July 27, 2026 21:21

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
tools/v8/vendor_inspector_sources.py (2)

80-93: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Sibling resolution can vendor paths outside VENDORED_PREFIXES.

sibling is normpath'd from the including file's directory, so a relative include like ../../include/v8.h resolves to include/v8.h and gets queued and copied even though it is not under VENDORED_PREFIXES. Line 87 only wipes src, third_party, and absl, so such a tree also survives future runs as stale state. Consider constraining the sibling fallback to vendored prefixes.

♻️ Proposed guard
             # The crdtp headers include their siblings by bare name.
             sibling = os.path.normpath(os.path.join(os.path.dirname(rel), inc))
-            if resolve(sibling) is not None:
+            if sibling.startswith(VENDORED_PREFIXES) and resolve(sibling) is not None:
                 queue.append(sibling)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/v8/vendor_inspector_sources.py` around lines 80 - 93, Constrain sibling
fallback resolution in the include-discovery logic to paths under
VENDORED_PREFIXES before queuing them in queue. Ensure out-of-prefix normalized
paths are ignored and are not copied into dest, while preserving resolution for
valid vendored siblings.

75-75: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use a context manager and reuse the resolved path.

Line 75 leaks the handle outside CPython's refcounting, and line 93 re-runs resolve() for every file already resolved in the walk. Caching the resolved path in a dict keyed by rel fixes both.

♻️ Proposed refactor
-    seen, queue, missing = set(), list(ROOTS), []
+    resolved, queue, missing = {}, list(ROOTS), []
     while queue:
         rel = queue.pop()
-        if rel in seen:
+        if rel in resolved:
             continue
         src = resolve(rel)
         if src is None:
             missing.append(rel)
             continue
-        seen.add(rel)
-        text = open(src, encoding="utf-8", errors="replace").read()
+        resolved[rel] = src
+        with open(src, encoding="utf-8", errors="replace") as f:
+            text = f.read()
-    for rel in sorted(seen):
+    for rel in sorted(resolved):
         out = os.path.join(dest, rel)
         os.makedirs(os.path.dirname(out), exist_ok=True)
-        shutil.copyfile(resolve(rel), out)
+        shutil.copyfile(resolved[rel], out)
 
-    print(f"vendored {len(seen)} files into {dest}")
+    print(f"vendored {len(resolved)} files into {dest}")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/v8/vendor_inspector_sources.py` at line 75, Update the source-reading
logic in the vendor inspection walk to open files through a context manager,
ensuring handles close on all Python implementations. Reuse each file’s already
resolved path by caching it in a dict keyed by rel, and use that cached path at
the later read site instead of calling resolve() again.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/knowledge/v8-14-migration.md`:
- Around line 214-217: Update the “Known follow-ups” bullet to state that the
32-bit ABIs require Linux x64 builders, replacing the outdated claim that
armeabi-v7a and x86 still contain V8 10.3 libraries. Preserve the existing
reference to the builder details above.

In `@download_v8.sh`:
- Around line 70-73: Update the early-return check in download_v8.sh to store
the selected ABI set in STAMP and require it to match the current request.
Before skipping, validate that every requested ABI library and its generated
header tree exists; otherwise continue the download, while preserving --force
behavior and refreshing the stamp after a successful installation.
- Around line 87-112: Authenticate the downloaded SHA256SUMS manifest
independently before using it in the checksum verification flow. Update the
download logic around fetch SHA256SUMS and the subsequent ASSETS verification to
validate a pinned trusted digest/signature or independent release attestation,
failing before any archive is unpacked when authentication fails.

In `@test-app/app/build.gradle`:
- Around line 45-47: Centralize `-Pabis` parsing and validation in a shared
helper used by both Gradle modules, trimming entries and rejecting empty,
invalid, or project-unsupported ABIs before they reach native configuration.
Update the `selectedAbis` logic at test-app/app/build.gradle:45-47 and
test-app/runtime/build.gradle:14-16, then apply the validated values in each
`abiFilters` branch at test-app/app/build.gradle:231-233 and
test-app/runtime/build.gradle:126-131; preserve the existing behavior when no
property is supplied.

---

Nitpick comments:
In `@tools/v8/vendor_inspector_sources.py`:
- Around line 80-93: Constrain sibling fallback resolution in the
include-discovery logic to paths under VENDORED_PREFIXES before queuing them in
queue. Ensure out-of-prefix normalized paths are ignored and are not copied into
dest, while preserving resolution for valid vendored siblings.
- Line 75: Update the source-reading logic in the vendor inspection walk to open
files through a context manager, ensuring handles close on all Python
implementations. Reuse each file’s already resolved path by caching it in a dict
keyed by rel, and use that cached path at the later read site instead of calling
resolve() again.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 01825bed-80f2-45a6-897d-7aa3f4b33d66

📥 Commits

Reviewing files that changed from the base of the PR and between 34196a7 and 7264c3b.

📒 Files selected for processing (332)
  • .github/workflows/npm_release.yml
  • .github/workflows/pull_request.yml
  • .gitignore
  • V8_RELEASE
  • build.sh
  • docs/README.md
  • docs/knowledge/v8-14-migration.md
  • download_v8.sh
  • package.json
  • test-app/app/build.gradle
  • test-app/runtime/build.gradle
  • test-app/runtime/src/main/cpp/ArgConverter.cpp
  • test-app/runtime/src/main/cpp/ArgsWrapper.h
  • test-app/runtime/src/main/cpp/ArrayBufferHelper.cpp
  • test-app/runtime/src/main/cpp/ArrayElementAccessor.cpp
  • test-app/runtime/src/main/cpp/ArrayHelper.cpp
  • test-app/runtime/src/main/cpp/CallbackHandlers.cpp
  • test-app/runtime/src/main/cpp/ErrorEvents.cpp
  • test-app/runtime/src/main/cpp/Events.cpp
  • test-app/runtime/src/main/cpp/Interop.cpp
  • test-app/runtime/src/main/cpp/JSONObjectHelper.cpp
  • test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp
  • test-app/runtime/src/main/cpp/JsV8InspectorClient.cpp
  • test-app/runtime/src/main/cpp/MessageLoopTimer.cpp
  • test-app/runtime/src/main/cpp/MetadataNode.cpp
  • test-app/runtime/src/main/cpp/MetadataNode.h
  • test-app/runtime/src/main/cpp/MethodCache.cpp
  • test-app/runtime/src/main/cpp/ModuleInternal.cpp
  • test-app/runtime/src/main/cpp/ModuleInternalCallbacks.cpp
  • test-app/runtime/src/main/cpp/NativeScriptException.cpp
  • test-app/runtime/src/main/cpp/NumericCasts.cpp
  • test-app/runtime/src/main/cpp/ObjectManager.cpp
  • test-app/runtime/src/main/cpp/Profiler.cpp
  • test-app/runtime/src/main/cpp/Runtime.cpp
  • test-app/runtime/src/main/cpp/Timers.cpp
  • test-app/runtime/src/main/cpp/URLImpl.cpp
  • test-app/runtime/src/main/cpp/URLImpl.h
  • test-app/runtime/src/main/cpp/URLPatternImpl.cpp
  • test-app/runtime/src/main/cpp/URLSearchParamsImpl.cpp
  • test-app/runtime/src/main/cpp/URLSearchParamsImpl.h
  • test-app/runtime/src/main/cpp/Util.cpp
  • test-app/runtime/src/main/cpp/V8GlobalHelpers.cpp
  • test-app/runtime/src/main/cpp/WorkerInspectorClient.cpp
  • test-app/runtime/src/main/cpp/WorkerMessage.cpp
  • test-app/runtime/src/main/cpp/WorkerWrapper.cpp
  • test-app/runtime/src/main/cpp/console/Console.cpp
  • test-app/runtime/src/main/cpp/console/Console.h
  • test-app/runtime/src/main/cpp/include/APIDesign.md
  • test-app/runtime/src/main/cpp/include/DEPS
  • test-app/runtime/src/main/cpp/include/DIR_METADATA
  • test-app/runtime/src/main/cpp/include/OWNERS
  • test-app/runtime/src/main/cpp/include/cppgc/DEPS
  • test-app/runtime/src/main/cpp/include/cppgc/OWNERS
  • test-app/runtime/src/main/cpp/include/cppgc/README.md
  • test-app/runtime/src/main/cpp/include/cppgc/allocation.h
  • test-app/runtime/src/main/cpp/include/cppgc/common.h
  • test-app/runtime/src/main/cpp/include/cppgc/cross-thread-persistent.h
  • test-app/runtime/src/main/cpp/include/cppgc/custom-space.h
  • test-app/runtime/src/main/cpp/include/cppgc/default-platform.h
  • test-app/runtime/src/main/cpp/include/cppgc/ephemeron-pair.h
  • test-app/runtime/src/main/cpp/include/cppgc/explicit-management.h
  • test-app/runtime/src/main/cpp/include/cppgc/garbage-collected.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap-consistency.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap-state.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap-statistics.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/api-constants.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/atomic-entry-flag.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/caged-heap-local-data.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/compiler-specific.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/finalizer-trait.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/gc-info.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/logging.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/name-trait.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/persistent-node.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/pointer-policies.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/write-barrier.h
  • test-app/runtime/src/main/cpp/include/cppgc/liveness-broker.h
  • test-app/runtime/src/main/cpp/include/cppgc/macros.h
  • test-app/runtime/src/main/cpp/include/cppgc/member.h
  • test-app/runtime/src/main/cpp/include/cppgc/name-provider.h
  • test-app/runtime/src/main/cpp/include/cppgc/object-size-trait.h
  • test-app/runtime/src/main/cpp/include/cppgc/persistent.h
  • test-app/runtime/src/main/cpp/include/cppgc/platform.h
  • test-app/runtime/src/main/cpp/include/cppgc/prefinalizer.h
  • test-app/runtime/src/main/cpp/include/cppgc/process-heap-statistics.h
  • test-app/runtime/src/main/cpp/include/cppgc/sentinel-pointer.h
  • test-app/runtime/src/main/cpp/include/cppgc/source-location.h
  • test-app/runtime/src/main/cpp/include/cppgc/testing.h
  • test-app/runtime/src/main/cpp/include/cppgc/trace-trait.h
  • test-app/runtime/src/main/cpp/include/cppgc/type-traits.h
  • test-app/runtime/src/main/cpp/include/cppgc/visitor.h
  • test-app/runtime/src/main/cpp/include/inspector/Debugger.h
  • test-app/runtime/src/main/cpp/include/inspector/Runtime.h
  • test-app/runtime/src/main/cpp/include/inspector/Schema.h
  • test-app/runtime/src/main/cpp/include/js_protocol-1.2.json
  • test-app/runtime/src/main/cpp/include/js_protocol-1.3.json
  • test-app/runtime/src/main/cpp/include/js_protocol.pdl
  • test-app/runtime/src/main/cpp/include/libplatform/DEPS
  • test-app/runtime/src/main/cpp/include/libplatform/libplatform-export.h
  • test-app/runtime/src/main/cpp/include/libplatform/libplatform.h
  • test-app/runtime/src/main/cpp/include/libplatform/v8-tracing.h
  • test-app/runtime/src/main/cpp/include/v8-array-buffer.h
  • test-app/runtime/src/main/cpp/include/v8-callbacks.h
  • test-app/runtime/src/main/cpp/include/v8-container.h
  • test-app/runtime/src/main/cpp/include/v8-context.h
  • test-app/runtime/src/main/cpp/include/v8-cppgc.h
  • test-app/runtime/src/main/cpp/include/v8-data.h
  • test-app/runtime/src/main/cpp/include/v8-date.h
  • test-app/runtime/src/main/cpp/include/v8-debug.h
  • test-app/runtime/src/main/cpp/include/v8-embedder-heap.h
  • test-app/runtime/src/main/cpp/include/v8-embedder-state-scope.h
  • test-app/runtime/src/main/cpp/include/v8-exception.h
  • test-app/runtime/src/main/cpp/include/v8-extension.h
  • test-app/runtime/src/main/cpp/include/v8-external.h
  • test-app/runtime/src/main/cpp/include/v8-fast-api-calls.h
  • test-app/runtime/src/main/cpp/include/v8-forward.h
  • test-app/runtime/src/main/cpp/include/v8-function-callback.h
  • test-app/runtime/src/main/cpp/include/v8-function.h
  • test-app/runtime/src/main/cpp/include/v8-initialization.h
  • test-app/runtime/src/main/cpp/include/v8-inspector-protocol.h
  • test-app/runtime/src/main/cpp/include/v8-inspector.h
  • test-app/runtime/src/main/cpp/include/v8-internal.h
  • test-app/runtime/src/main/cpp/include/v8-isolate.h
  • test-app/runtime/src/main/cpp/include/v8-json.h
  • test-app/runtime/src/main/cpp/include/v8-local-handle.h
  • test-app/runtime/src/main/cpp/include/v8-locker.h
  • test-app/runtime/src/main/cpp/include/v8-maybe.h
  • test-app/runtime/src/main/cpp/include/v8-memory-span.h
  • test-app/runtime/src/main/cpp/include/v8-message.h
  • test-app/runtime/src/main/cpp/include/v8-metrics.h
  • test-app/runtime/src/main/cpp/include/v8-microtask-queue.h
  • test-app/runtime/src/main/cpp/include/v8-microtask.h
  • test-app/runtime/src/main/cpp/include/v8-object.h
  • test-app/runtime/src/main/cpp/include/v8-persistent-handle.h
  • test-app/runtime/src/main/cpp/include/v8-platform.h
  • test-app/runtime/src/main/cpp/include/v8-primitive-object.h
  • test-app/runtime/src/main/cpp/include/v8-primitive.h
  • test-app/runtime/src/main/cpp/include/v8-profiler.h
  • test-app/runtime/src/main/cpp/include/v8-promise.h
  • test-app/runtime/src/main/cpp/include/v8-proxy.h
  • test-app/runtime/src/main/cpp/include/v8-regexp.h
  • test-app/runtime/src/main/cpp/include/v8-script.h
  • test-app/runtime/src/main/cpp/include/v8-snapshot.h
  • test-app/runtime/src/main/cpp/include/v8-statistics.h
  • test-app/runtime/src/main/cpp/include/v8-template.h
  • test-app/runtime/src/main/cpp/include/v8-traced-handle.h
  • test-app/runtime/src/main/cpp/include/v8-typed-array.h
  • test-app/runtime/src/main/cpp/include/v8-unwinder-state.h
  • test-app/runtime/src/main/cpp/include/v8-unwinder.h
  • test-app/runtime/src/main/cpp/include/v8-util.h
  • test-app/runtime/src/main/cpp/include/v8-value-serializer-version.h
  • test-app/runtime/src/main/cpp/include/v8-value-serializer.h
  • test-app/runtime/src/main/cpp/include/v8-value.h
  • test-app/runtime/src/main/cpp/include/v8-version-string.h
  • test-app/runtime/src/main/cpp/include/v8-version.h
  • test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-posix.h
  • test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-win.h
  • test-app/runtime/src/main/cpp/include/v8-wasm.h
  • test-app/runtime/src/main/cpp/include/v8-weak-callback-info.h
  • test-app/runtime/src/main/cpp/include/v8.h
  • test-app/runtime/src/main/cpp/include/v8config.h
  • test-app/runtime/src/main/cpp/v8_inspector/Utils.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/attributes.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/config.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/macros.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/optimization.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/options.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/policy_checks.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/base/port.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/meta/type_traits.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128.h
  • test-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128_have_intrinsic.inc
  • test-app/runtime/src/main/cpp/v8_inspector/absl/numeric/int128_no_intrinsic.inc
  • test-app/runtime/src/main/cpp/v8_inspector/absl/types/compare.h
  • test-app/runtime/src/main/cpp/v8_inspector/ns-v8-tracing-agent-impl.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/address-region.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/atomic-utils.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/atomicops.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/base-export.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/bit-field.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/bits-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/bits.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/bounded-page-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/bounds.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/build_config.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/compiler-specific.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/cpu.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/division-by-constant.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/emulated-virtual-address-subspace.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/enum-set.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/export-template.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/file-utils.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/flags.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/free_deleter.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/functional.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/hashmap-entry.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/hashmap.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/ieee754.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/immediate-crash.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/lazy-instance.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/logging.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/macros.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/memory.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/once.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/optional.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/overflowing-math.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/page-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/condition-variable.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/elapsed-timer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/mutex.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-linux.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix-time.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/semaphore.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/time.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/wrappers.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/yield-processor.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/pointer-with-payload.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/qnx-math.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/region-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/ring-buffer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_arm_impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/small-vector.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/strings.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/sys-info.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/template-utils.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/threaded-list.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/timezone-cache.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/v8-fallthrough.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vector.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space-page-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq-base64.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/win32-headers.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/allow-deprecated.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/assert-scope.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/checks.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access-inl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/globals.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/high-allocation-throughput-scope.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/message-template.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/operation.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr-inl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-coverage.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-evaluate.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-frames.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-interface.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-property-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scope-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scopes.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-stack-trace-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-type-profile.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects-inl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/interface-types.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/liveedit.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/custom-preview.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/injected-script.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspected-context.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspector_protocol_config.json
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Forward.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Protocol.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Protocol.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Runtime.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Runtime.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Schema.cpp
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Schema.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/base_string_adapter.cc
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/base_string_adapter.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/remote-object-id.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/search-util.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/string-16.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/string-util.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/test-interface.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console-message.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-console.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-id.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger-script.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-debugger.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-session-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-profiler-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-regex.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-runtime-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-schema-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-stack-trace-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-string-conversions.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-value-utils.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-webdriver-serializer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/value-mirror.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/cbor.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/dispatch.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/error_support.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/export.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/find_by_first.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/frontend_channel.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/glue.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json_platform.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/maybe.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/parser_handler.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/protocol_core.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/serializable.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/span.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status_test_support.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/test_platform.h
  • test-app/runtime/src/main/libs/arm64-v8a/libv8_monolith.a
  • test-app/runtime/src/main/libs/armeabi-v7a/libv8_monolith.a
  • test-app/runtime/src/main/libs/x86/libv8_monolith.a
  • test-app/runtime/src/main/libs/x86_64/libv8_monolith.a
  • tools/v8/vendor_inspector_sources.py
💤 Files with no reviewable changes (220)
  • test-app/runtime/src/main/cpp/include/DIR_METADATA
  • test-app/runtime/src/main/cpp/include/v8-local-handle.h
  • test-app/runtime/src/main/cpp/include/cppgc/README.md
  • test-app/runtime/src/main/cpp/include/v8-value.h
  • test-app/runtime/src/main/cpp/include/v8-value-serializer-version.h
  • test-app/runtime/src/main/cpp/include/OWNERS
  • test-app/runtime/src/main/cpp/include/libplatform/DEPS
  • test-app/runtime/src/main/cpp/include/cppgc/common.h
  • test-app/runtime/src/main/cpp/include/APIDesign.md
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/high-allocation-throughput-scope.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap-state.h
  • test-app/runtime/src/main/cpp/include/v8-memory-span.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/atomic-entry-flag.h
  • test-app/runtime/src/main/cpp/include/v8-extension.h
  • test-app/runtime/src/main/cpp/include/cppgc/allocation.h
  • test-app/runtime/src/main/cpp/include/v8.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq-base64.h
  • test-app/runtime/src/main/cpp/include/v8-version.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/error_support.h
  • test-app/runtime/src/main/cpp/include/cppgc/explicit-management.h
  • test-app/runtime/src/main/cpp/include/libplatform/libplatform-export.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/export.h
  • test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-posix.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/compiler-specific.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-linux.h
  • test-app/runtime/src/main/cpp/include/cppgc/name-provider.h
  • test-app/runtime/src/main/cpp/include/cppgc/prefinalizer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.cpp
  • test-app/runtime/src/main/cpp/include/cppgc/liveness-broker.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/yield-processor.h
  • test-app/runtime/src/main/cpp/include/cppgc/sentinel-pointer.h
  • test-app/runtime/src/main/cpp/include/v8-unwinder-state.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/maybe.h
  • test-app/runtime/src/main/cpp/include/v8-util.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/v8-fallthrough.h
  • test-app/runtime/src/main/cpp/include/cppgc/OWNERS
  • test-app/runtime/src/main/cpp/include/v8-proxy.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-webdriver-serializer.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/glue.h
  • test-app/runtime/src/main/cpp/include/cppgc/platform.h
  • test-app/runtime/src/main/cpp/include/cppgc/custom-space.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-stack-trace-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scope-iterator.h
  • test-app/runtime/src/main/cpp/include/v8-json.h
  • test-app/runtime/src/main/cpp/include/v8-microtask.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix-time.h
  • test-app/runtime/src/main/cpp/include/v8-data.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/operation.h
  • test-app/runtime/src/main/cpp/include/inspector/Runtime.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-schema-agent-impl.h
  • test-app/runtime/src/main/cpp/include/v8-forward.h
  • test-app/runtime/src/main/cpp/include/v8-embedder-state-scope.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json_platform.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/liveedit.h
  • test-app/runtime/src/main/cpp/include/cppgc/DEPS
  • test-app/runtime/src/main/cpp/include/cppgc/heap-statistics.h
  • test-app/runtime/src/main/cpp/include/DEPS
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.cpp
  • test-app/runtime/src/main/cpp/include/cppgc/ephemeron-pair.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/find_by_first.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_arm_impl.h
  • test-app/runtime/src/main/cpp/include/v8-locker.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-regex.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/memory.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform-posix.h
  • test-app/runtime/src/main/cpp/include/v8-metrics.h
  • test-app/runtime/src/main/cpp/include/v8-weak-callback-info.h
  • test-app/runtime/src/main/cpp/include/inspector/Debugger.h
  • test-app/runtime/src/main/cpp/include/v8-primitive-object.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/gc-info.h
  • test-app/runtime/src/main/cpp/include/v8-function-callback.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/small-vector.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-frames.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-profiler-agent-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access.h
  • test-app/runtime/src/main/cpp/include/cppgc/source-location.h
  • test-app/runtime/src/main/cpp/include/v8-promise.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/elapsed-timer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/pointer-with-payload.h
  • test-app/runtime/src/main/cpp/include/v8-date.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/logging.h
  • test-app/runtime/src/main/cpp/include/v8-microtask-queue.h
  • test-app/runtime/src/main/cpp/include/cppgc/object-size-trait.h
  • test-app/runtime/src/main/cpp/include/v8-template.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/caged-heap-local-data.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/sys-info.h
  • test-app/runtime/src/main/cpp/include/v8-version-string.h
  • test-app/runtime/src/main/cpp/include/v8-debug.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/api-constants.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/qnx-math.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space-page-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/wrappers.h
  • test-app/runtime/src/main/cpp/include/cppgc/process-heap-statistics.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-string-conversions.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/page-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/overflowing-math.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status_test_support.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/code-memory-access-inl.h
  • test-app/runtime/src/main/cpp/include/v8-initialization.h
  • test-app/runtime/src/main/cpp/include/v8-statistics.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/custom-preview.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/name-trait.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/allow-deprecated.h
  • test-app/runtime/src/main/cpp/include/v8-wasm-trap-handler-win.h
  • test-app/runtime/src/main/cpp/include/v8-function.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/test_platform.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/ring-buffer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/threaded-list.h
  • test-app/runtime/src/main/cpp/include/v8-persistent-handle.h
  • test-app/runtime/src/main/cpp/include/cppgc/macros.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-type-profile.h
  • test-app/runtime/src/main/cpp/include/v8-array-buffer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/once.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects.h
  • test-app/runtime/src/main/cpp/include/cppgc/trace-trait.h
  • test-app/runtime/src/main/cpp/include/v8-exception.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/span.h
  • test-app/runtime/src/main/cpp/include/cppgc/type-traits.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/ptr-compr-inl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/optional.h
  • test-app/runtime/src/main/cpp/include/cppgc/persistent.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/pointer-policies.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspected-context.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-wasm-objects-inl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/message-template.h
  • test-app/runtime/src/main/cpp/include/js_protocol.pdl
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/inspector_protocol_config.json
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/frontend_channel.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/condition-variable.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-runtime-agent-impl.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/finalizer-trait.h
  • test-app/runtime/src/main/cpp/include/v8-inspector-protocol.h
  • test-app/runtime/src/main/cpp/include/libplatform/libplatform.h
  • test-app/runtime/src/main/cpp/include/v8-container.h
  • test-app/runtime/src/main/cpp/include/cppgc/garbage-collected.h
  • test-app/runtime/src/main/cpp/include/cppgc/default-platform.h
  • test-app/runtime/src/main/cpp/include/cppgc/member.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap.h
  • test-app/runtime/src/main/cpp/include/v8-value-serializer.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-value-utils.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/timezone-cache.h
  • test-app/runtime/src/main/cpp/include/v8-regexp.h
  • test-app/runtime/src/main/cpp/include/v8config.h
  • test-app/runtime/src/main/cpp/include/cppgc/testing.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/template-utils.h
  • test-app/runtime/src/main/cpp/include/v8-unwinder.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/persistent-node.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/strings.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/parser_handler.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-property-iterator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/logging.h
  • test-app/runtime/src/main/cpp/include/cppgc/cross-thread-persistent.h
  • test-app/runtime/src/main/cpp/include/cppgc/heap-consistency.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/semaphore.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/dispatch.h
  • test-app/runtime/src/main/cpp/include/v8-message.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-stack-trace-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-evaluate.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/value-mirror.h
  • test-app/runtime/src/main/cpp/include/v8-primitive.h
  • test-app/runtime/src/main/cpp/include/js_protocol-1.3.json
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/protocol_core.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/platform.h
  • test-app/runtime/src/main/cpp/include/libplatform/v8-tracing.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/globals.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-interface.h
  • test-app/runtime/src/main/cpp/include/v8-wasm.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-scopes.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/assert-scope.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/serializable.h
  • test-app/runtime/src/main/cpp/include/cppgc/internal/write-barrier.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/region-allocator.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vector.h
  • test-app/runtime/src/main/cpp/include/js_protocol-1.2.json
  • test-app/runtime/src/main/cpp/include/v8-maybe.h
  • test-app/runtime/src/main/cpp/include/v8-snapshot.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/vlq.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/lazy-instance.h
  • test-app/runtime/src/main/cpp/include/v8-external.h
  • test-app/runtime/src/main/cpp/include/cppgc/visitor.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-inspector-session-impl.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/mutex.h
  • test-app/runtime/src/main/cpp/include/inspector/Schema.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Forward.h
  • test-app/runtime/src/main/cpp/include/v8-callbacks.h
  • test-app/runtime/src/main/cpp/include/v8-platform.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/status.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/platform/time.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/interface-types.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/json.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/injected-script.h
  • test-app/runtime/src/main/cpp/include/v8-traced-handle.h
  • test-app/runtime/src/main/cpp/include/v8-profiler.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/common/checks.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions_impl.h
  • test-app/runtime/src/main/cpp/include/v8-object.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/safe_conversions.h
  • test-app/runtime/src/main/cpp/include/v8-fast-api-calls.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Console.cpp
  • test-app/runtime/src/main/cpp/include/v8-inspector.h
  • test-app/runtime/src/main/cpp/include/v8-embedder-heap.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.cpp
  • test-app/runtime/src/main/cpp/include/v8-isolate.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/win32-headers.h
  • test-app/runtime/src/main/cpp/include/v8-context.h
  • test-app/runtime/src/main/cpp/include/v8-typed-array.h
  • test-app/runtime/src/main/cpp/v8_inspector/third_party/inspector_protocol/crdtp/cbor.h
  • test-app/runtime/src/main/cpp/include/v8-cppgc.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/macros.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/debug/debug-coverage.h
  • test-app/runtime/src/main/cpp/include/v8-internal.h
  • test-app/runtime/src/main/cpp/v8_inspector/src/base/virtual-address-space.h
  • test-app/runtime/src/main/cpp/include/v8-script.h

Comment thread docs/knowledge/v8-14-migration.md Outdated
Comment thread download_v8.sh Outdated
Comment on lines +70 to +73
if [ "$FORCE" = "0" ] && [ -f "$STAMP" ] && [ "$(cat "$STAMP")" = "$RELEASE" ]; then
echo "V8 $RELEASE already installed. Use --force to reinstall."
exit 0
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Record and validate the installed ABI set in the stamp.

The stamp stores only RELEASE, so ./download_v8.sh --abi arm64-v8a can mark the release installed; a later default invocation then skips downloading the other three ABIs. It also skips when files are missing after a partial or deleted installation. Store the selected ABI set and validate every requested library and generated header tree before returning early.

Also applies to: 147-147

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@download_v8.sh` around lines 70 - 73, Update the early-return check in
download_v8.sh to store the selected ABI set in STAMP and require it to match
the current request. Before skipping, validate that every requested ABI library
and its generated header tree exists; otherwise continue the download, while
preserving --force behavior and refreshing the stamp after a successful
installation.

Comment thread download_v8.sh
Comment on lines +87 to +112
echo "Installing V8 $RELEASE from $UPSTREAM"
fetch SHA256SUMS

ASSETS=()
for ABI in "${ABIS[@]}"; do
ASSETS+=("$(grep -oE "v8-[^ ]*-android-$ABI\.tar\.gz" "$DL/SHA256SUMS" | head -1)")
done
ASSETS+=("$(grep -oE 'v8-[^ ]*-src-headers\.tar\.gz' "$DL/SHA256SUMS" | head -1)")

for a in "${ASSETS[@]}"; do
[ -n "$a" ] || { echo "Release $RELEASE is missing an expected asset." >&2; exit 1; }
fetch "$a"
done

# Verify before unpacking anything. A release is only trustworthy because the
# archive matches the checksum published with it.
#
# Linux has sha256sum, macOS has shasum; neither has both reliably.
if command -v sha256sum > /dev/null 2>&1; then
SHA256_CHECK="sha256sum -c -"
else
SHA256_CHECK="shasum -a 256 -c -"
fi
echo "Verifying checksums"
( cd "$DL" && grep -E "$(printf '%s|' "${ASSETS[@]}" | sed 's/|$//')" SHA256SUMS | $SHA256_CHECK ) \
|| { echo "Checksum verification FAILED for $RELEASE" >&2; exit 1; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== files =="
git ls-files | sed -n '1,120p'
echo

echo "== download_v8.sh outline/size =="
wc -l download_v8.sh 2>/dev/null || true
ast-grep outline download_v8.sh 2>/dev/null || true
echo

echo "== relevant section =="
nl -ba download_v8.sh | sed -n '1,150p'
echo

echo "== search for release signing/auth related terms =="
rg -n "SHA256SUMS|sign|signature|gpg|github|release|V8|fetch|checksum|attestation|provenance" . || true

Repository: NativeScript/android

Length of output: 6128


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== download_v8.sh =="
awk '{ printf "%6d  %s\n", NR, $0 }' download_v8.sh
echo

echo "== related references =="
grep -En "SHA256SUMS|sign|signature|gpg|github|release|V8|fetch|checksum|attestation|provenance" . || true
echo

echo "== workflow references =="
grep -En "download_v8|V8_RELEASE|fetch|curl|gh release|assets|SHA256SUMS|v8" .github scripts 2>/dev/null || true

Repository: NativeScript/android

Length of output: 6537


Authenticate SHA256SUMS independently.

SHA256SUMS is fetched from the same GitHub release before checksums are checked, so a compromised release can replace the manifest and archive together and still pass verification. Pin a trusted digest/signature for SHA256SUMS, or verify an independent release attestation before unpacking.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@download_v8.sh` around lines 87 - 112, Authenticate the downloaded SHA256SUMS
manifest independently before using it in the checksum verification flow. Update
the download logic around fetch SHA256SUMS and the subsequent ASSETS
verification to validate a pinned trusted digest/signature or independent
release attestation, failing before any archive is unpacked when authentication
fails.

Comment thread test-app/app/build.gradle Outdated
Comment on lines +45 to +47
// -Pabis=arm64-v8a,x86_64 restricts the build to those ABIs. Needed because the
// 32-bit V8 monoliths can only be produced on a Linux x64 host.
def selectedAbis = project.hasProperty("abis") ? project.property("abis").split(",").collect { it.trim() } : null

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "## candidate build.gradle files"
fd -a 'build\.gradle$' . | sed 's#^\./##' | head -50

echo
echo "## test-app/app/build.gradle relevant sections"
if [ -f test-app/app/build.gradle ]; then
  wc -l test-app/app/build.gradle
  sed -n '1,70p;210,245p' test-app/app/build.gradle | cat -n
fi

echo
echo "## test-app/runtime/build.gradle relevant sections"
if [ -f test-app/runtime/build.gradle ]; then
  wc -l test-app/runtime/build.gradle
  sed -n '1,30p;115,140p' test-app/runtime/build.gradle | cat -n
fi

echo
echo "## search for abiFilters/selectors and abis property"
rg -n "abiFilters|selectedAbis|onlyX86|hasProperty\\(\"abis\"\\)|property\\(\"abis\"\\)" test-app || true

Repository: NativeScript/android

Length of output: 8834


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "## candidate build.gradle files"
fd -a 'build\.gradle$' . | sed 's#^\./##' | head -50

echo
echo "## test-app/app/build.gradle relevant sections"
if [ -f test-app/app/build.gradle ]; then
  wc -l test-app/app/build.gradle
  sed -n '1,70p;210,245p' test-app/app/build.gradle | cat -n
fi

echo
echo "## test-app/runtime/build.gradle relevant sections"
if [ -f test-app/runtime/build.gradle ]; then
  wc -l test-app/runtime/build.gradle
  sed -n '1,30p;115,140p' test-app/runtime/build.gradle | cat -n
fi

echo
echo "## search for abis property selectors and abiFilters"
rg -n "abiFilters|selectedAbis|onlyX86|hasProperty\\(\"abis\"\\)|property\\(\"abis\"\\)" test-app || true

Repository: NativeScript/android

Length of output: 8834


Validate and centralize -Pabis before applying abiFilters.

Both modules independently parse user-controlled -Pabis values and pass them into native abiFilters; normalized entries such as "", invalid ABIs, or unsupported ABIs (for this project) can block or produce invalid native builds. Move a shared validation helper to both Gradle modules and reject empty/unsupported values in each abiFilters branch.

📍 Affects 2 files
  • test-app/app/build.gradle#L45-L47 (this comment)
  • test-app/app/build.gradle#L231-L233
  • test-app/runtime/build.gradle#L14-L16
  • test-app/runtime/build.gradle#L126-L131
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test-app/app/build.gradle` around lines 45 - 47, Centralize `-Pabis` parsing
and validation in a shared helper used by both Gradle modules, trimming entries
and rejecting empty, invalid, or project-unsupported ABIs before they reach
native configuration. Update the `selectedAbis` logic at
test-app/app/build.gradle:45-47 and test-app/runtime/build.gradle:14-16, then
apply the validated values in each `abiFilters` branch at
test-app/app/build.gradle:231-233 and test-app/runtime/build.gradle:126-131;
preserve the existing behavior when no property is supplied.

The stamp records only the release, so `--abi arm64-v8a` marked it
installed and the next bare run -- which is what build.sh and every CI
call site does -- skipped the other three ABIs, surfacing as a CMake link
error rather than a message. The installed files are now the check.
`-Pabis=` split to a single empty string rather than an empty list, so it
reached abiFilters and failed in AGP as "ABIs [] are not supported".
All four ABIs come from the pinned release now; what survives is the
constraint that only an ia32-capable Linux host can build the 32-bit two.
From v8-14.9.207.39-2 the shared patch also lifts the
DisallowJavascriptExecution scope V8 14.9 holds across a collection. This
runtime does not depend on it, but it shares the patch, so the note says
which release carries it and why iOS needs it.
Picks up the finalizer patch change that lifts V8 14.9's
DisallowJavascriptExecution for the finalizer drain. This runtime does not
depend on it -- JSObjectFinalizer only makes a runtime-internal JNI call --
but both runtimes track the same release.
Keeps both runtimes on one release. The change in -3 is iOS-only
(cppgc_enable_caged_heap=false, to stop an 8 GiB address-space reservation
that fails on smaller iOS devices); Android's gn args are unchanged, so
these artifacts are configuration-identical to -2.
The non-optimized branch of the runtime CMakeLists was treated as a
local-debug-only path, but it is also what builds
runtime-regular-release.aar, published as nativescript-regular.aar.
test-app/app/build.gradle switches an app onto that artifact whenever
its package.json sets android.useV8Symbols or any NativeScript
dependency declares nativescript.useV8Symbols, so apps that need V8's
symbols exported were shipping a runtime built without
-fvisibility=hidden, -ffunction-sections or -fno-data-sections.

Gate the branch on CMAKE_BUILD_TYPE instead: AGP passes Debug for the
debug variant and RelWithDebInfo for release, so local native debugging
keeps plain -g while every shipped flavour gets the release flags. Also
drops the stale commented-out duplicate of the optimized flag line.
CMake appends CMAKE_CXX_FLAGS_<CONFIG> after CMAKE_CXX_FLAGS, and clang
honours the last -O on the command line. AGP builds the release variant as
RelWithDebInfo, whose default flags are "-O2 -g -DNDEBUG", so the -O3 set in
CMAKE_CXX_FLAGS was overridden and every shipped runtime was compiled at -O2.

Append -O3 to CMAKE_CXX_FLAGS_RELWITHDEBINFO inside the same branch so it
comes last. The -O3 in CMAKE_CXX_FLAGS stays: CMAKE_CXX_FLAGS_DEBUG carries
no -O, so a Debug-config build with -Poptimized still needs it.
set_target_properties takes key/value pairs, so the unquoted

    PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition -Wl,--exclude-libs=ALL -Wl,--gc-sections

set LINK_FLAGS to only -Wl,--allow-multiple-definition and then read
-Wl,--exclude-libs=ALL as a property name whose value was -Wl,--gc-sections,
which CMake silently discarded. libNativeScript.so was therefore exporting
72,662 dynamic symbols on arm64-v8a, 12.1 MiB of them .dynstr for names V8
never meant to publish.

Quote the flag list so all three apply, and hide the internals with a linker
version script rather than --exclude-libs=ALL: the latter would also hide
V8's public API, which plugins link against. exported-symbols.map keeps the
JNI entry points and v8::/cppgc:: public API global and everything else
local.

arm64-v8a, stripped: 47,433,360 -> 26,773,104 bytes; 72,662 -> 1,748
exported symbols, of which 8 v8::internal:: template instantiations whose
demangled name begins with a v8::Maybe<T> return type.
The arguments.add line was commented out, so -PoptimizedWithInspector only
ever changed the AAR's name. CMake never saw OPTIMIZED_WITH_INSPECTOR_BUILD,
which left every
`if (OPTIMIZED_BUILD OR OPTIMIZED_WITH_INSPECTOR_BUILD)` branch in the
runtime CMakeLists false: the variant was linked with no version script and
was otherwise configuration-identical to nativescript-regular.

That variant is not a niche one. test-app/app/build.gradle only switches to
nativescript-optimized for release tasks, so nativescript-optimized-with-
inspector is the runtime behind every non-release app build.

Uncommenting it restores the intended link configuration. The inspector
sources stay compiled in - the guard around them is
`if (NOT OPTIMIZED_BUILD OR OPTIMIZED_WITH_INSPECTOR_BUILD)`, and
OPTIMIZED_BUILD is not set for this variant.

arm64-v8a, stripped: 48,728,448 -> 27,723,384 bytes; 74,687 -> 1,788
exported dynamic symbols. Java_com_tns_AndroidJsV8Inspector_init and the
v8:: public API remain exported; runtime suite 594/594.
@NathanWalker
NathanWalker merged commit c08a91b into main Aug 3, 2026
8 checks passed
@NathanWalker
NathanWalker deleted the feat/v8-14 branch August 3, 2026 15:27
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