Nhật ký Debug: Xử lý lỗi “EADDRINUSE” và “NullPointerException” khi Build React Native Android
Nếu bạn là một lập trình viên React Native, chắc hẳn không ít lần bạn gặp tình huống “đau đầu”: Code chạy mượt mà trên máy ảo (Simulator), nhưng đến khi đóng gói (Build Release) để đẩy lên Store thì Terminal lại “nhuộm đỏ” lỗi.
Hôm nay, tôi sẽ chia sẻ lại quá trình xử lý hai lỗi cực kỳ phổ biến nhưng dễ gây hoang mang khi làm việc với Android: lỗi chiếm dụng cổng (Port 8081) và lỗi cấu hình chữ ký (Signing Config) gây ra NullPointerException.
1. Lỗi Metro Bundler: EADDRINUSE :::8081
🛑 Triệu chứng
Khi bạn chạy lệnh yarn start hoặc cố gắng run ứng dụng, Terminal báo lỗi ngay lập tức:
Sao chéperror listen EADDRINUSE: address already in use :::8081.
Error: listen EADDRINUSE: address already in use :::8081
...
error Command failed with exit code 1.
🔍 Nguyên nhân
Lỗi này đơn giản là Cổng 8081 (cổng mặc định của Metro Bundler) đang bị một tiến trình khác chiếm giữ. Thường là do:
- Bạn đang mở một cửa sổ Terminal khác chạy
yarn start. - Một tiến trình Node.js cũ bị treo và chưa tắt hẳn.
✅ Cách xử lý nhanh gọn (Windows)
Thay vì khởi động lại máy, bạn có thể “tiêu diệt” tiến trình đang chiếm cổng bằng PowerShell:
Bước 1: Tìm PID (Process ID) của tiến trình đang chiếm cổng 8081.
Sao chépnetstat -ano | findstr :8081
Kết quả sẽ trả về dạng: TCP 0.0.0.0:8081 ... LISTENING 12345 (trong đó 12345 là PID).
Bước 2: Tắt tiến trình đó.
Sao chéptaskkill /PID 12345 /F
(Thay 12345 bằng số PID bạn tìm được).
Sau đó, bạn có thể chạy lại yarn start bình thường.
2. Lỗi Build Android: NullPointerException tại bước Signing
Đây là lỗi “khó chịu” hơn vì thông báo lỗi của Gradle rất mơ hồ.
🛑 Triệu chứng
Khi chạy lệnh build release (ví dụ: ./gradlew bundleRelease), quá trình chạy đến 99% rồi thất bại:
Sao chépExecution failed for task ':app:signExperimentalReleaseBundle'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.FinalizeBundleTask$BundleToolRunnable
> java.lang.NullPointerException (no error message)
🔍 Nguyên nhân sâu xa
Lỗi NullPointerException ở bước sign... thường có nghĩa là Gradle không tìm thấy thông tin Keystore (File khóa, mật khẩu, alias).
Trong file android/app/build.gradle, chúng ta thường hay copy đoạn code mẫu có điều kiện if:
Sao chép// ĐOẠN CODE GÂY LỖI
signingConfigs {
release {
// Nếu không tìm thấy biến này trong gradle.properties
// Toàn bộ đoạn bên trong sẽ bị BỎ QUA
if (project.hasProperty('my-upload-key.keystore')) {
storeFile file('my-upload-key.keystore')
storePassword '...'
// ...
}
}
}
Nếu bạn quên khai báo biến trong gradle.properties, điều kiện if trả về false. Gradle sẽ bỏ qua việc nạp mật khẩu, dẫn đến cấu hình signing bị null và gây crash.
✅ Giải pháp triệt để
Để fix lỗi này nhanh chóng, hãy loại bỏ điều kiện if và điền trực tiếp thông tin (Hardcode) vào build.gradle để đảm bảo Gradle luôn đọc được.
Sửa file android/app/build.gradle:
Sao chépsigningConfigs {
release {
// Xóa bỏ dòng if (project.hasProperty...)
// Chú ý: Dùng dấu ngoặc kép "" cho chuỗi ký tự
storeFile file("my-upload-key.keystore")
storePassword "MatKhauCuaBan123"
keyAlias "my-key-alias"
keyPassword "MatKhauCuaBan123"
}
}
Lưu ý quan trọng:
- Vị trí file: File
my-upload-key.keystorebắt buộc phải nằm trong thư mụcandroid/app/. - Cú pháp: Trong Groovy (Gradle), hãy chắc chắn bạn dùng dấu ngoặc kép
""cho mật khẩu và tên alias. Nếu viếtstorePassword MatKhau(không có ngoặc), Gradle sẽ hiểu nhầm đó là tên biến và báo lỗi.
Sau khi sửa xong, hãy chạy lệnh clean và build lại:
Sao chépcd android
./gradlew clean
./gradlew bundleRelease
💡 Bài học rút ra
- Đừng tin tưởng tuyệt đối vào code mẫu: Các đoạn code có điều kiện
ifrất tốt cho sự linh hoạt, nhưng lại là “bẫy” nếu bạn quên cấu hình môi trường. Khi debug, hãy thử đơn giản hóa mọi thứ (hardcode) để tìm ra nguyên nhân. - Bảo mật: Việc điền mật khẩu trực tiếp vào
build.gradlegiúp fix lỗi nhanh, nhưng TUYỆT ĐỐI KHÔNG commit file này lên Github công khai (Public Repo). Hãy dùng file.gitignorehoặc biến môi trường (Environment Variables) khi dự án đã ổn định.
Hy vọng bài viết này giúp bạn tiết kiệm được vài giờ đồng hồ debug. Chúc các bạn build app thành công! 🚀
Tags: #ReactNative #Android #Gradle #Debug #Programming