24 October 2019

[Android Dev Tips] วันนี้คุณย้ายจาก Support Library ไปเป็น AndroidX แล้วหรือยัง?



        ในทุกวันนี้ในการพัฒนาแอปแอนดรอยด์นั้น ไม่ว่าจะเป็นที่ไหนก็คงขาด AndroidX ไปไม่ได้ เพราะว่าเป็น Backward Compat Library ที่จะช่วยให้นักพัฒนาสามารถเขียนโค้ดได้สะดวกขึ้น ง่ายขึ้น โดยไม่ต้องกังวลว่าโค้ดดังกล่าวจะทำงานได้ปกติสุขบนแอนดรอยด์เวอร์ชันเก่าๆหรือไม่ เพราะว่าทีม Android ของ Google จะคอยจัดการเรื่องนี้ให้แทนนั่นเอง

ทำไมต้องย้ายไปใช้ AndroidX?

        ถึงแม้ว่าการย้ายจาก Support Library เป็น AndroidX จะต้องใช้ Effort ค่อนข้างเยอะก็ตาม แต่เหตุผลที่ทำให้นักพัฒนาต้องยอมใช้ Effort ดังกล่าวกับการ AndroidX Migration ก็เพราะว่า

Support Library หยุดพัฒนาต่อแล้ว

        เวอร์ชันสุดท้ายของ Support Library จะอยู่ที่ 28.0.X เท่านั้น (เทียบเท่ากับ AndroidX เวอร์ชัน 1.0.0) และจะไม่มีการพัฒนาต่อหรือแก้ไขปัญหาต่างๆอีกต่อไป

AndroidX มีการปรับ Package Name ใหม่

        Support Library มีปัญหาในเรื่องของ Package Name ที่ชวนสับสน และทับซ้อนกันค่อนข้างเยอะ จึงทำให้ AndroidX มีการกำหนดชื่อ Package Name ใหม่ทั้งหมดเพื่อให้ทีม Android สามารถจัดการได้ง่ายขึ้น เป็นอิสระต่อจากกัน ซึ่งจะช่วยให้สามารถอัปเดตเวอร์ชันใหม่ได้ไวขึ้น ไม่ต้องรอกันและกันให้เสียเวลา

3rd Party Library ทยอยย้ายไปใช้ AndroidX กันแล้ว

        Library ยอดนิยมได้เปลี่ยนไปใช้ AndroidX แทน Support Library กันแล้ว นั่นหมายความว่าเมื่อ Library เหล่านี้มีการอัพเดทความสามารถใหม่ๆก็จะต้องใช้กับ AndroidX เท่านั้น

Library ใหม่ที่เพิ่มเข้ามาเฉพาะบน AndroidX

        ยกตัวอย่างเช่น Jetpack Compose หรือว่า CameraX ที่ถูกเพิ่มเข้ามาใหม่ใน AndroidX ถ้าอยากจะใช้ Library ดีๆแบบนี้ก็ต้องย้ายมาใช้ AndroidX โดยปริยาย


        นั่นหมายความว่าในอนาคตถ้ายังใช้ Support Library อยู่ก็อาจจะเจอปัญหาตามมาที่ทำให้ผู้ที่หลงเข้ามาอ่านต้องมานั่ง Migrate ให้เป็น AndroidX อยู่ดี หรือก็คือเลี่ยงไม่ได้นั่นเอง

        แต่จะดีกว่ามั้ยถ้าทำตั้งแต่เนิ่นๆก่อนที่จะสายเกินไป

เตรียมตัวให้พร้อมก่อนจะย้ายไปใช้ AndroidX

        การย้ายจาก Support Library เป็น AndroidX อาจจะไม่ใช่เรื่องใหญ่เท่ากับการแก้ไขโค้ดให้รองรับกับแอนดรอยด์เวอร์ชันใหม่ๆ แต่จะกระทบกับไฟล์เป็นจำนวนมาก ดังนั้นทางที่ดีจึงควรเตรียมตัวให้พร้อมก่อนจะเริ่มดีกว่า

Backup Project ให้เรียบร้อย

        อย่างที่บอกไปว่าการย้ายไปเป็น AndroidX นั้นจะกระทบกับไฟล์ในโปรเจคเป็นจำนวนมาก ดังนั้นการ Backup ไว้ก่อนจะปลอดภัยกว่า ถึงแม้ว่าจะเป็นการเปลี่ยนแค่ Package Name แต่ก็อะไรก็เกิดขึ้นได้เมื่อมี File Changes ที่เยอะมากๆ

        ถ้าใช้ Version Control อยู่แล้วก็หายห่วง เพราะมันเกิดมาเพื่อการนี้อยู่แล้ว

ลดการพัฒนาฟีเจอร์ใหม่ๆในช่วงที่ทำ AndroidX Migration ให้น้อยที่สุด

        ลองนึกภาพว่าระหว่างกำลังย้ายไปใช้ AndroidX นั้น แต่คนในทีมดันเพิ่มฟีเจอร์ใหม่เข้ามาในโค้ดที่ยังเป็น Support Library อยู่ ก็อาจจะทำให้เกิด Conflict ได้ทันทีจนทำให้ Release อะไรไม่ได้เลย ดังนั้นทางที่ดีก็ควรคุยกับคนในทีมด้วยกันก่อน เพื่อลดฟีเจอร์ที่จะ Deliver ให้น้อยลง แล้วเร่งย้ายไปเป็น AndroidX ให้ไว

แยก Branch ใน Version Control สำหรับ AndroidX Migration

        คงไม่ต้องอธิบายอะไรมากนัก ลองนึกภาพดูว่าจะเกิดอะไรขึ้นถ้า Migrate บน Master Branch หรือ Develop Branch ในขณะที่คนอื่ืนๆก็ทำงานในส่วนอื่ืนๆอยู่ด้วย

ขั้นตอนการย้ายไป AndroidX ให้ปลอดภัย

        คงไม่สนุกซักเท่าไรถ้าผู้ที่หลงเข้ามาอ่านได้ใช้เวลาหลายวันในการย้ายโปรเจคไปใช้ AndroidX จนเสร็จ แล้วพบว่าโปรเจคมีปัญหาจากขั้นตอนอื่นๆจนทำให้ต้อง Rollback กลับไปเป็น Support Library อย่างเลี่ยงไม่ได้ ดังนั้นขั้นตอนดังต่อไปนี้จะช่วยให้ผู้ที่หลงเข้ามาอ่านสบายใจได้ประมาณนึงว่าจะไม่เกิดความชิบหายแบบนั้นขึ้น


1. อัพเดท Support Library ให้เป็นเวอร์ชัน 28

         เพราะ Support Library เวอร์ชัน 28.0.X จะเทียบเท่ากับ AndroidX เวอร์ชัน 1.0.0 ซึ่งจะช่วยให้การย้ายไปเป็น AndroidX ทำได้ง่ายกว่า และในระหว่างที่อัพเดท Support Library เป็นเวอร์ชัน 28 ก็อาจจะต้องมีการปรับโค้ดบางส่วนด้วย จะได้ไม่มีปัญหาในภายหลังแล้วเข้าใจผิดว่าเป็นที่ AndroidX

2. เปิดใช้งาน Jetifier

        Jetifier เป็น Plugin ที่จะช่วย Migrate โค้ดที่อยู่ใน 3rd Party Library ที่โปรเจคนั้นๆใช้งานอยู่ให้เป็น AndroidX เท่านั้น ไม่รวมไปถึงโค้ดของนักพัฒนาหรือโค้ดที่สร้างตอน Compile นะ อันนั้นต้องทำเอง

        สามารถดูรายละเอียดเพิ่มเติมและวิธีการเปิดใช้งาน Jetifier ได้ที่ Jetifier เบื้องหลังการทำงานของ Android Gradle Plugin สุดเทพสำหรับ AndroidX

3. อัพเดท 3rd Party Library ที่ใช้ในโปรเจคให้เป็นเวอร์ชันล่าสุด

         เพราะ Library หลายๆตัวอาจจะมีการอัพเดทให้รองรับ AndroidX แล้ว ดังนั้นเช็คให้มั่นใจว่าทำการอัพเดท Library เหล่านั้นเป็นเวอร์ชันล่าสุด (หรือเวอร์ชันที่รองรับ AndroidX แล้ว) ส่วนตัวไหนที่ยังใช้ Support Library อยู่ก็จะถูก Jetifier จัดการให้ตอน Compile นั่นเอง

4. ย้ายโค้ดไปใช้ AndroidX ด้วย Android Studio

        Android Studio เวอร์ชัน 3.2 ขึ้นไปจะมีเมนูสำหรับ Migrate โค้ดในโปรเจคนั้นๆเป็น AndroidX อยู่แล้ว โดยจะอยู่ใน Refactor > Migrate to AndroidX... และอย่าลืมเปลี่ยน Package Name ที่อยู่ใน Proguard Rule ด้วยนะ (ถ้ามี)

5. ใช้ Bash Script เพื่อจัดการโค้ดที่ยังเหลืออยู่

         Bash Script ดังกล่าวจะช่วยจัดการเปลี่ยน Package Name ของ Support Library ที่ยังเหลืออยู่ในโปรเจคให้เป็น AndroidX โดย Script ที่ว่านี้สามารถเข้าไปดูได้ที่ Simple AndroidX Migration Script [Gist GitHub]

เรียบร้อย!

        เพียงเท่านี้โปรเจคของผู้ที่หลงเข้ามาอ่านก็ (น่าจะ) เปลี่ยนมาเป็น AndroidX หมดเรียบร้อยแล้ว สามารถทำอย่างอื่นต่อได้เลย

        ทั้งนี้ทั้งนั้นอาจจะฟังดูสวยหรู แต่ทางที่ดีควรตรวจสอบให้ถี่ถ้วนอีกครั้งเพื่อความมั่นใจ โดยเฉพาะโปรเจคที่มีขนาดใหญ่และโครงสร้างซับซ้อนที่มีโอกาสจะเกิดปัญหาได้

แหล่งข้อมูลอ้างอิง

        • Migration to AndroidX: The Time is Right @ Android Dev Summit 2019
        • Support Library Artifact Mapping @ Android Developers