แก้ไขปัญหาจอฟ้า (Blue Screen Error) ตอนเปิดใช้งาน Android Emulator

Android Feb 10, 2021

เคยมั้ย เมื่อเราเปิด Android SDK และเปิดใช้งานเครื่องจำลอง (Android Emulator) เตรียมตัวจะทำงานละ เปิด VS Code พร้อม ไอเดียพร้อม แล้วซักพักหน้าจอของคุณก็เป็นแบบนี้

ระเบิดเวลา ฮ๊าาาาาาาาาาาาาา

หมด หมดกัน
ไปละไอเดียที่คิดไว้ ฟุ้งกระจายหายหมด เออดี!!

ไม่สิ เรื่องแบบนี้มันจะต้องไม่เกิดกับเราคนเดียวแน่ มันต้องมีคนซวยแบบนี้มาก่อน
ไหนๆใครเป็นบ้าง >> เปิดดู Stackoverflow แปป

เข้าเรื่องกันเลย

ไอ้จอฟ้าเนี่ย มันมีสาเหตุที่เป็นไปได้คือ การทำ Hardware Acceleration จาก Graphic driver ไม่ support หรือว่าไม่เข้ากันกับ Android Emulator เมื่อมีการเปิดใช้งาน Emulator ตัว Hardware หรือ Software Acceleration จะถูกเรียกใช้โดยอัตโนมัติ

Hardware Acceleration คือ การใช้ GPU เรนเดอร์เพื่อที่จะให้ CPU ประมวลผลฟังก์ชั่นหรือคำสั่งใดๆออกมาได้สำเร็จ (force GPU rendering)

ส่วน Software Acceleration ก็คล้ายๆ Hardware แต่จะเปลี่ยนเป็น ใช้ Software แทน Hardware การเรนเดอร์จะเกิดบน CPU

แนวทางการแก้ไขคือ ไม่ให้ Emulator ใช้ Hardware หรือ Software Acceleration ของ GPU’s แบบอัติโนมัติซะ แล้วเมื่อเปิด Emulator ให้เรียกใช้งานได้ 2 ตัวเลือก

  1. ใช้ Software Accelerator จาก CPU’s คอมพิวเตอร์โดยตรง
  2. ใช้ ANGLE ซึ่งเป็น Open Source ที่ Google ออกแบบมาเพื่อให้สามารถใช้ OpenGL ร่วมกับ Windows ได้อย่างเต็มประสิทธิภาพ ดู ANGLE เพิ่มเติม

บทความนี้จะขอบันทึกวิธีแก้ปัญหาจอฟ้าบน Winows 10 ให้กลับมาใช้ AVD ได้อย่างราบรื่นอีกครั้ง มีขั้นตอนการแก้ปัญหาดังนี้

เปิด Terminal แล้ว path ไปที่โฟลเดอร์ที่ Android Emulator อยู่ เช่น
C:\Users\userName\AppData\Local\Android\sdk\emulator

cd C:\Users\userName\AppData\Local\Android\sdk\emulator

ดูลิสต์รายชื่อ Emulator ที่เราสร้างทั้งหมด

./emulator -list-avds

จะมีรายชื่อปรากฏออกมาทั้งหมด ในที่นี้มีการสร้างไว้แค่ตัวเดียว

Pixel_4_API_29

ใช้คำสั่ง ฟอร์ม

./emulator -avd <avd_name> -gpu <mode> [{-option [value]} ... ]

เพื่อรัน emulator ขึ้นมา

avdname คือชื่อ emulator ที่ต้องการรัน
mode แทนค่าที่เราต้องการให้ emulator รันในหมวดใดๆ เช่น

auto >> เร่งประมวลผลด้วย hardware (GPU) หรือ Software (CPU) ตามที่ตั้งค่าไว้

host >> ใช้ GPU เรนเดอร์ และโหลด OpenGL ลงไปประมวลผลด้วยเพื่อให้ได้กราฟฟิคที่ดีเยี่ยม

angle_indirect >> เรนเดอร์ด้วย software ใช้ ANGLE Direct3D ประมวลผลแบบ Quick boot (การบันทึกสถานะของ emulator เพื่อให้การ boot ครั้งที่สองขึ้นไปรวดเร็วขึ้น คล้ายๆ host นะ แต่ใช้ Microsoft DirectX แทน OpenGL ทำให้ไม่ต้องยุ่งเกี่ยวกับ GPU

ในที่นี้ เราลองใช้ host รัน emulator ดูก่อน เผื่อเวิร์ก

.\emulator -avd Pixel_4_API_29 -gpu host

ค้นพบว่า ขึ้นจอฟ้า เพราะว่าการเรนเดอร์ด้วย GPUไม่เหมาะกับ emulator ตามสาเหตุที่ได้บอกไปข้างบน

ลองใช้ mode เป็น angle_indirect

ใช้คำสั่ง

./emulator -avd Pixel_4_API_29 -gpu angle_indirect

รอผลยาวไปๆ

emulator: Android emulator version 30.3.5.0 (build_id 7033400) (CL:N/A)
handleCpuAcceleration: feature check for hvf
added library vulkan-1.dll
Failed to open /qemu.conf, err: 2
Windows Hypervisor Platform accelerator is operational
emulator: INFO: GrpcServices.cpp:288: Started GRPC server at 127.0.0.1:8554, security: Local

เมื่อ emulator เปิดขึ้นมาแล้ว พบว่า ไม่เกิดจอฟ้าอีก โอเค

ที่จริงมีอีก way หนึ่งที่สามารถตั้งค่าบน AVD Manager แต่เราคิดว่า่ เปิดบน terminal มันสะดวกกว่า ใครจะสนใจสามารถเข้าดูได้ที่นี่
นี่เป็นทริคเล็กๆน้อยๆ ใช้แก้ปัญหาเพื่ออำนวยความสะดวกในการพัฒนางานของเราให้ลื่นไหล ไม่มาเสียอารมณ์กับจอฟ้า ไอเดียไม่สะดุด งานผ่านไปลุล่วงด้วยดีครับ

References

Android Studio, Suddenly got GPU Driver Issue when running emulator

Configure hardware acceleration for the Android Emulator

What are software accelerators?

Hardware acceleration

Force GPU Rendering

Tags