Hanantadk

Gson Error After Release

Beberapa waktu yang lalu setelah release, saya menemukan beberaa error. Mungkin hampir sebagian programmer android pernah mengalami hal serupa. Selama proses development atau dalam mode debugging, aplikasi berjalan lancar tanpa ada error yang muncul tetapi setelah pindah ke mode release malah muncul beberapa error.

Aplikasi tiba tiba force close dalam mode release dan hanya sedikit log yang saya dapatkan. Untungnya, bug tersebut keliatan di logcat meskipun bercampur dengan log system android). Setelah dicek,terlihat variabel kehilangan value atau null padahal di mode debug berjalan lancar.

Pada kasus yang saya alami, Error merujuk pada class xxxx.java, karena dalam mode relase maka tidak bisa melihat penyebab error di baris mana. berikut cuplikan kode pada class yang memungkinkan terjadinya error.

Untuk model objeknya

Error null value bisa terjadi karena banyak kemungkinan, yang jelas null value terjadi karena variabel kehilangan data atau tidak menerima data. Seperti halnya dalam pengiriman barang ke client, dimana barang bisa saja tidak sampai ke client karena faktor x.

Dalam kasus yang saya alami, Gson gagal mengkonvert json menjadi object. Karena dalam mode debug berjalan lancar dan hanya terjadi dalam mode realese berarti ada pengaturan pada proguard yang salah atau belum lengkap. Ternyata model object belum terkeep pada proguard. Karena setelah realese, proguard akan membuat kode kita menjadi obfuscation (script menjadi tidak bisa terbaca dan menyamarkan nama method pada semua class). Oleh karena itu perlu ditambahkan perintah agar model kita tidak terjamah oleh proguard. Biasanya keep dilakukan pada package model yang kita gunakan. Berikut contoh penambahan perintah pada proguard :

-keep class com.hanantadk.smashapp.models.**{ *; }

Jika sudah melakukan keep proguard tetapi belum menyelesaikan masalah, berikut beberapa tips yang bisa dilakukan:

SOLUSI :

  1. cek model yang anda gunakana
  2. jika menggunakan gson, sertakan annotation @Expose dan @Serialization("nama_variabel_sama_dengan_entitiy_json)
  3. untuk lebih aman, gunakan konverter online seperti jsonschema2pojo
  4. cek proguard, apakah sudah di keep

Berikut contoh untuk model fix dan proguard :

Setting proguard :

Untuk marshmallow, penambahan @Expose sangatlah wajib hukumnya jika menggunakan GsonBuilder, karena terdapat issue pada GsonBuilder di android M. Bisa dicek disini Issue GsonBuilder. Untuk proguard Jika sudah menggunakan annotation @SerializedName tidak perlu penambahan keep class model di proguard.

Jika kita mengembangkan aplikasi sebaiknya melakukan test tidak hanya pada mode debug saja, tetapi pada mode release juga. Pada mode release proguard akan aktif yang biasanya akan membuat file kita obfuscated sehingga rawan muncul error tanpa kita sadari. Sekian Terimaksih.

REFERENSI

1. Stackoverflow : http://stackoverflow.com/questions/30001674/gson-deserialize-null-pointer-in-released-apk
2. jsonschema2pojo : http://www.jsonschema2pojo.org/

Leave a Reply

Your email address will not be published. Required fields are marked *