Bản release khác bản debug ở nhiều chỗ: code được minify/obfuscate, JS bundle nhúng sẵn trong app, không có Dev Menu hay red box báo lỗi. Một lỗi JS không bắt được trong release thường chỉ hiện ra là màn hình trắng hoặc app tự thoát.
Bước 1 — tái hiện ở máy mình thay vì đoán:
npm run android -- --mode="release"
adb logcat | grep -iE "ReactNativeJS|AndroidRuntime"iOS: chạy scheme Release trong Xcode và xem console.
Bước 2 — đọc được stack trace: stack trace release chỉ có dạng p@1:132161. Dùng source map để symbolicate (npx metro-symbolicate <file.map> < stacktrace.txt); iOS phải bật SOURCEMAP_FILE trong build phase mới sinh source map. Trên production, upload source map lên Sentry để tự giải mã; Crashlytics không nhận source map JS nên phải chạy metro-symbolicate thủ công.
Nguyên nhân hay gặp:
- R8/ProGuard xoá hoặc đổi tên class mà thư viện native gọi qua reflection → thiếu keep rule trong proguard-rules.pro.
- Gọi API bằng HTTP: Android 9+ chặn cleartext mặc định, iOS có ATS — debug trỏ localhost thì chạy, release thì lỗi mạng.
- Biến môi trường/config chỉ có ở máy dev, không vào bản build.
- Code dựa vào __DEV__ hoặc chỉ chạy đúng khi debugger đang mở.
- Thiếu Error Boundary → một lỗi render làm trắng toàn bộ màn hình.
Lưu ý: luôn test bản release (và test hiệu năng) trước khi upload — chạy thử bản release trên máy thật nên là một bước cố định trong checklist phát hành.