Selalu ada hal yang baru saya tahu ketika ngoding Android. Ya sebenarnya banyak yang masih belum saya pahami di bidang ini sih. Tapi bug yang ini memang agak di luar perkiraan. Bug yang hanya terjadi di varian rilis.
Jadi begini ceritanya. Setahun lalu, kami melakukan revamp menyeluruh terhadap sebuah modul, sebut saja modul A. Di modul ini hanya ada 3 activity (yes, kami masih pakai system view hehe) dan sekitar 4 halaman utama. Hanya sedikit, tapi yang punya modul ini bilang bahwa modul A adalah aplikasi kantor versi mini, alias logicnya lumayan kompleks. Hampir semua fungsionalitas utama ada di modul ini, seperti search dan pilih produk.
Karena kompleksitasnya yang lumayan itulah, maka proyek ini dikerjakan oleh 3 orang, supaya bisa beres dalam satu sprint saja. Singkat cerita, proyek yang akhirnya molor sehingga dikerjakan hingga beberapa bulan itu selesai juga.
Meski banyak bug karena kurangnya testing yang proper (puluhanan tiket bug :))), tapi akhirnya dirilis juga tanpa menghasilkan banyak regresi.
Beberapa bulan kemudian, tepatnya di pertengahan 2025, ada tiket untuk penambahan fitur yang agak kompleks karena harus mengimplementasikan notification dan foreground service untuk upload video. Kali ini tiketnya dikerjakan oleh dua orang saja.
Ada beberapa hambatan ketika mengimplementasikan fitur ini, terutama masalah edge case terkait upload file berukuran besar. Untunglah akhirnya bisa selesai tepat waktu. PR pun dibuat di hari kamis dan dimerge ke branch release setelah beberapa kali revisi. Tinggal menunggu build release untuk mengecek implementasinya di versi release.
Hari itu Jumat, hari terakhir sprint dan code freeze. Seharusnya di sore nanti, ada jadwal demo fitur di internal tim. Kamis malam sudah ada build release yang bisa dicoba. Maka besok paginya saya coba tes fitur yang baru dibuat itu.
Tapi ketika buka modul A kok error? Anehnya, errornya ada di halaman pertama, sementara fitur yang dibuat ada di halaman kedua. Dari hasil tanya-tanya ke lead, versi itu dibuild pakai branch A yang pull dari branch release. Ok mungkin PR kami nggak masuk di build tersebut.
Karena sampai siang belum ada update build terbaru, untuk demo modul A digeser ke hari Senin. Benar saja, build terbaru baru muncul di Jumat malam. Karena nggak mau kelabakan di Senin pagi, saya coba install build release terbaru itu di HP langsung.
Pas buka modul A, loh kok masih error? Karena error ini hanya terjadi ketika dites di versi rilis, sudah hampir pasti isunya di seputar proguard dan obfuscate. Tapi di mana letak masalahnya?
Meski sudah malam, terpaksa saya buka lagi laptop di rumah. Saya coba build versi release sendiri dari branch release terupdate. Saya pastikan semua kode perubahan sudah masuk. Setelah menunggu sekitar 1 jam (yes, build varian release memang sangat laaaamaaaaaaa), saya coba lagi dan lagi-lagi masih error.
Tapi karena sebelumnya sudah dikasih logcat, errornya makin mengerucut. Error terjadi ketika memanggil API x dan y yang dipanggil bersamaan. Di varian rilis, hanya API y yang terpanggil, sementara x dilewat. Dari hasil logcat, ada isu di sebuah file Kotlin yang berisi banyak data class, sebut saja Order.kt.
Masalahnya, di kelas ini hanya ada sedikit perubahan untuk menampung data video yang akan diunggah. Tidak ada perubahan ke data class lain, sehingga harusnya regresinya minim. Tapi kenapa masalahnya di kelas ini?
Setelah curcol dengan Cursor atas masalah ini, malam itu, beberapa kali saya build release sesuai rekomendasi Cursor. Mulai dari utak-atik Order.kt, sampai utak-atik proguard. Tapi kok kenapa masih gagal buka halaman tsb?
Untunglah, setelah sekian token habis untuk Cursor dan puluhan kali build release (yang tiap build bisa sampai 40-70 menit) akhirnya ketemu juga akar permasalahannya. Masalahnya ternyata simpel, waktu bikin file Order.kt ternyata Android Studio tidak otomatis menambahkan nama package di baris pertama file.
Jadi saat revamp si modul A ini, file Order.kt tidak dikasih informasi lokasi package, sehingga apapun konfig yang ada di proguard ya tidak akan berefek ke file ini. Entah kenapa saat itu tidak jadi masalah, yang pasti ketika ada penambahan fitur video, file ini jadi tersangka utama.
Pelajaran penting bagi pemrogram Android: Jangan lupakan nama package di semua file kotlin yang kamu buat. Sekian.
