All notable changes to this project will be documented in this file.
- device-utils: Add synchronous
getAndroidChannel()andgetInstallerPackageName()Nitro HostObject methods. Both return closed string-union types (compiled to native enums) rather than open-ended strings so JS callers get a fixed set at the type level —AndroidChannel:direct/google/huawei/unknown;InstallerPackageName:appStore/testFlight/other/playStore/huaweiAppGallery/unknown. - device-utils (Android):
getAndroidChannel()reflects the host app'sBuildConfig.ANDROID_CHANNELwith a candidate-package walk (originalpackageName, its parent packages, and the Application class's package hierarchy) so the lookup stays correct underapplicationIdSuffixor a sub-packaged Application class. All fallback paths returndirectto match the gradle default; only a successfully-read but unrecognized string maps tounknown. Shipsconsumer-rules.prowith a-keep class **.BuildConfig { ANDROID_CHANNEL }rule so R8/minify in the consumer app cannot strip or rename the reflected class/field. - device-utils (Android):
getInstallerPackageName()usesPackageManager.getInstallSourceInfo()on API 30+ (and the deprecatedgetInstallerPackageName()below), mappingcom.android.vending→playStore,com.huawei.appmarket→huaweiAppGallery, any other non-null installer →other, and null/empty →unknown. - device-utils (iOS):
getInstallerPackageName()distinguishes AppStore / TestFlight / Other usingBundle.main.appStoreReceiptURL.lastPathComponent == "sandboxReceipt"+ the presence ofembedded.mobileprovision, aligned withreact-native-device-info's contract; simulator returnsunknown.getAndroidChannel()returnsunknownon iOS for API parity.
- Bump all packages to 3.0.20.
- split-bundle-loader (iOS): Fix all segment loads silently returning "not found" after iOS path canonicalization.
[NSBundle resourcePath]returns paths rooted at/var/...but iOS transparently resolves them to/private/var/...; thehasPrefixsafety check therefore rejected every candidate. ApplystringByStandardizingPathto bothotaRootandbuiltinRootso the comparison is apples-to-apples, and add diagnostic logs for each resolution attempt. - split-bundle-loader (Android): Fix post-upgrade crashes where an APK overwrite install (
adb install -r, Play Store update, sideload) reused the previous build's extracted HBC segments even though Metro module IDs had drifted. Now wipeonekey-builtin-segments/wheneverPackageInfo.lastUpdateTimechanges, gated by double-checked locking so the wipe runs at most once per process. Called from every segment entry point (getRuntimeBundleContext,resolveSegmentPath,loadSegment,extractBuiltinSegmentIfNeeded). - split-bundle-loader (Android, New Architecture): Fix segment registration failing with "Neither CatalystInstance nor ReactHost available" on bridgeless. The old code required
hasCatalystInstance()with a fragile reflection fallback; now usesReactContext.registerSegment(id, path, callback)which RN routes correctly in both bridge and bridgeless modes. - background-thread (Android): Fix TurboModules on the background ReactHost never observing Activity state —
getCurrentActivity()returned null, andActivityEventListener.onActivityResult/onNewIntent/LifecycleEventListener.onHostResume|Pause|Destroywere never fired. Modules that depend on Activity context (file pickers, intent launchers, keyboard observers, etc.) silently no-op'd on the bg host. Add a reflection-based, allowlist-gated Activity bridge that replays the most recent Activity onto the bg ReactContext and forwards lifecycle / Activity-result events only to listeners whose class FQCN matches an entry registered viaBackgroundThreadManager.addBgActivityBridgeListenerClassPrefix(...). Non-allowlisted modules keep the pre-existing "never-resumed on bg" baseline, so no double resource registration orrequestCodecollisions with the UI host. - background-thread (Android, New Architecture): Fix
registerSegmentInBackgroundthrowing "Background CatalystInstance not available" in bridgeless mode. Now dispatches viaReactContext.registerSegment(id, path, callback)so bridge and bridgeless both work through a single code path. - background-thread: Fix SIGSEGV on reload / teardown. The timer worker was started detached, so
nativeDestroycould tear downgTimers/gBgTimerExecutorwhile the worker was mid-dispatch, and any pendingjsi::Functioncallbacks ingTimers/gPendingWorkwere destroyed against the already-torn-down runtime (same failure mode as the originalSharedRPC::resetcrash). Now make the worker joinable, read the executor under the mutex, and innativeDestroystop + join the worker before clearing shared state; intentionally leak remainingjsi::Function/std::function<void(jsi::Runtime&)>captures so their destructors don't run on a dead runtime. - background-thread (iOS): Fix bg host failing to start in release builds that use split bundles. The delegate's default
entryURLis the placeholder string"background.bundle"; passing that throughsetJsBundleSourceprevented the delegate from taking its split-bundle fallback path (common.jsbundle + entry.jsbundle). Skip the override whenentryURLis the placeholder. - cloud-fs (Android): Fix caller-provided
mimeTypebeing silently discarded bysaveFile. The previous ternary was inverted — when the caller supplied an explicit MIME type,actualMimeTypewas set tonullandguessMimeTypewas only consulted when the caller passed null. Collapse tomimeType ?: guessMimeType(uriOrPath)so caller input wins and guessing is the fallback.
- background-thread: New public API on
BackgroundThreadManagerfor the Activity-bridge allowlist:addBgActivityBridgeListenerClassPrefix(prefix),setBgActivityBridgeListenerClassAllowlist(prefixes),getBgActivityBridgeListenerClassAllowlist(). The module ships an empty default — host apps must register FQCN prefixes early inApplication.onCreatebefore the first Activity lifecycle callback fires. - split-bundle-loader: Diagnostic logging on Android (
[resolveSeg],[extractBuiltin],[install-stamp]) and iOS ([resolveAbs]) for triaging "segment not found" reports in production.
- Inline former
app-monorepo/patches/@onekeyfe+react-native-background-thread+3.0.18.patchand@onekeyfe+react-native-split-bundle-loader+3.0.18.patchdirectly into source; consumers no longer needpatch-package. - 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