Jetifier เบื้องหลังการทำงานของ Android Gradle Plugin สุดเทพสำหรับ AndroidX

ณ เวลานี้ผู้ที่หลงเข้ามาอ่านหลายๆคนก็คงรู้จักกับ AndroidX จากงาน Google I/O 2018 กันแล้วเนอะ ซึ่งเป็นการ Refactor เหล่า Package Name ของ Android Support Library ทั้งหมดให้มีชื่อที่ดู Make Sense มากขึ้น

แต่หารู้กันหรือไม่ว่านอกจาก AndroidX แล้ว ยังมี Gradle Plugin อีกตัวหนึ่งที่ชื่อว่า Jetifier ที่ช่วยทำให้การย้ายไปใช้ AndroidX ของเราย้ายได้สมบูรณ์มากขึ้นอย่างกับใช้เวทมนต์อยู่นะ

สำหรับการย้ายจาก Android Support ไปเป็น AndroidX นั้นมีเครื่องมือน่ารักๆอย่าง Refactor > Migrate to AndroidX ... ให้ใช้ใน Android Studio 3.2 อยู่แล้ว

แต่ 3rd Party Library ที่ยังใช้ Android Support อยู่ล่ะ?

จะเกิดอะไรขึ้นล่ะ ถ้า Library หลายๆตัวยังคงใช้ Android Support อยู่ บางตัวที่คนนิยมใช้กันก็อาจจะไม่ได้มีการอัพเดทในทันที กลายเป็นว่านักพัฒนาเหล่านั้นก็ต้องรอคอยจนกว่าเจ้าของ Library จะมาอัพเดทให้อย่างงั้นหรอกหรือ?

และนั่นคือกำแพงขนาดใหญ่ที่ขวางกั้นอยู่นั่นเอง เพราะ Android Support ถือว่าเป็น Standard Library ที่ Android Developer ต้องใช้กันก็ว่าได้ ดังนั้นการที่โปรเจคตัวหนึ่งที่ On Production แล้วจะย้ายมาใช้ AndroidX ก็ไม่ใช่เรื่องง่ายเลยนี่นา

ยกตัวอย่างเช่น Library ที่ทำงานร่วมกับ Fragment แต่ว่ายังคงใช้ android.support.v4.app.Fragment อยู่ แต่ AndroidX นั้นเปลี่ยนไปใช้เป็น androidx.fragment.app.Fragment แทนนั่นหมายความว่า Fragment ใน AndroidX จะเอาไปใช้ใน Library ที่ยังคงใช้ Android Support ไม่ได้เลย เพราะถึงแม้ว่าโค้ดข้างในจะทำงานเหมือนกัน แต่มันคนละ Package Name มันก็คือคนละตัวกันนั่นแหละ

เพื่อแก้ปัญหานี้จึงทำให้ทีม Google ต้องพัฒนาสิ่งที่เรียกว่า Jetifier ขึ้นมาแทน

หมดปัญหาเรื่อง AndroidX Migration ด้วย Jetifier

Jetifier เป็น Gradle Plugin ที่ถูกยัดเข้ามาใน com.android.tools.build:gradle:3.2.0-beta01 ขึ้นไปเท่านั้น ดังนั้นเวอร์ชันที่ต่ำกว่านี้ก็จะไม่มี Jetifier ให้ใช้งานกันนะ

ความเจ๋งของ Jetifier ก็คือตอน Compile Time เจ้า Plugin ตัวนี้ก็จะไล่เปลี่ยน Package ของทุกตัวที่ใช้ Android Support ให้กลายเป็น AndroidX ทันที!!

นั่นหมายความว่าผู้ที่หลงเข้ามาอ่านสามารถหน้าด้านหน้าทนใช้ Android Support กับ AndroidX ผสมกันได้เลย เดี๋ยวตอน Compile Time มันก็จะแปลงให้ทันที ไม่ว่าจะเป็นโค้ดที่อยู่ใน .jar หรือ .aar ก็ตาม แล้วโค้ดก็จะทำงานร่วมกันได้อย่างราบรื่นเหมือนกับว่าคลาสเหล่านั้นรู้จักกันมาตั้งแต่ชาติปางก่อนแล้ว

ถึงแม้ว่าตอนที่เขียนโค้ดอยู่จะต้องทนเห็น Lint แจ้ง Error ตลอดเวลาก็เถอะ เพราะว่า Gradle Plugin นั้นมีผลกับตอน Compile Time เท่านั้น แต่ไปแก้ไขการทำงานของ Lint ไม่ได้อยู่ดี อาจจะมีการสร้าง Plugin ใน Android Studio เพื่อให้ Lint ข้าม Error ตัวนี้ไปก็ได้นะ

ทำไม Jetifier ไม่ทำงาน

ต้องมั่นใจนะว่าใช้ Gradle Plugin 3.2.0-beta01 ขึ้นไปและ และต้องเปิดใช้งาน Jetifier ใน gradle.properties ด้วยนะ

// gradle.properties
android.enableJetifier=true
android.useAndroidX=true

จากนั้นก็ Sync Gradle ดูใหม่ และน่าจะใช้ได้แล้ว

โคตร Magic

ใช่ครับ เพื่อก้าวข้ามข้อจำกัดจากการเปลี่ยน Package ของโค้ดแทบทั้งหมดใน Android Support มาเป็น AndroidX ก็ต้องขอบคุณความสามารถของ Gradle ที่ทำให้สามารถทำอะไรเจ๋งๆแบบนี้ได้ (ถึงแม้ว่าส่วนใหญ่จะทรมานไปกับการ Build ของ Gradle ก็ตามเถอะ)

กราบคารวะ Jetifier