27 ธันวาคม 2558

[Android Dev Tips] การ Filter แอพบน Google Play Store : ทำไมบางเครื่องถึงลงแอพบางตัวไม่ได้นะ?



        เป็นอีกหนึ่งเรื่องที่เจอกันได้บ่อยๆ ในเวลาที่นักพัฒนาเอาแอพขึ้น Play Store แล้วลองใช้เครื่องตัวเองลงแอพดู แล้วพบว่ามีปัญหาเครื่องที่ใช้นั้นไม่รองรับกับแอพซะงั้น (Incompatible) ทั้งๆที่ตอนนั่งเขียนโค๊ดก็ยังลงได้อยู่เลย

        ซึ่งบทความนี้เจ้าของบล็อกจึงจะมาเล่าถึงปัญหานี้เล่นๆว่ามันเป็นเพราะอะไร แล้วจะแก้ปัญหานี้ได้อย่างไรกันนะ

รู้จักกับการ Filter บน Google Play Store กันก่อน

        โดยปกติบน Play Store นั้นจะมีการเลือกแสดงเฉพาะแอพที่เครื่องนั้นๆรองรับครับ เพราะแอพไหนที่ไม่รองรับแล้วเค้าจะเอามาแสดงให้รกหน้าจอทำไมล่ะเนอะ (แต่ถ้าเปิดดูบนคอมก็จะเห็นได้ทั้งหมด) ซึ่งการ Filter แอพที่จะแสดงผลบน Play Store ที่นักพัฒนาควรจะรู้ไว้นั้นจะมีอยู่ 4-5 ปัจจัยด้วยกันครับ

สถานะบน Google Play Store (Publishing Status)

        บน Play Store มันสามารถเลือกได้ว่าจะ Published หรือ Unpublished ใช่มั้ยล่ะครับ ซึ่ง Published ก็คือแอพนั้นให้ผู้ใช้สามารถเข้ามาดาวน์โหลดและติดตั้งได้ตามปกติน่ะแหละ แต่ในบางครั้งก็อาจจะมีปัญหาบางอย่างเกิดขึ้นจนต้องหยุดชั่วคราวซะก่อน นั่นก็คือ Unpublished ครับ

        แต่ทีนี้ Unpublished ไม่ได้หมายความว่าเข้ามาดาวน์โหลดแอพไม่ได้นะ แต่ว่าผู้ใช้ที่เคยลงแอพตัวนี้มาก่อนจะยังคงสามารถเข้ามาดาวน์โหลดได้อยู่ครับ ซึ่งค้นหาด้วยชื่อแอพจะไม่เจอนะ ต้องเข้ามา URL เดิมที่เคยเข้า ส่วนผู้ใช้ที่ยังไม่เคยดาวน์โหลดก็จะไม่สามารถติดตั้งได้ครับ ถึงแม้ว่าจะเข้าผ่าน URL ของแอพโดยตรงก็ตาม

        นั่นก็หมายความว่านักพัฒนาจะไม่สามารถเอาแอพออกจาก Play Store ได้อย่างถาวร ทำได้ก็แค่ซ่อนไว้ไม่ให้ผู้ใช้ใหม่ๆเข้ามาดาวน์โหลดเท่านั้น

        เว้นแต่ว่าแอพจะโดนแบน...อันนั้นได้ออกจาก Store ชัวร์ๆจ้า

ประเทศ

        อันนี้น่าจะรู้กันอยู่แล้วเนอะว่านักพัฒนาสามารถกำหนดได้ว่าจะให้ดาวน์โหลดได้เฉพาะประเทศไหนบ้าง ซึ่งเจอได้บ่อยมากกับแอพเกมจากญี่ปุ่นที่มักจะเปิดให้ดาวน์โหลดได้เฉพาะที่ญี่ปุ่นเท่านั้น

        และอีกอย่างหนึ่งที่อยากจะแชร์ก็คือ Play Store ดูเหมือนจะอ้างอิงตาม Google Account ของผู้ใช้ครับ อย่างกรณีของเจ้าของบล็อกมีเหตุสุดวิสัยเล็กน้อยจึงทำให้ Google Account ของเจ้าของบล็อกกลายเป็น US แบบเปลี่ยนกลับไม่ได้ ทำให้เจ้าของบล็อกดาวน์โหลดแอพที่กำหนดเฉพาะประเทศไทยไม่ได้ครับ ถึงแม้ว่าจะอยู่ที่ประเทศไทย ใช้ WiFi หรือเนตมือถือของไทยก็ตาม

        เพราะงั้นถ้าเป็นไปได้ก็พยายามทำให้แอพมัน Global หน่อยนะครับ ขอร้องล่ะ (หลายๆแอพโหลดไม่ได้มาพักใหญ่ๆแล้ว) คิดซะว่าเพื่อคนจากต่างประเทศมาที่ประเทศไทยแล้วโหลดแอพเพื่อใช้ในไทยไม่ได้ละกันนะครับ

CPU Architecture (สำหรับ NDK)

        บางแอพนั้นอาจจะมีการใช้ NDK ในการพัฒนา ซึ่งมันก็จะมี Native Library ที่เฉพาะเจาะจงสำหรับ CPU Architecture แต่ละประเภทครับ ไม่ว่าจะเป็น ARM, MIPS หรือ x86 ถ้าบางแอพไม่ได้ทำมาครอบคลุม ก็อาจจะทำให้เครื่องบางเครื่องที่ใช้ CPU ต่างออกไปไม่สามารถติดตั้งแอพตัวนั้นได้ครับ

App Manifest Element

        นักพัฒนาสามารถกำหนดได้ว่าอุปกรณ์แบบไหนที่จะสามารถดาวน์โหลดได้ โดยกำหนดลงไปใน Android Manefest แล้วเดี๋ยว Play Store จะไปดึงข้อมูลตรงนั้นมา Filter เครื่องที่รองรับให้เอง ไม่ว่าจะเป็นขนาดเครื่อง, Hardware ที่มีในเครื่อง หรือเวอร์ชันแอนดรอยด์ที่รองรับ

Manually Excluded 

        ถึงแม้ว่าจะมีบางเครื่องที่รองรับเงื่อนไขข้างบนทั้งหมดนี้ แต่นักพัฒนาก็สามารถเลือกได้นะเออว่าจะมีเครื่องไหนที่ไม่รองรับ เพราะบางแอพก็อาจจะรองรับกับอุปกรณ์แอนดรอยด์บางรุ่นเท่านั้น ดังนั้นบน Play Store จึงมีหน้าต่างให้เลือกได้ว่าไม่อยากให้เครื่องไหนรองรับ (รายชื่อเครื่องจะถูก Filter จากเงื่อนไขอื่นๆเรียบร้อยแล้ว)


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

        สำหรับผู้ที่หลงเข้ามาอ่านคนไหนยังไม่รู้ว่ากำหนดตรงไหน ให้เข้าไปหน้าอัปโหลด APK นะครับ แล้วกดตรง See list ที่อยู่ใน Supported devices ได้เลยจ้า


Manifest Element ที่มีผลกับการ Filter บน Google Play Store 

<supports-screens>

        สำหรับกำหนดค่าเกี่ยวกับหน้าจอของอุปกรณ์แอนดรอยด์ที่ต้องการรองรับ ไม่ว่าจะเป็น Size หรือ Density ก็ตาม หรือจะกำหนดเป็นหน่วย DP ก็ได้ สามารถดู Attribute แต่ละตัวได้ที่  <supports-screens> [Android Developers]


        ในกรณีที่รองรับกับหน้าจอทุกขนาด ก็ไม่ต้องกำหนดอะไรเลย

<uses-configuration>

        สำหรับกำหนดเกี่ยวกับพวกคีย์บอร์ดหรือ Navigation Key ของตัวเครื่อง ซึ่งไม่ค่อยได้ใช้แล้วล่ะ สามารถดู Attribute แต่ละตัวได้ที่ <uses-configuration> [Android Developers]


        ที่อาจจะได้ใช้ก็คงจะมี Hardware Keyboard กับ Touchscreen Required สำหรับบางแอพ

<uses-feature>

        สำหรับกำหนดเกี่ยวกับ Feature ต่างๆที่เครื่องรองรับ เป็น Element ที่ใช้บ่อยที่สุด และเป็นต้นเหตุที่ทำให้เจอปัญหาเครื่องบางเครื่องติดตั้งบางแอพจาก Play Store ไม่ได้ สามารถดู Attribute แต่ละตัวได้ที่ <uses-feature> [Android Developers]


        เดี๋ยวเขียนรายละเอียดเกี่ยวกับ Element นี้ให้ในช่วงท้ายๆบทความนะครับ

<uses-library>

        สำหรับกำหนด Shared Library ที่ต้องการในแอพตัวนั้นๆ ถ้านึกไม่ออกก็ลองนึกถึง Play Services Library น่ะแหละครับ ที่เค้าทำมาให้แอพไหนๆก็ได้สามารถใช้ฟีเจอร์บางอย่างของ Play Services ได้ โดยบังคับว่าเครื่องนั้นๆจะต้องลง Play Services ไว้ในเครื่องด้วย นั่นล่ะครับ Shared Library สามารถดู Attribute แต่ละตัวได้ที่ <uses-library> [Android Developers]

        แต่ปกติจะไม่ค่อยได้ใช้ Element ตัวนี้เลย เพราะว่า Shared Library มีให้ใช้งานน้อยมาก หลักๆก็จะมีแค่ Play Services เป็นหลัก และถ้าเครื่องที่ไม่ได้ติดตั้ง Play Services ไว้ในเครื่อง ตัว Library ก็จะแจ้งให้ผู้ใช้ไปดาวน์โหลดมาลงก่อนอยู่แล้ว

<uses-permission>

        สำหรับกำหนด Permission ในแอพตัวนั้นๆ อันนี้น่าจะรู้จักกันอยู่แล้ว เพราะว่าบางอย่างในเครื่อง ถ้าจะเรียกใช้งานก็ต้องประกาศขอ Permission ไว้ใน Android Manefest อยู่แล้ว สามารถดูรายละเอียดของ Attibute แต่ละตัวได้ที่ <uses-permission> [Android Developers]


<uses-permission-sdk-23>

        จะเหมือนกับ <uses-permission> แต่สมมติว่าแอพตัวไหนต้องการ Permission บางตัวสำหรับ API 23 ขึ้นไปเท่านั้น (ไม่ต้องการสำหรับ API 22 หรือต่ำกว่านั้น) ก็ให้ประกาศผ่าน Element ตัวนี้แทน ส่วนรูปแบบของ Attribute ก็เหมือนกับ <uses-permission> เป๊ะๆ <uses-permission-sdk-23> [Android Developers]

<uses-sdk>

        เป็น Element อีกตัวที่ไม่มีนักพักฒนาคนไหนไม่รู้จักเนอะ เพราะมันมีไว้กำหนดเวอร์ชันที่รองรับสำหรับแอพนั้นๆ ซึ่งภายหลังถูกกำหนดผ่าน build.gradle ไปแล้ว แล้วเดี๋ยว Gradle ก็จะเอามากำหนดเป็น Element ตัวนี้ใน Android Manifest ให้เองนั่นแหละ


        สำหรับ Attribute ของแต่ละตัวสามารถดูได้ที่ <uses-sdk> [Android Developers]


        นอกจากนี้ยังมี Element อีก 2 ตัวคือ <compatible-screens> กับ <supports-gl-texture> ที่ไม่ค่อยได้ใช้งาน และเป็นการใช้งานเฉพาะทางมากเกินไป อย่างเช่น <compatible-screen> ทางทีมแอนดรอยด์ก็แนะนำมาว่าอย่าใช้ เพราะมันจะเป็นทำให้อุปกรณ์ที่รองรับมีเหลือน้อย (ซึ่งในความเป็นจริงนักพัฒนาควรทำแอพที่รองรับกับเครื่องได้หลากหลายขนาด) <supports-gl-texture> มีไว้กำหนด Compression Format ใน OpenGL เพื่อให้ใช้งานได้เฉพาะเครื่องที่รองรับเท่านั้น ซึ่งไม่ค่อยได้ใช้ซักเท่าไร

อุปกรณ์แอนดรอยด์บางรุ่นดันไม่รองรับ จะทำยังไงให้ติดตั้งจาก Google Play Store ได้?

        ถือว่าเป็น Key ของบทความนี้เลยก็ว่าได้ เพราะเจ้าของบล็อกเชื่อว่ามีนักพัฒนาหลายๆคนได้ส่งแอพขึ้น Play Store ไป แล้วแบบว่า "เฮ้ย ทำไมเครื่องเรามันติดตั้งแอพไม่ได้วะ"


        ซึ่งเจ้าของบล็อกว่าการเป็นนักพัฒนาแอนดรอยด์แล้วเจอปัญหานี้ซักครั้งมันก็ดีนะ เพราะถ้ายังไม่เคยเจอก็จะไม่รู้ว่าอาจจะมีอีกหลายๆเครื่องที่ติดตั้งแอพตัวนี้ไม่ได้ จะได้หันมาตระหนักเรื่องนี้ทุกครั้งเวลาที่ส่งแอพขึ้น Play Store

        แต่ถ้าพึ่งเจอเป็นครั้งแรกล่ะ?​ จะทำยังไงดี?

        ก่อนอื่นให้ตรวจสอบเงื่อนไขพื้นฐานของ Filter ก่อนครับ ว่ารองรับจริงๆนะ? แล้วก็ไปเช็คว่าไม่ได้ไป Manually Excluded ไว้ โดยเช็คได้จากรายชื่ออุปกรณ์ที่ Excluded ไว้ในหน้า Developer Console


        ถ้ามีก็เอาออกซะ แต่ควรจะรู้ก่อนนะว่าทำไมมันถึงไป Excluded ได้ เพราะ Default มันจะเป็น Included หรือ Supported โดยอัตโนมัติ อาจจะเพราะคนในทีมไป Excluded ไว้เพราะมันมีปัญหาจริงๆหรือป่าว อันนี้เช็คให้ดีๆด้วยนะ

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


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

        ก็เช็คจากหน้าเดิมนั้นแหละ ให้ลองกดดูรายละเอียดของ APK ที่ Publish เป็นตัวล่าสุด


        ที่หน้า APK Details นอกจากจะบอกรายละเอียดเกี่ยวกับ APK คร่าวๆแล้ว ยังสามารถรู้ได้อีกว่าเพราะอะไรบางเครื่องถึงไม่รองรับด้วยนะ

        ให้ตรวจสอบตามลำดับดังนี้

        • API Levels ว่าเวอร์ชันขั้นต่ำเป็นเท่าไร สูงกว่าเวอร์ชันของเครื่องที่ทดสอบหรือไม่
        • Screen Layouts ถ้าไม่ได้กำหนดค่า Screen Support ใน Android Manifest ตรงนี้ก็จะรองรับทั้ง 4 ขนาดอยู่แล้วนะ
        • Features ไปอ่านต่อข้างล่างแทนนะ เพราะนี่เป็นสาเหตุที่ส่วนใหญ่จะเจอกัน
        • Required Permissions ถ้าเป็น Permission พื้นฐานของ Android อยู่แล้วก็ไม่มีปัญหาอะไร
        • OpenGL ES Version สำหรับแอพที่มีการเรียกใช้งาน OpenGL ES ต้องดูด้วยว่ากำลังใช้เวอร์ชันอะไรอยู่ และเครื่องที่ทดสอบรองรับหรือไม่ (บางทีกำหนดเป็นเวอร์ชันสูงเกินไป แต่โค๊ดเป็นของเวอร์ชันที่ต่ำกว่าก็มี)
        • OpenGL Textures อันนี้น่าจะเฉพาะทางเกินไปละ ถ้าไม่ได้ใช้ OpenGL ระดับลึกมากๆก็ไม่ต้องสนใจ


เครื่องส่วนใหญ่ที่ไม่รองรับ เพราะว่า Festures นั่นเอง

        ทั้งนี้เพราะว่าข้อมูลส่วนนี้จะไม่แสดงให้นักพัฒนาเห็นในตอนเขียนโค๊ดเลย ไม่มีแสดงใน Android Manifest ว่าแอพตัวนั้นจะต้องใช้ Uses Feature อะไรบ้าง และส่วนใหญ่ก็จะไม่รู้ว่าเครื่องที่ใช้นั้นรองรับ Feature ไหนด้วยเช่นกัน

        ถ้าดูภาพตัวอย่างก่อนหน้าจะเห็นว่าแอพตัวอย่างต้องการอยู่ 2 Feature คือ android.hardware.CAMERA และ android.hardware.TOUCHSCREEN

        ซึ่งสิ่งที่นักพัฒนาควรจะรู้ก็คือ

        • ควรรู้ว่าแอพของผู้ที่หลงเข้ามาอ่าน Required Feature ตัวไหน
        • ควรรู้ว่าเครื่องที่มีปัญหา Incompatible นั้น Supported Feature ตัวไหน

        สำหรับ Required Feature  ของแอพสามารถดูได้ในช่อง Features นั่นแหละ ซึ่งจะสัมพันธ์กับ Permission ที่เรียกใช้งานนะ โดยสัมพันธ์กันแบบนี้

Permission : android.permission.BLUETOOTH

        Required Feature
        • android.hardware.bluetooth

Permission : android.permission.BLUETOOTH_ADMIN

        Required Feature
        • android.hardware.bluetooth

Permission : android.permission.CAMERA

        Required Feature
        • android.hardware.camera         • android.hardware.camera.autofocus

Permission : android.permission.ACCESS_MOCK_LOCATION

        Required Feature
        • android.hardware.location

Permission : android.permission.ACCESS_LOCATION_EXTRA_COMMANDS

        Required Feature
        • android.hardware.location

Permission : android.permission.INSTALL_LOCATION_PROVIDER

        Required Feature
        • android.hardware.location

Permission : android.permission.ACCESS_COARSE_LOCATION

        Required Feature
        • android.hardware.location
        • android.hardware.location.network

Permission : android.permission.ACCESS_FINE_LOCATION

        Required Feature
        • android.hardware.location
        • android.hardware.location.gps

Permission : android.permission. RECORD_AUDIO

        Required Feature
        • android.hardware. microphone

Permission : android.permission.CALL_PHONE

        Required Feature
        • android.hardware.telephony

Permission : android.permission.CALL_PRIVILEGED

        Required Feature
        • android.hardware.telephony

Permission : android.permission.MODIFY_PHONE_STATE

        Required Feature
        • android.hardware.telephony

Permission : android.permission.PROCESS_OUTGOING_CALLS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.READ_SMS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.RECEIVE_SMS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.RECEIVE_MMS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.RECEIVE_WAP_PUSH

        Required Feature
        • android.hardware.telephony

Permission : android.permission.SEND_SMS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.WRITE_APN_SETTINGS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.WRITE_SMS

        Required Feature
        • android.hardware.telephony

Permission : android.permission.ACCESS_WIFI_STATE

        Required Feature
        • android.hardware.wifi

Permission : android.permission.CHANGE_WIFI_STATE

        Required Feature
        • android.hardware.wifi

Permission : android.permission.CHANGE_WIFI_MULTICAST_STATE

        Required Feature
        • android.hardware.wifi


        ดังนั้นประกาศ Permission ตัวไหนไว้ก็ให้ดูด้วยนะว่า Required Feature อะไร

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


        จากนั้นก็ให้เช็คว่าเครื่องที่ทดสอบนั้นรองรับ Feature ดังกล่าวหรือป่าว ก็ให้ใช้แอพเช็คเอาครับ อย่างกรณีของเจ้าของบล็อกจะมีแอพ Developer Device Information ที่เอาไว้ดูข้อมูลตรงนี้อยู่แล้ว


        เท่านี้ก็จะรู้แล้วว่าเพราะอะไรเครื่องที่ใช้ทดสอบถึงติดตั้งแอพจาก Play Store ไม่ได้

        เพิ่มเติม - สำหรับ Camera Permission จะ Require ทั้ง android.hardware.camera และ andmroid.hardware.camera.autofocus ซึ่งที่เจ้าของบล็อกเจอก็คืออุปกรณ์แอนดรอยด์บางรุ่น (โดยเฉพาะแบรนด์จีน) มักจะกำหนดข้อมูลใน ROM มาผิดเองว่าเครื่องนั้นๆไม่มี android.hardware.camera.autofocus ทั้งๆที่ตัวเครื่องก็รองรับ Autofocus อยู่แล้ว (เพราะข้อมูลในส่วนของ Feature ผู้พัฒนา ROM จะต้องมานั่งกำหนดเอง) Play Store ก็เลย Filter อุปกรณ์แอนดรอยด์เครื่องดังกล่าวออกไปให้ไม่สามารถติดตั้งแอพได้

ถ้าอยากให้มันติดตั้งได้ โดยไม่สน Required Feature ล่ะ?

        ซึ่งนักพัฒนาสามารถกำหนดได้ครับว่าจะให้แอพนั้น Require Feature ตัวนั้นๆจริงๆหรือไม่ เพราะในบางครั้ง Feature ตัวนั้นๆก็ไม่ใช่การทำงานหลักของแอพ เป็นแค่เพียงส่วนหนึ่งเท่านั้น ยกตัวอย่างเช่น แอพที่มีฟีเจอร์สามารถใช้งานกล้องได้ โดยที่ไม่จำเป็นว่าจะต้องใช้งานกล้องทุกครั้งไป ดังนั้นก็สามารถกำหนดใน Android Manifest ได้ว่าไม่ต้อง Require Feature ของ android.hardware.camera กับ android.hardware.camera.autofocus นะ

<uses-feature 
    android:name="android.hardware.camera" 
    android:required="false" />

<uses-feature 
    android:name="android.hardware.camera.autofocus" 
    android:required="false" />


        พอส่งขึ้น Play Store ก็จะยกเว้น Feature ตามที่ผู้ที่หลงเข้ามาอ่านกำหนดไว้  และถ้าอยากให้แอพติดตั้งได้เฉพาะเครื่องที่มี Feature ที่ต้องการก็เพียงแค่กำหนดเป็น True เท่านั้นเอง

        แต่ต้องอย่าลืมนะว่าเมื่อกำหนด android:required เป็น False ไปแล้ว นั่นหมายความว่าเครื่องที่ไม่รองรับ Feature ดังกล่าวจะติดตั้งได้ ดังนั้นโค๊ดของผู้ที่หลงเข้ามาอ่านก็จะต้องรองรับในกรณีที่ไม่สามารถใช้งานฟีเจอร์นั้นๆได้ด้วย

        สำหรับ Feature ที่มีให้ใช้กำหนดได้ ก็สามารถไปดูได้ที่ <uses-feature> [Android Developers]

สรุป

        การ Filter ของแอพต่างๆบน Play Store ถือว่าเป็นสิ่งที่นักพัฒนาควรจะรู้จักไว้ครับ เพราะมันจะช่วยให้แอพของผู้ที่หลงเข้ามาอ่านนั้นสามารถกำหนดได้ว่าอุปกรณ์แอนดรอยด์แบบไหนที่จะรองรับหรือไม่รองรับ โดยเฉพาะเรื่องของ <uses-feature> ที่ใช้กำหนดผ่าน Android Manifest ถือว่าเป็นเรื่องที่ควรรู้ไว้อย่างยิ่ง เพื่อที่ว่าจะได้ไม่พลาดกับอีกหลายๆเครื่องที่ไม่สามารถติดตั้งแอพของผู้ที่หลงเข้ามาอ่านได้




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium