เจาะลึกกับการทำงานของ LZPlay ที่ทำให้ GMS สามารถใช้บน Huawei Mate 30 Series ได้

ผมเชื่อว่าผู้อ่านหลายๆท่านคงรู้เรื่องราวของ Huawei Mate 30 Series กับ GMS กันอยู่แล้ว ว่าจะเป็นมือถือรุ่นแรกๆของ Huawei ในตลาดทั่วโลกที่ไม่มี GMS ติดตั้งมากับเครื่อง จึงทำให้เหล่าผู้ใช้หลายๆคนหาทางติดตั้ง GMS ลงในเครื่องเพื่อใช้งานแอปต่างๆได้

ซึ่งวิธีหนึ่งที่ผู้ใช้ไม่อยากทำกันก็คือการ Unlock Bootloader แล้วเข้า Recovery Mode เพื่อติดตั้ง GMS เพราะมันมีขั้นตอนที่ยุ่งยากและไม่ใช่ทุกคนที่จะทำกัน จนล่าสุดก็ได้มีแอปที่ชื่อว่า LZPlay ที่สามารถติดตั้ง GMS ลงในเครื่องได้โดยที่ไม่ต้อง Unlock Bootloader และทำได้ง่ายมาก

ทั้งๆที่ผ่านมาได้มีหลายๆคนลองใช้แอปสำหรับติดตั้ง GMS มากมาย แต่ก็ใช้งานไม่ได้ มีแต่เพียง LZPlay เท่านั้นที่สามารถทำได้

 

LZPlay ทำได้อย่างไร?

 

คำถามนี้เป็นคำถามที่น่าสนใจมากสำหรับผม เพราะว่าการติดตั้ง GMS ด้วยวิธีง่ายๆอย่างการเอา APK มาติดตั้งนั้นเป็นเรื่ืองที่เป็นไปไม่ได้อยู่แล้ว ถ้าเราดูเงื่อนไขการทำงานของแอปตัวอื่นๆทำแล้วใช้งาน GMS ไม่ได้ นั่นก็เพราะว่า

 

System App vs Non-system App

เรารู้กันอยู่แล้วว่าแอนดรอยด์ถูกออกแบบมาให้โปรแกรมต่างๆทำงานได้ก็ต่อเมื่ออยู่ในรูปของแอปที่ติดตั้งจากไฟล์ APK เท่านั้น และแอนดรอยด์ก็ได้แบ่งพื้นที่สำหรับติดตั้งแอปไว้ 2 แบบคือ Non-system app (Normal app)  และ System app

Non-system app (Normal app) – แอปที่ติดตั้งจาก Play Store หรือไฟล์ APK จะอยู่ที่นี่ โดยจะถูกติดตั้งไว้ที่ /data/app ซึ่งการทำงานก็จะอยู่ในขอบเขตที่แอปทั่วๆไปจะทำได้

System app – แอปที่ติดตั้งผ่าน Recovery Mode หรือแอปที่มากับ Firmware จะอยู่ที่นี่ โดยจะถูกติดตั้งไว้ที่ /system/app ซึ่งจะได้อภิสิทธิ์พิเศษที่แอปทั่วไปไม่สามารถทำได้ เช่น การสั่งติดตั้ง APK โดยไม่ต้องถาม User (Silent install) หรือสั่งให้แอปสามารถทำงานเบื้องหลังโดยไม่ถูกสั่งปิด (Prevent force stop)

ด้วยเงื่อนไขดังกล่าวจึงทำให้แอปที่ถูกติดตั้งด้วยการเอาไฟล์ APK มาใส่ไว้ในเครื่องแล้วกด Install จึงกลายเป็นแค่ Non-system app (Normal app) โดยทันที แต่สำหรับ GMS นั้นจำเป็นต้องติดตั้งเป็น System App เท่านั้น จึงเป็นเหตุผลว่าทำไมการติดตั้งผ่านไฟล์ APK จึงไม่เกิดผลอะไร ต้อง Unlock Bootloader และเข้า Recovery Mode เพื่อติดตั้งแอปเท่านั้นถึงจะทำให้ GMS กลายเป็น System app และทำงานได้จริงๆ

แล้วเหตุใด LZPlay ถึงทำให้เราติดตั้ง GMS ลงในเครื่องแล้วทำงานได้?

ถ้าผู้อ่านได้ลองใช้ LZPlay เพื่อติดตั้ง GMS ลงในเครื่องของ Huawei ที่ไม่มี GMS ก็จะพบว่ามันมีขั้นตอนที่เรียบง่ายมาก เหมือนกับการติดตั้งแอปแบบปกติเลย ไม่ต้องไปเข้า Recovery Mode ให้ลำบากเลยซักนิด

แต่ขั้นตอนหนึ่งที่เด่นสะดุดตามากสำหรับผมก็คือขั้นตอนนึงที่ต้องกดปุ่ม Activate ที่หน้าเมนูที่ชื่อว่า Activate device administrator?

เครดิตภาพจาก Android Central

ถ้าผู้อ่านเป็นนักพัฒนาที่เคยเขียนแอปแล้วยุ่งเกี่ยวกับหน้านี้มาก่อน ก็จะตอบเป็นเสียงเดียวกันว่า “นี่มัน Device Adminstator นี่นา!!”

และเมื่อลองหยิบเจ้าแอป LZPlay มาแงะดูข้างในก็พบกับ Permission ที่น่าสนใจในแอปดังนี้

ซึ่งเป็น Permission ของ Huawei สำหรับ Solution ที่เรียกกันว่า Enterprise Mobility Management Solution นั่นเองงงงงงง

ว่าแต่มันเกี่ยวอะไรกับแอปอย่าง LZPlay ล่ะ?

 

รู้จักกับ Enterprise Mobility Management Solution (EMM)

ลองนึกภาพว่าผู้อ่านเป็นเจ้าของบริษัทใหญ่ที่มีนโยบายให้พนักงานทุกคนใช้มือถือของบริษัทในการทำงาน (สมมติว่าเหมา  Huawei P30 ให้พนักงานทุกคนใช้) แต่อยากให้พนักงานใช้เพื่อทำงานในเวลางานเท่านั้น ไม่อยากให้แอบเอาไปใช้เล่น Facebook เล่น IG หรือเปิดดู YouTube ตอนทำงาน แต่นอกเวลางานก็ใช้งานได้ปกติ ซึ่งนั่นเองที่ EMM จะมาตอบโจทย์ให้กับบริษัทของคุณ

EMM เป็น Solution ที่แบรนด์มือถือเจ้าใหญ่ๆมีไว้เพื่อให้บริการกับบริษัทที่ต้องการควบคุม Policy ในการใช้งานมือถือแต่ละเครื่องผ่าน Admin ในบริษัท (MDM) แต่นอกเหนือจากเวลาทำงานก็อยากให้เครื่องเหล่านั้นสามารถใช้งานทั่วไปได้ปกติ (BYOD) จะได้ไม่ต้องมาพกมือถือ 2 เครื่อง เพื่อใช้งานแยกกัน ซึ่ง Huawei ก็มี Solution นี้ให้กับบริษัทต่างๆที่ต้องการซื้อเครื่องของ Huawei ไปใช้นั่นเอง

จริงๆแอนดรอยด์ก็มี EMM เหมือนกันนะ มีชื่อเรียกว่า Android Work หรือ Android Enterprise

และ Solution ที่ว่านี้ก็ได้เปิดเป็นชุดพัฒนา (SDK) ให้กับนักพัฒนาของแต่ละบริษัทเพื่อนำความสามารถของ MDM ไปใส่ไว้ในแอปของบริษัทได้ด้วย โดยมีเงื่อนไขว่าจะต้องติดต่อเพื่อเป็น Partner กับทางเจ้าของแบรนด์ก่อน เช่น ถ้าคุณอยากจะใช้ชุดพัฒนาสำหรับ MDM ของ Huawei ก็จะต้องติดต่อกับทาง Huawei เพื่อเป็น Partner นั่นเอง

จะเห็นว่ามีคำเพิ่มเข้ามามากมายอย่าง EMM, MDM และ BYOD แต่ต่อจากนี้ผมจะพูดถึงแค่ MDM เท่านั้นนะ

 

ชุดพัฒนาสำหรับ MDM ทำอะไรได้บ้าง?

เนื่องจากเป็น Solution ที่ออกแบบมาเพื่อบริษัทและองค์กรอยู่แล้ว ไม่ได้มีไว้ให้ผู้ใช้ทั่วไป จึงไม่ต้องสนหรือแคร์เรื่อง Privacy มากนัก จึงเหมาะสำหรับนักพัฒนาที่ต้องการทำแอปสำหรับใช้งานในองค์กร โดยความสามารถที่น่าสนใจก็จะมีประมาณนี้

• สั่งเครื่องไม่ให้โอนข้อมูลผ่าน USB, ไม่ให้เข้า Safe Mode, ไม่ให้ใช้งาน USB OTG หรือห้ามเชื่อมต่อผ่าน ADB
• บล็อคการกดปุ่ม Home, Back, Task หรือแม้กระทั่งปุ่ม Volume และ Power
• ล็อคไม่ให้แคปภาพหน้าจอ หรือสั่งแคปภาพหน้าจอ
• บล็อคและซ่อนแอปที่ไม่ต้องการให้ใช้งาน (ถึงแม้จะติดตั้งอยู่ในเครื่องแล้วก็ตาม)
• สั่งติดตั้ง/อัพเดท/ลบแอปโดยไม่ต้องขออนุญาตจากผู้ใช้
• บังคับเปิด/ปิดการใช้งาน GPS
• ปิดแอปอื่นๆในเครื่อง
• ห้ามไม่ให้ใช้งานกล้องหรือไมโครโฟน
• เปิด/ปิด Developer options

จริงๆมีอีกเยอะมาก แต่ขอหยิบเฉพาะส่วนที่น่าสนใจมาพูดถึงเพื่อให้เห็นภาพว่า MDM ทำอะไรได้บ้าง เพราะการทำงานเหล่านี้เดิมทีไม่สามารถทำได้บนอุปกรณ์แอนดรอยด์ทั่วๆไป แต่สามารถทำได้ในเครื่องของบริษัทหรืือองค์กร

 

แล้วเกี่ยวอะไรกับ LZPlay?

เนื่องจากขั้นตอนการเปิดใช้งาน MDM ของอุปกรณ์แอนดรอยด์ทุกๆเครื่องจะต้องผ่านการขออนุญาตในหน้าที่ชื่อว่า Device Administator ของแอนดรอยด์ก่อน ถึงจะเริ่มใช้งานได้ จึงทำให้รู้ได้ทันทีว่ามีการใช้ MDM นั่นเอง

หน้านี้เนี่ยแหละ แอปทั่วไปเค้าไม่เปิดหน้านี้กันหรอก และขอบคุณสำหรับภาพประกอบจาก Android Central อีกครั้ง

ผมเคยมีประสบการณ์เขียนแอปที่เรียกใช้งานระบบนี้บนอุปกรณ์แอนดรอยด์มาก่อน แต่ก็ยังข้องใจอยู่ว่า MDM จะมาแก้ปัญหาเรื่อง GMS ได้อย่างไร ถึงแม้ว่า MDM จะสั่งให้ติดตั้งแอปได้ก็จริง แต่ว่าแอปดังกล่าวก็เป็นแอปธรรมดาๆในเครื่องเท่านั้น ไม่ใช่ System App แต่อย่างใด

จนกระทั่งไปกลับไปดู Permission ของ Huawei ในแอป LZPlay ใหม่อีกครั้ง

แปะภาพนี้อีกครั้ง จะได้ไม่ต้องเลื่อนขึ้นไปดู

สิ่งที่ผมเอะใจนั้นมีอยู่อย่างนึง เพราะว่าปกติแล้วการใช้งาน MDM ของแต่ละเจ้าก็จะต้องประกาศ Permission แบบนี้ไว้ในแอปน่ะแหละ แต่จริงๆจะมีแค่ 2 อย่างเท่านั้นที่จำเป็นสำหรับ MDM นั่นก็คือ com.huawei.permission.sec.MDM กับ com.huawei.permission.sec.MDM_APP_MANAGEMENT

 

เดี๋ยวนะ? แล้ว Permission 2 ตัวหลังนั้นมาจากไหน?

 

สำหรับ com.huawei.permission.sec.MDM_INSTALL_SYS_APP คงอ่านแล้วเข้าใจได้ไม่ยากว่ามันคือการขอติดตั้งแอปให้เป็น System App นั่นเอง ส่วน com.huawei.permission.sec.MDM_INSTALL_UNDETACHABLE_APP อันนี้นึกไม่ออกจริงๆว่ามันคืออะไร

แต่ที่น่าแปลกใจสุดๆก็คือ MDM_INSNTALL_SYS_APP ไม่เคยมีการพูดถึงในเอกสารอธิบายเกี่ยวกับชุดพัฒนาสำหรับ MDM ของ Huawei มาก่อนเลย แล้วทำไม LZPlay ถึงได้รู้ว่ามี Permission ตัวนี้อยู่ และนั่นหมายความว่า Huawei แอบทำช่องทางพิเศษสำหรับทำแบบนี้ได้ด้วย?

เมื่อรวมข้อมูลต่างๆเข้าด้วยกันแล้ว จึงสามารถเข้าใจได้ไม่ยากว่า LZPlay ใช้วิธีเปิดใช้งาน MDM แล้วใช้ Permission พิเศษของ Huawei เพื่อติดตั้ง GMS ให้เป็น System app นั่นเอง เย้ Happy Ending

 

เดี๋ยวสิ จะ Happy Ending ได้ยังไงล่ะ!!

อย่างที่บอกไปในตอนแรกว่า MDM เป็น Solution สำหรับบริษัทหรือองค์กรที่ต้องการควบคุมมือถือได้มากกว่าทั่วไป นั่นหมายความว่าการเปิดใช้งาน MDM บนเครื่อง Huawei จะทำให้ติดตั้ง GMS ได้ก็จริง แต่ก็หมายความว่าแอปดังกล่าวสามารถควบคุมเครื่องได้มากกว่าที่คิดด้วยเช่นกัน (จะสั่งโหลดแอปอื่นๆมาติดตั้งเป็น System App ก็ทำได้เช่นกัน) ซึ่งขึ้นอยู่กับเจตนาของนักพัฒนานั่นแหละ

แท้จริงแล้ว MDM ของแต่ละแบรนด์ก็พัฒนาต่อยอดจาก Android Enterprise อีกทีนั่นเอง

และการใช้งาน MDM ก็จะต้องติดต่อกับทาง Huawei เพื่อขอ License Key ในการใช้งานด้วย ซึ่งก็จะมีเรื่องเงื่อนไขในการนำไปใช้งานด้วย แต่การนำไปใช้ทำแอปแบบ LZPlay น่าจะผิดเงื่อนไขนะ

ต้องบอกเลยว่า LZPlay นั้นสามารถทำให้ Huawei Mate 30 และ Huawei Mate 30 Pro ใช้งาน GMS ได้โดยไม่ต้อง Unlock Bootloader ก็จริง แต่ในอีกมุมนึงก็ต้องเตือนเรื่องการเปิดใช้งาน MDM ด้วยเช่นกัน เพราะมันไม่ได้เหมือนการขอ Permission แบบทั่วไปที่แอปทำกัน แต่นี่คือการเปิดให้แอป LZPlay สามารถควบคุมเครื่องได้เยี่ยงกับเครื่องของพนักงานบริษัทเลยทีเดียว

สุดท้ายแล้วก็อยู่ที่ความเชื่อใจในตัวนักพัฒนาที่เป็นคนเขียน LZPlay นั่นแหละครับ ว่าจุดประสงค์ของแอปคืออะไรกันแน่ มีอะไรแอบแฝงหรือไม่ ถ้าคุณมั่นใจว่าไม่มีปัญหาอะไร แล้วติดตั้ง GMS ผ่าน LZPlay ก็ถือว่าเป็นการยอมรับความเสี่ยงด้วยตัวคุณเองเช่นกัน

แต่ถ้าจะให้ดี ลงเสร็จแล้ว ก็ลบ LZPlay ทิ้งเถอะครับ 😉 ลงแอปที่ขอใช้งาน MDM ทิ้งไว้แบบนั้นไม่ใช่เรื่องดีซักเท่าไร ด้วยความหวังดีจากนักพัฒนาตาดำๆคนนึงที่เห็นช่องทางแบบนี้แล้วรู้สึกว่าถ้าได้ลองเขียนโค้ดที่ชั่วร้ายขึ้นมาน่าจะสนุกไม่น้อยเลยล่ะ (โชคดีที่ความดีในตัวยังคงห้ามไว้ได้อยู่)