All notable changes to this project will be documented in this file.
- network-throttle: Publish the merged
@onekeyfe/react-native-network-throttlenative module from main.
- Bump packages to 3.0.73 after 3.0.72 was already published.
- Bump packages to 3.0.72.
- sni-connect: Add
@onekeyfe/react-native-sni-connect, a native module for direct-IP HTTPS requests with SNI/certificate hostname verification, cancellation APIs, DNS cache cleanup, proxy detection, timeout controls, and multi-value response headers. - sni-connect (iOS): Implement EMASCurl-backed requests with a custom DNS resolver, request cancellation, DNS cache cleanup on memory warnings, and Pod integration for the example app.
- sni-connect (Android): Implement OkHttp-backed direct-IP requests with hostname validation, pinned DNS resolution, request lifecycle tracking, cancellation, and proxy preflight support.
- sni-connect: Harden request validation and safety checks across both platforms, including hostname/IP/path/method/header validation, private/reserved IP rejection, proxy preflight behavior, request-slot cleanup, and structured diagnostic logging.
- sni-connect: Add README, SPEC, SwiftPM test harness, and platform validation tests covering the SNI request contract.
- example: Wire
@onekeyfe/react-native-sni-connectinto the example app and refresh iOS Pods. - Bump all packages to 3.0.71.
- Republish packages as 3.0.70; no code changes.
- network-throttle: Publish the short-lived
@onekeyfe/react-native-network-throttlenative development helper withgetConfig/setConfigAPIs and a slow-4G latency profile for iOS/Android request throttling. - sni-connect: Publish the initial
@onekeyfe/react-native-sni-connectrelease line with direct-IP HTTPS request support, cancellation, DNS cache cleanup, proxy detection, and native iOS/Android implementations.
- Bump packages to 3.0.69.
- range-downloader: Add OCDS v1.1 conformance support for iOS and Android concurrent downloads, including typed outcomes, monotonic progress gating, retry classification, segment artifact sweeping, and pure range-download logic shared with tests.
- app-update / bundle-update: Adopt the OCDS concurrent downloader path for APK and JS-bundle downloads, wiring typed failure handling and segment-file resume behavior through the module integrations.
- tab-view: Add
selectedIconssupport so native iOS tab-bar items can use a distinct selected image or SF Symbol.
- app-update (Android): Do not block APK update flow when package signing information is unavailable; treat unverifiable existing APK state as indeterminate instead of deleting or rejecting usable downloads.
- app-update (Android): Await concurrent downloader cancellation before cache cleanup deletes
.segNartifacts, preventing workers from racing deleted segment files. - range-downloader: Reject malformed/multipart range responses, handle transient 5xx and 416 resume paths, guard read-only filesystem failures, and add single-flight run registry coverage.
- bundle-update: Carry OCDS-compatible concurrent-download handling through Android and iOS bundle installation paths.
- range-downloader: Add the OneKey Concurrent Download Standard (OCDS) spec, conformance README, iOS simulator harness, and Android/iOS unit-test coverage for the downloader contract.
- example: Refresh iOS
Podfile.lockafter downloader changes. - Bump all packages to 3.0.68.
- split-bundle-loader (Android): Align the native
.soLOAD segments to 16 KB pages withtarget_link_options, fixing Android 15 / API 35 page-size compatibility for the split-bundle JSI library.
- Bump all packages to 3.0.67.
- range-downloader: Unified shared
ConcurrentRangeDownloaderimplementation used by bothapp-updateandbundle-update; segments stream into<partial>.segNfiles and are concatenated into the final.partial, removing full-file pre-allocation and EROFS/ENOSPC risk on near-full devices. - app-update (Android): APK downloads moved from
cacheDir/apkstofilesDir/apksto avoid system cache reclamation (EROFS/ENOSPC) during downloads;FileProviderpath updated while keeping legacy cache-path compatibility.
- app-update / bundle-update / range-downloader: Harden concurrent range downloader and resume logic — use OkHttp
.use()to close responses, validate 206Content-Rangestart bounds, sweep stale sibling.segNartifacts, make progress reporting thread-safe viaAtomicInteger+ CAS, and remove unconditional ETag/If-Rangepinning so final SHA256/GPG verify remains the correctness backstop. - app-update / bundle-update / range-downloader: Clean up partial
.segNfiles on promote/discard, close leaked ASC responses, fix duplicate progress events, and treat 206Content-Rangemismatches as retryable errors that wipe partial artifacts. - app-update (Android): Pass absolute path to the concurrent downloader so segment files are written under
filesDirinstead of the read-only root filesystem.
- Bump all packages to 3.0.66.
- split-bundle-loader (iOS): Replace the bare
dispatch_aftersegment-eval watchdog withSBLActiveWatchdog, aCLOCK_UPTIME_RAWactive-time accumulator that pauses onWillResignActiveand resumes with a 500 ms grace onDidBecomeActive, preventing falseSPLIT_BUNDLE_TIMEOUTwhite-screens when the app is suspended during cold start. - split-bundle-loader (iOS): Pause the active-time watchdog synchronously on lifecycle transitions so a pending timer tick cannot fold suspended time into the active interval.
- Bump all packages to 3.0.65.
- background-thread (Android): Harden coalesced runtime work against five concurrency issues — guard
gBgTimerExecutorassignment under the timer mutex, keep queue items intact across transientptr==0drains, clear orphanedgPendingWorkentries afternativeInvalidateSharedRpc, re-arm drains on bridge install when the queue is non-empty, and guard against stale-id reschedules on empty queues. - background-thread (Android): Prevent background segment-eval replay and latch-stall across reload by treating an already-erased
gPendingBgEvalsentry as "drain claimed" and force-arming a drain whenever the coalesced queue is non-empty after bridge install.
- Bump all packages to 3.0.64.
- background-thread: Coalesce background-thread runtime work so multiple
SharedRPCcalls and timer callbacks are batched into a single JS executor drain, reducing native→JS thread hopping and closing races where rapid consecutive calls could overrun the executor.
- Bump all packages to 3.0.63.
- split-bundle-loader / background-thread: Evaluate split-bundle segments before resolving
loadSegmentpromises on iOS main/background and Android main/background, fixing the uncatchable "Requiring unknown module" Hermes fatal when Metroimport()ran before the segment's__ddefinitions; adds a watchdog, retryable-vs-fatal error codes, and off-JS-thread file reads.
- example: Wire every native module into the example app for iOS/Android build verification.
- Bump all packages to 3.0.61.
- Refresh example iOS
Podfile.lockchecksums and clarify bundle directory comments. - Bump all packages to 3.0.60.
- app-update (Android) / bundle-update: Add cache-pruning APIs —
clearApkCacheandpruneStaleAppVersionBundles— to safely reclaim disk space from old APK and OTA-bundle artifacts while protecting the current app/bundle versions and in-progress downloads.
- app-update (Android): Protect verified/pending-install APKs during cache cleanup; abort cleanup while a download is active and log skipped files to avoid delete races.
- bundle-update (Android): Make
deleteDirectoryreport real success/failure and warn on incomplete deletes instead of always reporting success. - bundle-update (iOS): Fix
appVersionFromStemstatic method scope reference.
- Bump all packages to 3.0.59.
- device-utils (iOS): Guard
getAndClearColdStartLocalNotificationwithos_unfair_lockso the deep-link payload is read exactly once even under concurrent calls. - chart-webview (Android): Harden pooled WebView reuse — use weak owner/warm-driver refs to avoid pinning disposed host contexts, validate
assetHostto a bare hostname before it becomes the privileged-bridge origin, normalizelocalBundleto avoid double-slash URLs, and retryforceDetachbefore giving up on a stuck parent.
- Bump all packages to 3.0.58.
- chart-webview: Add configurable
androidAssetHostprop so the WebView asset-loader domain can be overridden instead of hard-coded.
- Bump all packages to 3.0.57.
- chart-webview: Add warm-driver support so the pooled offline page boots off-screen and page→native callbacks are routed to the owner or warm-driver; source/bridge setters now apply synchronously, dropping the reconcile loop that caused infinite loops on Android.
- chart-webview (Android): Pause the pooled WebView renderer when no host owns it and resume on claim, stopping off-screen WebView CPU/RAM growth; add
webviewDebuggingEnabledprop and retry reparenting up to 12 frames.
- chart-webview (Android): Fix pooled WebView re-parenting white-screen/stuck-loading by forcefully clearing the parent on dispose before re-attaching.
- chart-webview (Android): Remove ChartDBG diagnostic instrumentation while keeping operational pool logs.
- Bump all packages to 3.0.56.
- device-utils (iOS): Add
getAndClearColdStartLocalNotification()to read and clear a killed-app local-notification tap payload exactly once, enabling cold-start deep-link routing; the slot is in-memory only so a fresh process cannot replay a stale tap.
- Bump all packages to 3.0.55.
- segment-slider: Migrate to an uncontrolled model —
valueis replaced bydefaultValueplus an imperativesetValue(value)ref method, removing the controlled-value-vs-drag conflict and avoiding Fabric prop commits for programmatic updates.
- range-downloader / app-update: Address concurrent-download audit findings — detect concurrent
.partialvia the.progresssidecar before size classification, terminate iOSdownload()completion when a segment goes missing/truncated, stream segment concatenation, require 206 +Content-Rangematch before stashing, and addcancel(channel, taskId). - bundle-crypto: Audit fixes — exact-basename skip rules,
removePrefixrelative paths, iOS path-traversal separator boundary, and RFC 4880 cleartext canonicalization/framing. - bundle-update: Audit fixes — fail-closed on unlistable dirs, exact-basename skip,
removePrefix, path-confinement separator boundary, holdisDownloadingacross skip delay, and signature-first atomic version persistence. - chart-webview: Scope the privileged bridge to trusted origins / main frame only, refcount the pool, and wire teardown so the WebView is destroyed on host drop.
- zip-archive (iOS): Preserve zip unzip error details in thrown messages.
- example: Remove the TradingView asset fetch script.
- Bump all packages to 3.0.54.
- range-downloader / bundle-crypto: New Nitro modules for concurrent multi-range downloading and crypto. Android adds 8-range concurrent download; iOS adds concurrent multi-range download.
bundle-updateandapp-updatenow delegate downloading and crypto to the shared modules. - chart-webview: New offline chart host with a pooled WebView reused across mount points; cached frame snapshots mask reparenting flash during switches. Android loads offline bundles from
assets/<localBundle>/. - perp-depth-bar: New native depth-bar view with per-row price/size text rendering and tap handling. Depth bars and side ratio use continuous exponential-smoothing easing. Added imperative
setDepth/setRatioAPIs and native placeholder-row support. - segment-slider: New native Nitro slider view; tap snaps to the nearest mark while dragging remains free.
- background-thread: SharedRPC gains inline-value messaging; restart freshness is now validated.
- zip-archive: Migrated to a Nitro module.
- app-update (Android): APK download supports Range /
.partialresume. - chart-webview: Fixed reconcile handing off in one direction only; added attach generation to prevent stale reparenting.
- perp-depth-bar: Fixed imperative API races against high-frequency prop updates; iOS text snap alignment; main-thread safety for layout updates.
- segment-slider: Fixed
lastEmittedsync when controlled value changes. - skeleton: Guarded shimmer restart against no-op
afterUpdate. - device-utils: Exposed
LaunchOptionsStoresingleton to the ObjC runtime. - security: Required SSZipArchive >= 2.5.4 to fix zip-slip CVEs.
- Bump all packages to 3.0.53.
- perf-stats: Add
addMemoryWarningListener/removeMemoryWarningListenerwith a normalisedMemoryWarningEvent { level: 'low' | 'critical'; rss; timestamp }. iOS mapsdidReceiveMemoryWarning→critical; Android mapsTRIM_MEMORY_RUNNING_*andonLowMemory()with a 500 ms critical dedup. Auto-registers pre-Application.onCreatevia aContentProvideron Android. - perf-stats (iOS): On every warning, drop
URLCache.sharedand the WK HTTP / disk / offline-app caches (cookies /localStorage/ IndexedDB preserved), then runmalloc_zone_pressure_relief. Reclaim delta logged. - perf-stats (Android): On every warning (LOW + CRITICAL for parity),
Runtime.gc()as an ART hint. - perf-stats: New
cleanupNativeCaches()to trigger the same reclaim path on demand; iOS does the libmalloc walk on a background queue. - perf-stats: New
forceGarbageCollection()— feature-detectsHermesInternal.gc/globalThis.gc.
- perf-stats: Clamp
intervalMsto[200 ms, 24 h]and reject NaN/Inf at the JS↔native boundary (otherwise iOSInt(Double)traps and AndroidDouble.toLong()saturatespostDelayedto never fire). - perf-stats: Move CPU baseline reset from
stop()tostart()'s cold-start path — the Androidstop()reset raced an in-flight tick that could write its captured ticks back. - perf-stats: One-shot
sample()no longer writes the periodic CPU baseline (recordBaseline=false). - perf-stats (Android): Fix
UiFpsMonitor.start()double-registering the Choreographer callback under concurrent calls (would fan out exponentially); idempotency check moved inside the main-thread post. - perf-stats (Android):
JsFpsHolderswitched toAtomicReference<Pair<>>so readers can't observe a fresh timestamp paired with a stale fps. - perf-stats (Android): Overlay drag/clamp uses the Activity
decorViewinstead ofdisplayMetrics, preventing the overlay from being dragged into the other pane under split-screen / foldable. Re-clamps ononConfigurationChangedsoandroid:configChangesActivities recover from rotation. - perf-stats (iOS): Observe
UIScene.didDisconnectNotificationto drop dangling overlay refs on multi-window close. Re-clamp the label afterviewWillTransitionso rotation doesn't strand it off-screen. - perf-stats (iOS): Register
didReceiveMemoryWarningobserver synchronously inside the listeners-table lock — closes the gap where a warning posted betweenadd()returning andaddObserverrunning could miss the new listener. - perf-stats (iOS):
removeMemoryWarningListenerusesInt(exactly:)so a JS-passedNaN/Infno longer traps.
- Bump
@onekeyfe/react-native-perf-statsto 3.0.36.
- Republish all packages as 3.0.35; no code changes.
- aes-crypto: Add native AES-GCM
aesGcmEncrypt/aesGcmDecrypt(hex I/O, 12-byte nonce, AAD-bound, returnsciphertext || tag). Android viaCipher.getInstance("AES/GCM/NoPadding"), iOS via CryptoKitAES.GCMin newAesCryptoGcm.swift.
- aes-crypto: Enforce strict 12-byte GCM nonce on both platforms — Android's
GCMParameterSpecpreviously accepted arbitrary lengths and produced iOS-incompatible ciphertexts. - aes-crypto: Reject empty / NaN / Infinity / fractional / negative inputs at every entry point (
encrypt/decrypt/pbkdf2/hmac*/sha*/randomKey/AES-GCMkey/nonce/aad); empty AEAD plaintext is still allowed. - aes-crypto (Android): Preserve GCM auth tag for empty plaintext (would have mismatched iOS) and reject empty ciphertext (previously silently resolved to
"", bypassing authentication). - aes-crypto (iOS): Unify all rejection codes to
"-1"(CBC/CTR/PBKDF2/HMAC/SHA/randomKey/UUID); previously per-method strings. - aes-crypto (iOS):
AesCryptoGcmErrorconforms toLocalizedErrorso JS gets a real message instead of Cocoa's default(... error N.). - aes-crypto (Android): Remove dead branches in
encryptImpl/decryptImpl/ GCM impls now covered by entry-level guards.
- aes-crypto: JSDoc on
aesGcmEncrypt/aesGcmDecryptdocuments the contract; header / podspec comments explain the ObjC++ + Swift bridging quirks.
- Bump all packages to 3.0.34. Legacy
fromHexstrtolleniency tracked as follow-up.
- auto-size-input: Dispatch
focus()/blur()to the UI thread — Nitro hybrid view methods can run off-main, butbecomeFirstResponder/resignFirstResponder(iOS, SIGTRAP) andrequestFocus/InputMethodManager(Android,CalledFromWrongThreadException) must run on the main thread.
- Bump
@onekeyfe/react-native-auto-size-inputto 3.0.33.
- background-thread: New
restart(mode, reason)TurboModule —mode='ui'reloads only the main runtime (language/currency/devSettings),mode='all'reloads both (OTA install, resetData);reasonis forwarded to RN reload listeners for attribution. - background-thread (iOS): Two-stage post-reload health check (~3s + ~6s) self-heals integration omissions; self-respawn replays the host's last entry URL (cached as
lastEntryURL) instead of falling back to the IPAbackground.bundleto avoid moduleId mismatch under OTA. Concurrent restarts gated by a monotonicrestartGenerationcounter. - background-thread (Android):
mode='ui'soft-reloads viaReactHost.reload(reason),mode='all'does a process restart;triggerProcessRestartnow returnsBooleanand propagates intent /SecurityExceptionfailures to the JS promise asBG_RESTART_ERROR.
- background-thread (iOS): Fix
EXC_BAD_ACCESSon main reload — SharedRPC listener kept ajsi::Functiontied to a torn-down runtime, andRPCRuntimeExecutorlambdas capturedRCTInstancestrongly. Per-listeneraliveflag flipped synchronously inrestart(); lambdas now captureRCTInstanceweakly. - background-thread:
SharedRPC::invalidate(runtimeId)now erases the dead listener entry instead of leaving it withalive=false, keepinglisteners_clean acrossmode='all'restarts that never re-install.
- Bump
@onekeyfe/react-native-background-threadto 3.0.32.
- bundle-update (iOS): Persist
URLSessionresume data to a<filePath>.resumesidecar on download failure; next attempt resumes viadownloadTask(withResumeData:)instead of restarting from byte 0. Targets the ~64% of failures that areNSURL -1005/-1001. - bundle-update (iOS): Snapshot resume data on
didEnterBackgroundNotificationviacancel(byProducingResumeData:)under abeginBackgroundTaskwindow, so force-quit / OOM kills don't lose progress. - bundle-update (Android): Range-based resume via
<filePath>.partialsidecar — retry sendsRange: bytes=<offset>-; 206 resumes, 200 restarts, 416 wipes. Rename to final filename only after SHA256 verifies. - bundle-update: Per-failure SHA256 subtype tagging via thread-local stamp (
SHA256_FILE_TRUNCATED,SHA256_OOM,SHA256_IO_<class>, …) so the previously opaque AndroidverifyPackageanalytics bucket can be split. iOS swaps raise-pronereadData(ofLength:)for throwingread(upToCount:).
- bundle-update: Drop inner exception text from thrown messages to prevent path leakage — iOS
verifyBundleASCembeddedSSZipArchivepaths containing install UUID; AndroidgetMetadataembeddedorg.jsontext with local paths. Only anIO_<class>tag escapes now; full descriptions still go to OneKeyLog. - bundle-update: Verify-stage SHA failures propagate the subtype (
Bundle SHA256 verification failed: <reason>) so analytics splits download-stage and verify-stage failures into matching buckets. - bundle-update (iOS): Protect
activeDownloadFilePathunderstateQueueso foreground/background races can't observe torn state withisDownloading. - bundle-update (iOS): Invalidate
URLSessionindeinitso the session andDownloadDelegatedon't outlive the module on hot-reload. - bundle-update (Android): Recover a crashed-before-rename
.partialvia promote+verify when size matchesexpectedSize, instead of unconditionally deleting it. - bundle-update (Android): Recover from HTTP 416 when
Content-Range: bytes */<total>indicates the partial is already byte-complete. - bundle-update (Android): Sanitize
update/errorpayloads throughsanitizeErrorMessageForEventso/data/user/...paths never leak to JS / analytics. - perf-stats (Android): Remove the WindowManager overlay on Activity destroy to prevent View/token leak across configuration changes.
- Bump all packages to 3.0.31.
- perf-stats: Add UI FPS (
Choreographer/CADisplayLink) and JS FPS (rAF, pushed viasetJsFpsHintwith 2s staleness) toPerfSample. Anomaly logging extends to sustainedui_fps <= 45andjs_fps <= 30. - perf-stats:
start/stopnow auto-manage the JS FPS tracker; manualstartJsFpsTracker/stopJsFpsTrackerremain as escape hatches.
- perf-stats (iOS): Keep overlay above modal-presented controllers — switch from a
UILabelon the keyUIWindowto a dedicatedwindowLevel = .alert + 1UIWindowsubclass that forwards taps outside the label viahitTest.
- Bump all packages to 3.0.28.
- perf-stats: New
@onekeyfe/react-native-perf-statsNitro module — periodic CPU% and RSS sampler with a debug overlay (Android Kotlin/JNI, iOS Swift). - perf-stats: Log sustained CPU/RSS anomalies (CPU ≥ 150% or RSS ≥ 800 MB for 5 consecutive samples) to native-logger with per-category 30s cooldown.
- perf-stats: Close
start/stoprace that stranded the sampler — moverunning=trueand handler lifecycle into one synchronized block, plus a generation token so a tick whose scheduler was stopped drops itself instead of rescheduling on a quitting handler. - perf-stats (Android): Use literal
1005forABOVE_SUB_PANEL—TYPE_APPLICATION_ABOVE_SUB_PANELis@hidein the public SDK and fails to compile by name.
- perf-stats: Rewrite README with the real API and scoped package name.
- Bump all packages to 3.0.25.
- bundle-update (Android): Annotate
BundleUpdateStoreAndroid.getCurrentBundle*JSBundlewith@JvmStaticso external reflection callers (e.g.SplitBundleLoaderModule) don't NPE on null-receiver invocation — without it, fresh OTA installs silently loaded the APK common bundle and crashed on moduleId mismatch.
- Bump all packages to 3.0.24.
- bundle-update (Android): Rewrite the
validateWebEmbedSha256KDoc in prose —web-embed/**inside/** ... */was lexed as a nested comment opener (Kotlin block comments nest), swallowing the rest of the file as comment body and breaking Android release builds.
- Bump all packages to 3.0.23.
- background-thread / split-bundle-loader: Correct stale
common.jsbundlereferences in comments to match the actual resource name (common.bundle). No runtime change.
- Bump all packages to 3.0.22.
- background-thread (iOS): Prefer OTA-installed
common.bundle/background.bundleover IPA built-ins via reflectiveBundleUpdateStorelookup, so a three-bundle OTA doesn't moduleId-mismatch a stale IPA copy. Migrated fromapp-monorepopatch. - bundle-update: Three-bundle metadata support — parse
requiresCommonBundleandbundleFormat;validateBundleDescriptornow requirescommon.bundlewhen set so split-thread OTAs fail closed. Android metadata parser also accepts boolean / numeric scalars. - bundle-update: Add
validatedCurrentBundleInfocache keyed bycurrentBundleVersion, invalidated on every mutation, so startup path getters no longer re-run the full signature + sha256 pipeline. - bundle-update: Fast-path entry sha256 at startup — only hash main + common + background (gated by metadata); full-tree validation still runs at install time, per-segment integrity is now enforced at
loadSegmenttime. - bundle-update (iOS): Expose
BundleUpdateStore.currentBundleCommonJSBundle()for background-runtime lookup. - split-bundle-loader: Verify segment SHA-256 at
resolveSegmentPath/loadSegmenttime, streamed in 64KB chunks. Empty per-segment hash is a hard fail under the three-bundle layout; older formats keep the back-compat skip. Migrated fromapp-monorepopatch.
- bundle-update: Lazy web-embed sha256 verification + cache — walk
web-embed/**atgetWebEmbedPathtime, reject files-not-in-metadata and metadata-without-files, cache bybundleVersion. Both platforms. - bundle-update (Android): Fail closed when
validateWebEmbedRecursivegetslistFiles() == null, instead of silently allowing a tampered/unlistable dir. - bundle-update (Android):
metadataRequiresCommonBundlenow uses OR semantics sobundleFormat=three-bundleis honored even whenrequiresCommonBundle=false, matching iOS. - bundle-update: Close
installBundlesame-version reinstall race — also invalidate the validated-bundle cache at the end of the async body, so a concurrent reader can't re-cache pre-install state. - bundle-update (Android): Use constant-time
secureCompareinvalidateEntryBundlesSha256, matching every other sha256 comparison in the file. - bundle-update (iOS): Lowercase the
bundleFormatcomparand at all three sites for parity with Android's case-insensitive semantic. - background-thread (iOS): Refuse IPA fallback when OTA main is active — if OTA common / background lookup fails (typical: bundle-update older than the consumer), don't fall back to IPA built-ins that would moduleId-mismatch the OTA main.
- background-thread (iOS): Abort
hostDidStartwhen OTA common loaded but OTA background missing, instead of installing SharedStore / SharedRPC against a runtime with no entry bundle. Tracked via new_otaActiveAtBundleResolveivar.
- bundle-update: Extract
"three-bundle"into a constant on both platforms (bundleFormatThreeBundle/BUNDLE_FORMAT_THREE_BUNDLE) so iOS and Android stay in lockstep.
- split-bundle-loader / background-thread: Peer-depend on
@onekeyfe/react-native-bundle-update>=3.0.21— both now reflectively call newBundleUpdateStoreAPIs. - Bump all packages to 3.0.21.
- device-utils: Add synchronous
getAndroidChannel()andgetInstallerPackageName()Nitro HostObject methods, both typed as closed string unions for compile-time safety (AndroidChannel:direct/google/huawei/unknown;InstallerPackageName:appStore/testFlight/other/playStore/huaweiAppGallery/unknown). - device-utils (Android):
getAndroidChannel()reflectsBuildConfig.ANDROID_CHANNELwith a candidate-package walk soapplicationIdSuffix/ sub-packaged Application classes resolve correctly; shipsconsumer-rules.proto keep the field through R8. - device-utils (Android):
getInstallerPackageName()usesgetInstallSourceInfo()on API 30+ (deprecatedgetInstallerPackageName()below), mappingcom.android.vending→playStore,com.huawei.appmarket→huaweiAppGallery, other →other, null →unknown. - device-utils (iOS):
getInstallerPackageName()distinguishes AppStore / TestFlight / Other viaappStoreReceiptURL.lastPathComponent+embedded.mobileprovision; simulator returnsunknown.getAndroidChannel()returnsunknownfor API parity.
- Bump all packages to 3.0.20.
- split-bundle-loader (iOS): Apply
stringByStandardizingPathtootaRoot/builtinRootso thehasPrefixsafety check survives the/var → /private/varcanonicalization that was silently rejecting every candidate. Add diagnostic logs. - split-bundle-loader (Android): Wipe
onekey-builtin-segments/wheneverPackageInfo.lastUpdateTimechanges (double-checked locking, called from every segment entry point) so APK overwrite installs don't reuse the previous build's HBC segments against drifted Metro module IDs. - split-bundle-loader (Android, NewArch): Switch segment registration from
hasCatalystInstance+ reflection fallback toReactContext.registerSegment(id, path, callback)so bridgeless works. - background-thread (Android): Add a reflection-based, allowlist-gated Activity bridge — replays the current Activity onto the bg ReactContext and forwards lifecycle / Activity-result events only to listeners whose FQCN matches a registered prefix; non-allowlisted modules keep the prior baseline so no resource collisions with the UI host.
- background-thread (Android, NewArch):
registerSegmentInBackgroundnow usesReactContext.registerSegmentso bridge and bridgeless share one code path. - background-thread: Fix SIGSEGV on reload / teardown — make the timer worker joinable, stop+join in
nativeDestroybefore clearing shared state, intentionally leak remainingjsi::Function/std::functioncaptures so destructors don't run on a dead runtime. - background-thread (iOS): Skip the
entryURLoverride when it's the placeholder"background.bundle", so release builds taking the split-bundle path actually fall through to common + entry. - cloud-fs (Android): Collapse the inverted
saveFileternary tomimeType ?: guessMimeType(uriOrPath)so caller-supplied MIME types win and guessing is the fallback.
- background-thread: New allowlist API on
BackgroundThreadManager—addBgActivityBridgeListenerClassPrefix(prefix),setBgActivityBridgeListenerClassAllowlist(prefixes),getBgActivityBridgeListenerClassAllowlist(). Empty by default; host apps must register FQCN prefixes early inApplication.onCreate. - split-bundle-loader: Diagnostic logging (
[resolveSeg]/[extractBuiltin]/[install-stamp]on Android,[resolveAbs]on iOS) for production "segment not found" triage.
- Inline former
app-monorepopatches (@onekeyfe+react-native-background-thread+3.0.18.patch,@onekeyfe+react-native-split-bundle-loader+3.0.18.patch) into source; nopatch-packageneeded. - Bump all packages to 3.0.19.
- background-thread: Drain the Hermes microtask queue after every
nativeExecuteWorksoPromise.then/async-awaitcontinuations actually run on the background runtime (RN 0.74+ requires explicitdrainMicrotasks()— without it, all awaits hang in bg). - background-thread: Add cross-runtime timer primitives in
cpp-adapter.cpp(timer worker thread, pending work queue, JSI-safe scheduling) underpinning split-bundle + bg-hostsetTimeout/Promisebehaviour.
- Bump all packages to 3.0.18.
- tcp-socket / zip-archive / network-info / ping / async-storage / cloud-fs / dns-lookup: Align Android TurboModule class names with their TS spec filenames so codegen resolves the native modules correctly.
- Bump all packages to 3.0.17.
- async-storage (Android): Correct codegen class name in
RNCAsyncStorageModule.kt.
- Bump all packages to 3.0.16.
- cloud-fs: Align types and native implementations with the upstream source repo — replace
Objectparams with proper TS types across the Spec, portDriveServiceHelperand the fullRNCloudFsModulefrom Java to a Kotlin TurboModule, add Android Google Drive methods (loginIfNeeded,logout,getGoogleDriveDocument,getCurrentlySignedInUserData), add iOS stubs for Android-only methods, fix iOSsyncCloudto return a boolean, re-addcreateFileto the Spec, and wire the Google Drive dependencies into Androidbuild.gradle.
- async-storage (web): Resolve web type errors by adding
DOMlib to tsconfig and declaring types formerge-options.
- Patch bump workspaces and fix async-storage module files.
- Bump all packages to 3.0.15.
- async-storage: Add web implementation (
NativeAsyncStorage) backed bylocalStorage.
- Bump all packages to 3.0.13.
- async-storage: Add
AsyncStorageStaticcompatibility layer for legacy call sites.
- ping / pbkdf2 / network-info: Fix compilation errors.
- aes-crypto: Sync patch changes — use Hex encoding for all I/O.
- dns-lookup (iOS): Add
CFDataRefcast inDnsLookup.mmto fix compilation. - Align Android implementations with upstream originals.
- iOS compilation fixes verified with local build.
gitignorethelib/build output and exclude.mapfiles from npm publish.- Bump all packages through 3.0.11.
- split-bundle-loader: Fix stale reflection class name for
BundleUpdateStorein AndroidgetOtaBundlePath()— updated fromexpo.modules.onekeybundleupdate.BundleUpdateStoretocom.margelo.nitro.reactnativebundleupdate.BundleUpdateStoreAndroid - native-logger: Fix dedup logic suppressing error logs — comparison now includes level, tag, and message instead of message-only
- background-thread: Fix JNI GlobalRef leak on each
nativeInstallSharedBridgecall — wrap inshared_ptrwith custom deleter - background-thread: Fix
SharedRPC::reset()crash from destroyingjsi::Functionon wrong thread — use intentional leak pattern - background-thread: Fix
nativeDestroynot resettingSharedStore, leaving stale data across restarts - Correct codegen class names to match TS spec file names
- Align all package versions to 3.x line (cloud-fs cannot use 1.x since npm already has 2.6.5)
- Bump all packages to 3.0.4
- tcp-socket: Correct header import to match codegenConfig name
- Bump all packages to 1.1.59
- cloud-fs: Set version to 3.0.0 (npm already has 2.6.5, cannot publish lower)
- Bump all packages to 1.1.58
- Add missing release scripts for cloud-fs, ping, zip-archive
- Bump all packages to 1.1.57
- aes-crypto / async-storage / cloud-fs / dns-lookup / network-info / ping / tcp-socket / zip-archive: Add Android TurboModule implementations for legacy bridge module replacements
- tcp-socket: Fix type definitions
- Bump all packages to 1.1.56
- aes-crypto / async-storage / cloud-fs / dns-lookup / network-info / ping / tcp-socket / zip-archive: Add TurboModule replacements for legacy React Native bridge modules (iOS + JS)
- Bump all packages to 1.1.55
- Bump all packages to 1.1.54
- split-bundle-loader: Add split-bundle timing instrumentation and update PGP public key
- split-bundle-loader: Add comprehensive timing logs for three-bundle split verification
- Bump all packages to 1.1.53
- background-thread: Add split-bundle common+entry loading strategy for background runtime
- Bump all packages to 1.1.52
- split-bundle-loader: Add
resolveSegmentPathAPI and path traversal protection
- split-bundle-loader: Resolve Android
registerSegmentInBackgroundrace condition - split-bundle-loader: Enhance bridgeless support and robustness improvements
- Bump all packages to 1.1.51
- split-bundle-loader: Add
react-native-split-bundle-loaderTurboModule withgetRuntimeBundleContextandloadSegmentAPIs - split-bundle-loader: Expose
loadSegmentInBackgroundfrom TurboModule API - bundle-update: Add
registerSegmentInBackgroundfor late HBC segment loading
- Bump all packages to 1.1.49
- bundle-update: Support background bundle pair bootstrap — add
getBackgroundJsBundlePath, metadata validation forrequiresBackgroundBundleandbackgroundProtocolVersion, and bundle pair compatibility checks
- Bump all packages to 1.1.48
- background-thread: Add SharedBridge JSI HostObject for cross-runtime data transfer between main and background JS runtimes
- background-thread: Implement Android background runtime with second ReactHost and SharedBridge
- background-thread: Replace SharedBridge with SharedStore + SharedRPC architecture
- background-thread: Add onWrite cross-runtime notification, remove legacy messaging
- native-logger: Add dedup for identical consecutive log messages
- background-thread: Stabilize background thread runtime initialization
- background-thread: Initialize Android shared bridge at app startup
- shared-rpc: Rename
RuntimeExecutortoRPCRuntimeExecutorto avoid React Native conflict - shared-rpc: Prevent crash on JS reload by deduplicating listeners with runtimeId
- shared-rpc: Leak stale
jsi::Functioncallback on reload to prevent crash
- Bump all packages to 1.1.47
- bundle-update: Use
scheduledEnvBuildNumberfrom task instead of storedgetNativeBuildNumber()for buildNumber change detection in pre-launch pending task processing
- Bump all native modules and views to 1.1.46
- bundle-update: Use
scheduledEnvBuildNumberfrom task instead of storedgetNativeBuildNumber()for buildNumber change detection in pre-launch pending task processing, so the check works even without a prior successful bundle install - react-native-tab-view: Add
delayedFreezeprop to control freeze/unfreeze delay on tab switch; defaults to immediate freeze for better iPad sidebar switching
- Bump all native modules and views to 1.1.45
- react-native-tab-view (iOS): Force iPad tab bar to bottom by overriding
horizontalSizeClassto.compacton iPad (iOS 18+), preventingUITabBarControllerfrom placing tabs at the top
- react-native-tab-view (iOS): Remove verbose debug logging (KVO observers, prop change logs, layout logs, delegate proxy logs)
- Bump all native modules and views to 1.1.44
- bundle-update: Add native-layer pre-launch pending task processing for iOS/Android — process pending bundle-switch tasks before JS runtime starts
- bundle-update: Harden pre-launch pending task with entry file existence check and synchronous writes (commit instead of apply on Android)
- Bump all native modules and views to 1.1.43
- bundle-update: Add
clearDownload()method that only clears the download cache directory - bundle-update: Fix
clearBundle()to also clear the installed bundle directory, aligning behavior across desktop/iOS/Android
- Bump all native modules and views to 1.1.42
- bundle-update: Add buildNumber change detection in
getJsBundlePath()— clears hot-update bundle data and falls back to builtin JS bundle when native buildNumber changes - bundle-update: Add
getNativeBuildNumber()andgetBuiltinBundleVersion()APIs on both iOS and Android
- bundle-update (iOS): Guard against empty stored buildNumber to match Android behavior in build number change detection
- bundle-update (Android): Use
get().toString()instead ofgetString()ingetBuiltinBundleVersion()to handle numeric meta-data values that AAPT2 stores as Integer
- Bump all native modules and views to 1.1.41
- device-utils: Add boot recovery APIs and test buttons to DeviceUtilsTestPage
- Add acknowledgment READMEs for forked upstream projects: react-native-tab-view, TOCropViewController, react-native-get-random-values
- Bump all native modules and views to 1.1.39
- scroll-guard: Add new
@onekeyfe/react-native-scroll-guardnative view module that prevents parent scrollable containers (PagerView/ViewPager2) from intercepting child scroll gestures - scroll-guard: Support
directionprop with horizontal, vertical, and both modes
- scroll-guard (Android): Use
ViewGroupManagerinstead of nitrogen-generatedSimpleViewManagerto properly support child views (fixesIViewGroupManagerClassCastException) - scroll-guard (iOS): Improve gesture blocking reliability
- Add
nitrogen/to.gitignoreand remove tracked nitrogen files - Bump all native modules and views to 1.1.38
- bundle-update: Add
resetToBuiltInBundle()API to clear the current bundle version preference, reverting to built-in JS bundle on next restart
- Bump all native modules and views to 1.1.37
- auto-size-input: Add
contentCenteredprop to center prefix/input/suffix as one visual group in single-line mode
- auto-size-input (Android): Improve baseline centering and centered-layout width calculations for single-line input
- auto-size-input (iOS): Align auto-width sizing behavior with Android so content width and suffix positioning stay consistent
- Bump all native modules and views to 1.1.36
- pager-view: Add local
@onekeyfe/react-native-pager-viewpackage innative-viewswith iOS and Android support - example: Add PagerView test page and route integration, including nested pager demos
- pager-view: Fix layout metrics/child-view guards and scope refresh-layout callback to the host instance
- tab-view: Guard invalid route keys in tab press/long-press callbacks and safely resync selected tab on Android
- Bump all native modules and views to 1.1.35
- auto-size-input: Use
setRawInputTypeon Android so the IME shows the correct keyboard layout without restricting accepted characters; JS-side sanitization handles character filtering - auto-size-input: Skip
autoCorrectandautoCapitalizemutations on number/phone input classes to avoid stripping decimal/signed flags and installing a restrictive KeyListener
- tab-view: Remove
interfaceOnlyoption fromcodegenNativeComponentto fix Fabric component registration
- tab-view: Add new
@onekeyfe/react-native-tab-viewFabric Native Component with native iOS tab bar (UITabBarController) and Android bottom navigation (BottomNavigationView) - tab-view: Add
ignoreBottomInsetsprop for controlling safe-area inset behavior - tab-view: Add TabView settings page for Android with shared store
- tab-view: Add OneKeyLog debug logging for tab bar visibility debugging
- tab-view: Migrate to Fabric Native Component (New Architecture), remove Paper (old arch) code on iOS
- example: Add TabView test page and migrate example app routing to
@react-navigation/native - example: Add floating A-Z alphabet sidebar, emoji icons, and compact iOS Settings-style module list to home screen
- tab-view: Prevent React child views from covering tab bar
- tab-view: Prevent Fabric from stealing tab childViews, fix scroll and layout issues
- tab-view: Forward events from Swift container to Fabric EventEmitter on iOS
- tab-view: Resolve Kotlin compilation errors in RCTTabViewManager
- tab-view: Wrap BottomNavigationView context with MaterialComponents theme
- tab-view: Remove bridging header for framework target compatibility
- tab-view: Use ObjC runtime bridge to call OneKeyLog, avoid Nitro C++ header import
- tab-view: Resolve iOS Fabric ComponentView build errors
- tab-view: Restore
#ifdef RCT_NEW_ARCH_ENABLEDin .h files for Swift module compatibility
- tab-view: Migrate from Nitro HybridView to Fabric ViewManager, then to Fabric Native Component
- Bump all native modules and views to 1.1.32
- bundle-update / app-update: Add synchronous
isSkipGpgVerificationAllowedAPI to expose whether build-time skip-GPG capability is enabled
- auto-size-input: Re-layout immediately in
contentAutoWidthmode as text changes, and shrink font when max width is reached so content stays visible
- auto-size-input: Add new
@onekeyfe/react-native-auto-size-inputnative view module with font auto-scaling, prefix/suffix support, multiline support, and example page - auto-size-input: Add
showBorder,inputBackgroundColor, andcontentAutoWidthprops; make composed prefix/input/suffix area tappable to focus input - bundle-update / app-update: Add
testVerificationandtestSkipVerificationtesting APIs - native-logger: Add level-based token bucket rate limiting for log writes
- auto-size-input: Fix iOS build issue (delegate/
NSObjectProtocolconformance), fix layout-loop behavior, and align callback typing on test page - native-logger: Harden log rolling behavior and move rate limiting to low-level logger implementation
- bundle-update / app-update: Gate skip-GPG logic with build-time env var
ONEKEY_ALLOW_SKIP_GPG_VERIFICATION— code paths are compiled out (iOS) or short-circuited by immutable constant (Android) when flag is unset
- bundle-update / app-update: Treat empty string env var as disabled for
ALLOW_SKIP_GPG_VERIFICATION
- Bump all native modules and views to 1.1.27
- bundle-update: Add synchronous
getJsBundlePath, rename async version togetJsBundlePathAsync
- Address Copilot review — stack traces, import Security, FileProvider authority
- Bump native modules and views version to 1.1.24
- bundle-update / app-update: Address PR review security and robustness issues
- bundle-update / app-update: Use
onekey-app-dev-settingMMKV instance and require dual check for GPG skip
- Bump native modules and views version to 1.1.23
- bundle-update: Migrate signature storage from SharedPreferences/UserDefaults to file-based storage
- bundle-update: Add
filePathfield toAscFileInfoinlistAscFilesAPI - app-update: Add Download ASC and Verify ASC steps to AppUpdate pipeline
- app-update: Improve download with sandbox path fix, error logging, and APK cache verification
- bundle-update / app-update: Add comprehensive logging to native modules
- bundle-update: Add download progress logging on both iOS and Android
- bundle-update: Expose
BundleUpdateStoreto ObjC runtime - bundle-update: Fix iOS build errors (MMKV and SSZipArchive API)
- bundle-update / app-update: Fix Android build errors across native modules
- app-update: Fix download progress events and prevent duplicate downloads in native layer
- app-update: Fix remaining
params.filePathreference ininstallAPK - app-update: Skip
packageNameand certificate checks in debug builds, still log results - app-update: Add FileProvider config for APK install intent
- app-update: Add BouncyCastle provider and fix conflict with Android built-in BC
- bundle-update: Add diagnostic logging for bundle download file creation
- bundle-update: Add detailed diagnostic logging to
getJsBundlePathon both platforms - lite-card: Add BuildConfig import to LogUtil
- native-logger: Pass archived path to
super.didArchiveLogFileto prevent crash - Use host app
FLAG_DEBUGGABLEinstead of libraryBuildConfig.DEBUG
- app-update: Remove
filePathfrom AppUpdate API, derive fromdownloadUrl - app-update: Unify AppUpdate event types with
update/prefix
- device-utils: Merge
react-native-webview-checkerintoreact-native-device-utils - device-utils: Add WebView & Play Services availability checks
- device-utils: Add
saveDeviceTokenand makeexitAppa no-op on iOS - splash-screen: Implement Android legacy splash screen with
SplashScreenBridge - get-random-values: Add logging for invalid
byteLength - bundle-update / app-update: Replace debug-mode GPG skip with MMKV DevSettings toggle
- native-logger: Add
react-native-native-loggermodule with file-based logging, log rotation, and CocoaLumberjack/Timber backends - native-logger: Add startup log in native layer for iOS and Android
- native-logger: Add timestamp format for log writes and copy button for log dir
- Integrate
OneKeyLoginto all native modules
- native-logger: Auto-init OneKeyLog via ContentProvider before
Application.onCreate - native-logger: Use correct autolinked Gradle project name
- native-logger: Security hardening — remove key names from keychain logs
- lite-card: Migrate logging to NativeLogger, remove sensitive data from logs
- background-thread: Migrate logging to NativeLogger, replace
@importwith dynamic dispatch - bundle-update: Add missing
deepLinkparameter toLaunchOptionsinitializer
- Bump version to 1.1.20
- device-utils: Improve
setUserInterfaceStylereliability and code quality - device-utils (Android): Prevent
ConcurrentModificationExceptionin foldable device listener - device-utils (Android): Add null check in
setTopActivityto preventNullPointerException - device-utils (Android): Add synchronized blocks to prevent race conditions
- device-utils: Add
setUserInterfaceStyleAPI with local persistence for dark/light mode control - device-utils: Add comprehensive foldable device detection with manufacturer-specific caching
- device-utils: Expand foldable device list from Google Play supported devices
- cloud-kit: Correct
fetchRecordreturn type on both iOS and Android
- Upgrade
react-native-nitro-modulesto 0.33.2
- lite-card: Initial OneKey Lite NFC card module with full card management (read/write mnemonic, change PIN, reset, get card info)
- lite-card: Refactor to Turbo Module architecture
- check-biometric-auth-changed: Support biometric authentication change detection on iOS and Android
- cloud-kit: Add CloudKit/iCloud module for record CRUD operations
- keychain-module: Add secure keychain storage module (iOS Keychain / Android Keystore)
- background-thread: Add background JavaScript thread execution module
- get-random-values: Add cryptographic random values module (Nitro Module)
- device-utils: Add device utilities module — system info, clipboard, haptics, locale, and more
- skeleton: Add native skeleton loading view component with shimmer animation
- skeleton: Fix
EXC_BAD_ACCESScrash on iOS - skeleton: Improve memory safety and cleanup in Skeleton component
- skeleton: Fix memory leak
- cloud-kit: Fix native type errors in CloudKitModule
- Upgrade project structure to monorepo with workspaces
- Create CI publish workflow