원클릭으로
1k-patching-native-modules
Patches native modules (expo-image, react-native, etc.) to fix native crashes or bugs.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Patches native modules (expo-image, react-native, etc.) to fix native crashes or bugs.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Analytics event tracking for OneKey. Use when adding tracking events, logging to server, user behavior tracking, or business metrics. Covers the @LogToServer decorator pattern, logger scope/scene architecture, and common pitfalls. Triggers on "埋点", "统计", "打点", "数据追踪", "日志", "analytics", "tracking event", "Mixpanel", "LogToServer", "trackEvent", "defaultLogger".
Create test versions to verify app auto-update functionality and version migration.
Release branch management — checkout from release, prepare builds, pre-release diff checks, publish tracking, and sync back to x. Use this skill when managing release branches, creating branches for bundle releases, running pre-release diff checks, finalizing releases, or syncing release changes to x. Triggers on "bundle release", "release diff", "release publish", "release sync", "release checkout", "发布管理", "release 分支", "release management", "bundle-release", "bundle branch".
Code quality standards — lint (eslint/oxlint), type check (tsc), pre-commit hooks, and comment conventions. All comments must be in English.
Comprehensive PR code review for OneKey monorepo. Use when reviewing PRs, code changes, or diffs — covers security (secrets/PII leakage, supply-chain, AuthN/AuthZ), code quality (hooks, race conditions, null safety, concurrent requests), and OneKey-specific patterns (Fabric crashes, MIUI, BigNumber). Triggers on "review PR", "review this PR", "code review", "check this diff", "审查 PR", "代码审查", "review
Coding patterns and best practices — React components, promise handling, and TypeScript conventions.
| name | 1k-patching-native-modules |
| description | Patches native modules (expo-image, react-native, etc.) to fix native crashes or bugs. |
| disable-model-invocation | true |
Follow this workflow to analyze crash logs, fix native module bugs, and generate patches.
1. Analyze Crash Log → 2. Locate Bug → 3. Fix Code → 4. Clean Build Artifacts → 5. Generate Patch → 6. Commit & PR
Key information to extract:
EXC_BAD_ACCESS, SIGABRT, etc.Example crash pattern:
EXC_BAD_ACCESS: KERN_INVALID_ADDRESS at 0x3c61c1a3b0d0
objc_msgSend in unknown file
-[SDWebImageManager cacheKeyForURL:context:] ← Crashing function
-[SDWebImageManager loadImageWithURL:options:context:progress:completed:]
Look for:
NullPointerException, OutOfMemoryError# iOS (Swift/Objective-C)
ls node_modules/<package>/ios/
# Android (Kotlin/Java)
ls node_modules/<package>/android/src/main/java/
| Crash Type | Common Cause | Fix Pattern |
|---|---|---|
EXC_BAD_ACCESS | Nil pointer dereference | Add guard let check |
KERN_INVALID_ADDRESS | Accessing deallocated memory | Use weak references |
NullPointerException | Null object access | Add null check |
OutOfMemoryError | Large image/data processing | Add size limits |
// Before (crashes when uri is nil)
imageManager.loadImage(with: source.uri, ...)
// After (safe)
guard let sourceUri = source.uri, !sourceUri.absoluteString.isEmpty else {
onError(["error": "Image source URI is nil or empty"])
return
}
imageManager.loadImage(with: sourceUri, ...)
// Before
val uri = source.uri
loadImage(uri)
// After
val uri = source.uri ?: return
if (uri.toString().isEmpty()) return
loadImage(uri)
Before generating patch, MUST clean Android build cache:
# Remove Android build artifacts to avoid polluting the patch
rm -rf node_modules/<package>/android/build
# For expo-image specifically:
rm -rf node_modules/expo-image/android/build
Why this matters:
.class, .jar, binary files# Generate patch file
npx patch-package <package-name>
# Example:
npx patch-package expo-image
Patch file location: patches/<package-name>+<version>.patch
# Check patch doesn't include unwanted files
grep -c "android/build" patches/<package-name>*.patch
# Should return 0
# View actual changes
head -100 patches/<package-name>*.patch
# Stage patch file
git add patches/<package-name>*.patch
# Commit with descriptive message
git commit -m "fix(ios): prevent EXC_BAD_ACCESS crash in <package> when <condition>
Add guard checks in <package> native layer to prevent crash when <scenario>.
Fixes Sentry issue #XXXXX"
# Create PR
gh pr create --title "fix(ios): <description>" --base x
| Package | iOS Source | Android Source |
|---|---|---|
expo-image | node_modules/expo-image/ios/ | node_modules/expo-image/android/src/ |
react-native | node_modules/react-native/React/ | node_modules/react-native/ReactAndroid/ |
@react-native-async-storage/async-storage | node_modules/@react-native-async-storage/async-storage/ios/ | ...android/src/ |
react-native-reanimated | node_modules/react-native-reanimated/ios/ | ...android/src/ |
Check existing patches for patterns:
ls patches/
cat patches/expo-image+3.0.10.patch
# Clean all build artifacts
rm -rf node_modules/<package>/android/build
rm -rf node_modules/<package>/ios/build
rm -rf node_modules/<package>/.gradle
# Regenerate
npx patch-package <package>
# Check package version matches
cat node_modules/<package>/package.json | grep version
# Rename patch if version changed
mv patches/<package>+old.patch patches/<package>+new.patch
Swift guard let:
guard let value = optionalValue else {
return // Must exit scope
}
// value is now non-optional
Kotlin null check:
val value = nullableValue ?: return
// value is now non-null
patches/node_modules/expo-image/ios/ImageView.swiftnode_modules/expo-image/android/src/main/java/expo/modules/image/