ข้ามไปยังเนื้อหาหลัก

ตั้งค่า 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_FILE
  • MYAPP_UPLOAD_STORE_PASSWORD
  • MYAPP_UPLOAD_KEY_ALIAS
  • MYAPP_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