หลายคนคงทราบเรื่องนี้จากการประกาศผ่านหน้า Play Console ของทาง Google แล้วว่า เราจะไม่สามารถอัปเดต Android APK ที่มีเลข TargetSDK ต่ำกว่า 28 ขึ้นสู่ Console ได้แล้ว แต่ ! ก็คงจะมีบางคนที่เป็นอย่างเรา ที่ยังไม่อยากอัปเดท SDK ขึ้นไปเนื่องด้วยปัจจัยหลายๆอย่าง อาทิ โปรเจคที่ได้รับมอบหมายให้ดูแลเป็นโปรเจคใหญ่ ยุค 2017 คาบเกี่ยว 2018 ยาวมายัน 2019 และจะโกออนไป 2020, ไลบรารี่ตั่งต่าง ถ้าอัปเดทขึ้นไป จะยังซัพพอร์ทหรือไม่ ฯลฯ
จากหลายๆอย่างทำให้มีความดื้อดึง ยืดเยื้อ ไม่ยอมอัปเดต จนมาถึงวันนี้ และแล้ว ปัญหาก็เกิดขึ้นมาจนได้ ผ่าง !

เมื่อปัญหาเกิดขึ้นมาแล้ว เราก็จำเป็นต้องแก้ไขเป็นการด่วน ไม่เช่นนั้นเราคงได้โดนหัวหน้าไล่ออกแน่ๆ ถ้าแค่อัปเดตเวอร์ชั่นแอปยังทำไม่ได้ … ไปค่ะ ไปลองอัปเกรดกันสักตั้งซิ ว่าจะเจอเหตุการณ์อย่างไร
จากตรงนี้ ใครไม่อยากดูยาวๆ ข้ามไปอ่านที่ Recap ได้เลยนะคะ
เริ่มแรก ลองจากการเปลี่ยน compileSdkVersion และ targetSdkVersion เป็น 28 กัน

หากคิดว่า แค่เปลี่ยนเลขแล้วจะจบล่ะก็ … ไม่จริงค่ะ … เอาจริงๆคือก็ build ผ่าน แต่พอลองจิ้มบางฟังก์ชั่นในแอปก็จะพบว่า

เรียบร้อยเลยฮะ แอปก็จะพังโดยประมาณนี้ …
วิธีแก้ไขก็คือ… คือ… คือออออ !
อัปเดต libs เวอร์ชั่นขึ้นไปเลยจ้า อะไรแดงๆ อัปขึ้นไปให้หมด !

นอกจากที่แจ้งเป็นเส้นหยึกหยักแล้ว การอัปเกรดไลบรารี่ต่างๆที่เราใช้ขึ้นไปให้เป็นตัวล่าสุดก็ย่อมดีมากๆเช่นกัน เพราะฉะนั้น ไปลองอัปเดตเลยยย
บู้มมมมมมมม !!!

ในส่วนของ Error ตัวนี้ มีสองวิธีให้เลือก คือ
1. เพิ่มแท็ก tools:replace ใน <application> ซึ่งอยู่ในไฟล์ Manifest ของเรา หรือ
2. Migrate to AndroidX
ให้เวลาคิด 2 วินาที
และใช่ค่ะ เราไม่เลือกทางแรก เราทำการ Migrate to Android X เลย ! (และแอบ Migrate to AppCompat ด้วยเช่นกัน) โดยวิธี Migrate นั้น ทำได้โดย เลือกที่
Refactor -> Migrate to AndroidX… และ Refactor -> Migrate to AppCompat…
หลังจากทำการ Migration เสร็จ ในโปรเจคเราก็พบกับปัญหา เป็น Log หน้าตาแปลกๆ ที่หาข้อมูลใน Google เท่าไหร่ก็ไม่เจอ ซึ่ง Logs error ที่เราพบก็คือ !
e: error: cannot generate view binders java.lang.StackOverflowError
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:209)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
…
งงไปเลยจ้า Logs อะไร ทำไม แก้ยังไง ? มาค่ะ เราแก้ได้แล้ว หากคุณเจอ Logs แบบนี้เช่นกันกับเรา ให้คุณทดลองหาว่า ภายในโปรเจคของคุณมีสิ่งที่เรียกว่า ObservableFields หรือไม่ เพราะสิ่งนี้นั่นแหละค่ะ ที่ทำให้เกิด Logs ตัวนี้ขึ้น
แก้ไขทั้งหมดได้ด้วยการเปลี่ยนจาก ObservableField ไปเป็น LiveData หรือ MutableLiveData ก็ย่อมได้ เปลี่ยนเสร็จ กลั้นใจ นับหนึ่งถึงสามและกด Run ‘app’ ได้เลยค่ะ !

หากยัง Run ไม่ได้ ก็ลองไล่แก้ Error ตามที่ปรากฏใน Logs ไปเรื่อยๆ เพราะเราไม่รู้ว่าจะเจอ Logs แบบเดียวกับเราไหมนะคะ แต่เบื้องต้น จะไม่เจอปัญหาอะไรมาก นอกจากว่าบางไฟล์จะต้องการ Activity แต่เราใส่ AppCompatActivity ไป ก็ทำการแก้ไขด้วยการเปลี่ยนมันกลับดื้อๆจาก AppCompatActivity เป็น Activity ได้เล้ย !
หวังว่าบทความนี้จะมีประโยชน์กับใครก็ตามที่เจออาการคล้ายๆเรานะคะ และสำคัญอยากจะบอกว่า โปรเจคทุกโปรเจคต้องมีการปรับปรุงและเปลี่ยนแปลงไปตามระยะเวลา ข้อสำคัญที่เราเหล่า Developer ควรจะทำก็คือเขียนโค้ดให้รองรับกับการเปลี่ยนแปลง และหมั่นตามเทรน อย่าปล่อยไว้นานจนการแก้มันยากเกินไปกว่าการสร้างใหม่นะคะ ! ขอให้สู้ ทุกคนสู้ !!! ป่ะ ไป Recap กันอีกสักนิด ก็จบบทความแล้วค่ะ
Recap
- อัปเดต compileSdkVersion และ targetSdkVersion เป็น ≤28
- อัปเดต Library ทุกตัวให้เป็นตัวใหม่ล่าสุดที่รองรับ AndroidX
- Migrate Project to AndroidX และ Migrate to AppCompat
- ObservableFields is Deprecated เปลี่ยนให้เป็นตระกูล LiveData ซะ
- แก้ Bugs ที่เกิดจากการ Migrate ให้หมด
- Test ซ้ำ !
- เสร็จสิ้นกระบวนการ ทำการแพค APK และนำขึ้นสู้ Play Console ได้แล้ว เย้!
