ถ้าเป็นทีมที่ทำแอปมือถือ เชื่อว่าคงเคยเจอปัญหานี้กันมาบ้าง อุปกรณ์สำหรับทดสอบมีไม่เคยพอ และก็ยากที่จะครอบคลุมเวอร์ชัน OS ได้ครบถ้วน จะให้ใช้ซิมูเลเตอร์ก็ต้องมี Xcode หรือ Android Studio ทำให้เพื่อนร่วมทีมที่ไม่มีสภาพแวดล้อมพัฒนาแอปมือถือ เช่น ฝั่งวางแผน ดีไซเนอร์ หรือวิศวกรเซิร์ฟเวอร์ เข้าไม่ถึงตั้งแต่ต้น เวลามีคำขออย่าง "อยากดูตัวที่ deploy ลง sandbox แล้ว ต้องติดตั้งแอปยังไง?" นักพัฒนามือถือก็ต้องหยุดงานที่ทำอยู่มาช่วยทุกครั้ง

เราเคยพิจารณา Appetize และ BrowserStack เหมือนกัน แต่ติดอยู่ที่ (1) ค่าบริการที่เพิ่มขึ้นเร็วเมื่อทีมใหญ่ขึ้น และ (2) โครงสร้างที่ต้องอัปโหลดไบนารีของแอปขึ้น external cloud สุดท้ายเลยทำขึ้นเองด้วย Mac ที่ว่างอยู่

สิ่งที่ทำออกมาก็คือ tapflow — เครื่องมือโอเพนซอร์สแบบ self-hosting สำหรับให้ทุกคนในทีมทำ mobile QA ผ่าน iOS simulator และ Android emulator บนเบราว์เซอร์ได้ ฝั่งคนใช้งานไม่ต้องติดตั้งอะไรเลย แค่เปิดเบราว์เซอร์ก็พอ และเพราะเป็น self-hosting ข้อมูลแอปก็จะไม่ออกไปนอก Mac ของทีม

สิ่งที่ยากที่สุดตอนทำไม่ใช่ฟีเจอร์ แต่เป็น latency ครับ ถ้าภาพหน่วงแค่ครึ่งจังหวะ ทุกคนก็จะลองเลื่อนหน้าจอสักครั้งแล้วปิดทันที ยิ่งไปกว่านั้น หน้าจอซิมูเลเตอร์ต้องผ่าน pipeline agent → relay → browser render ทำให้ความหน่วงสะสมในแต่ละช่วง นี่คือสิ่งที่เราจัดการเพื่อลด latency บนเส้นทางนี้:

  • เราเลิกใช้ MSE เพราะ media buffer ของ <video> มีความหน่วงเชิงโครงสร้างประมาณ ~235ms เลยเปลี่ยนเป็น 2-tier คือ WebCodecs (secure context) / WASM tinyh264 (HTTP แบบไม่เข้ารหัส) พร้อมประกาศ reorder=0 ใน SPS ทำให้ decode→present จาก 267ms เหลือ 2.5ms (วัดด้วย single clock บน localhost)
  • เรา benchmark decoder 4 ตัว (tinyh264/FFmpeg/openh264) แต่สุดท้ายยังใช้ tinyh264 ต่อ — FFmpeg ชนะเฉพาะภาพนิ่ง แต่พอเป็นการเลื่อนหน้าจอก็แพ้ทุกครั้ง แถม bundle ยังใหญ่กว่า 11 เท่า คอขวดจริงไม่ใช่ decoder แต่เป็นโหลดและการส่งข้อมูล
  • เราปรับ Android SW encoding ให้ดีขึ้นด้วย HW encoding ของ Mac ใน emulator ไม่มี HW H.264 encoder ทำให้ scrcpy ติดคอขวดที่ SW encoder (22–29fps) เราดึง raw frame ออกมาที่ host ผ่าน gRPC แล้วเข้ารหัสด้วย Mac VideoToolbox → ได้ 59fps (downscale) (ค่าเริ่มต้นยัง capture ที่ 30fps และยังคงใช้ scrcpy กับอุปกรณ์จริง)
  • ฉีด touch บน iOS โดยตรงผ่าน CoreSimulator HID API โดยไม่ต้องใช้ WDA และ Mac Agent เชื่อมต่อออกไปหา relay แบบ outbound only (ไม่ต้องตั้ง inbound firewall rule)
โฆษณา

ข้อจำกัด: iOS agent ใช้ได้เฉพาะบน macOS, การ touch ใช้ Private API จึงอาจพังได้เมื่อ macOS อัปเดต, ตอนนี้ยังเป็น v0.x และยังไม่รองรับอุปกรณ์จริง

npm install -g tapflow  
tapflow start   # → http://localhost:4000  

สัญญาอนุญาต MIT
GitHub: https://github.com/jo-duchan/tapflow
เอกสาร: https://www.tapflow.dev

ถ้าใครเคยเจอปัญหาเรื่องการเข้าถึงซิมูเลเตอร์ หรือมีความเห็นเกี่ยวกับแนวทาง low-latency streaming / การเข้าถึงแบบ Private API ก็ยินดีรับฟังครับ

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น