ตั้งค่า Android
หน้านี้รวบรวมโน้ต Android build ที่เคยกระจายอยู่หลายที่ใน repo
ตำแหน่งของแอป
- Mobile POS app:
apps/mobile - POS terminal app:
apps/pos-terminal
คำสั่งหลัก
รันจาก monorepo root:
yarn mobile:start
yarn mobile:android
yarn mobile:apk
yarn mobile:aab
yarn terminal:start
yarn terminal:android
รัน Mobile และ Terminal บน Android 2 เครื่อง
เมื่อเสียบ Android พร้อมกัน 2 เครื่อง ให้ระบุเครื่องเป้าหมายของแต่ละคำสั่งด้วย
ANDROID_SERIAL
ดู serial ของเครื่องที่ต่ออยู่ก่อน:
adb devices
ตัวอย่าง:
List of devices attached
R58M123456A device
ZY22ABCDE9 device
รัน Mobile POS บนเครื่องหนึ่ง และ POS Terminal บนอีกเครื่องจากคนละ terminal:
ANDROID_SERIAL=R58M123456A yarn mobile:android
ANDROID_SERIAL=ZY22ABCDE9 yarn terminal:android
ถ้า React Native ยังเลือกเครื่องผิด ให้ส่ง device id เข้า workspace script โดยตรง:
yarn workspace @bsr/mobile android --deviceId R58M123456A
yarn workspace @bsr/pos-terminal android --deviceId ZY22ABCDE9
สำหรับงาน install/run ทั่วไป ใช้ ANDROID_SERIAL ก็พอ แต่ถ้าต้องเปิด Metro
พร้อมกันทั้งสองแอป ให้หลีกเลี่ยงการใช้ Metro port เดียวกันทั้งคู่ โดยให้แอปหนึ่ง
ใช้ค่า default 8081 และอีกแอปใช้ port แยก เช่น 8082 แล้ว reverse port ตาม
serial ของแต่ละเครื่อง:
adb -s R58M123456A reverse tcp:8081 tcp:8081
adb -s ZY22ABCDE9 reverse tcp:8082 tcp:8082
รันจากใน mobile app เมื่อจำเป็นต้องใช้ Gradle โดยตรง:
cd apps/mobile/android
./gradlew clean assembleRelease
./gradlew clean bundleRelease
รันจากใน mobile app เมื่อต้องติดตั้ง release APK ที่ build ไว้แล้ว:
cd apps/mobile
yarn install:app
เครื่องมือที่ต้องมีในเครื่อง
- Node.js ที่รองรับ
>=22.11.0 - Yarn Classic
1.22.x - Java และ
JAVA_HOMEที่ชี้ไป JDK ที่ถูกต้อง - Android SDK ที่ Gradle เข้าถึงได้
- Android build-tools และ platform SDK ตามที่โปรเจกต์ต้องใช้
- Android NDK version ตามที่ Gradle คาดหวัง
adbอยู่ในPATH
ค่า signing สำหรับ release
Android app อ่านค่า release signing จาก Gradle properties:
MYAPP_UPLOAD_STORE_FILEMYAPP_UPLOAD_STORE_PASSWORDMYAPP_UPLOAD_KEY_ALIASMYAPP_UPLOAD_KEY_PASSWORD
ให้เช็กว่าค่าเหล่านี้มาจากที่ไหนในแต่ละเครื่อง:
~/.gradle/gradle.properties- project
gradle.properties - secret injection ของ CI/CD
ปัญหา APK signature ไม่ตรงตอน install
ถ้า yarn install:app ล้มเหลวด้วยข้อความ:
INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package th.co.boonsiri.pos signatures do not match newer version
แปลว่า device มี th.co.boonsiri.pos ติดตั้งอยู่แล้ว แต่ถูก sign ด้วย key
คนละตัวกับ APK ใหม่ Android จึงไม่ยอม update ทับ
สำหรับการทดสอบในเครื่อง ให้ uninstall แอปเดิมก่อน แล้วค่อย install ใหม่:
cd apps/mobile
yarn clear:app
yarn install:app
คำสั่ง uninstall จะลบ app data บน device/emulator นั้นด้วย ถ้าต้องรักษา app data ไว้ ต้อง build APK ด้วย signing key เดียวกับแอปที่ติดตั้งอยู่แล้ว
โน้ตการอัปเกรด React Native core
เมื่ออัปเกรด React Native core ให้ใช้ React Native Upgrade Helper เป็น baseline ของ template diff เช่น:
https://react-native-community.github.io/upgrade-helper/?from=0.84.1&to=0.85.2
ห้าม copy template ทับ repo นี้ตรง ๆ เพราะ mobile app มี native configuration
เฉพาะโปรเจกต์ที่ต้องรักษาไว้ เช่น monorepo paths ใน android/app/build.gradle,
explicit Node/Hermes paths, font linking ของ react-native-vector-icons,
Firebase Google Services, release signing, app versioning และ Gradle task
workaround ของ Reanimated/Worklets