Android AddJavascripInterface tidak berjalan saat release

Agak sedikit berkaitan dengan postingan sebelumnya, di Android, jika kita ingin memanggil sebuah fungsi java melalui javascript pada webview yang bisa kita lakukan adalah dengan menggunakan fungsi addJavascriptInterface, kayak sample-nya gini:

 class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

jangan lupa untuk selalu menambahkan anotasi atribut @JavascriptInterface pada fungsi yang akan dipanggil dari javascript, karena ini mandatory mulai dari Android API Level 17.

Problem

Pada saat development aplikasi, pada umumnya developer secara default akan menjalankan aplikasi langsung dari IDE (eclipse, Android Studio, intelliJ ddl) ke device; hal ini berarti aplikasi masih dalam mode debug dan belum di signature. Flow-nya kurang lebih seperti ini

IDE -> Build -> apk -> Run -> Device/Simulator

Akan tetapi, saat me-release aplikasi ke Google Play, pada umumnya yang kita lakukan adalah:

IDE->Build->Obfuscate->sign->apk->submit ke Google Play Store

di sini terlihat ada dua langkah tambahan sebelum aplikasi release ke Google Play Store, yaitu obfuscate & sign. Secara umum kedua langkah tersebut tidak akan membuat masalah yang berarti di aplikasi; akan tetapi jika tidak hati-hati masalah bisa timbul dan lambat dideteksi jika kita terbiasa melakukan testing aplikasi kita dalam mode debug saja; misalnya saat kita memanfaatkan javascript interface ke Java seperti yang diceritakan di awal blog ini.

Salah satu langkah yang dilakukan oleh obfuscator, adalah “meminimize” nama-nama fungsi yang kita buat sehingga menjadi nama-nama yang pendek (misalnya dengan satu karakter) sehingga menjadikan ukuran aplikasi kita lebih kecil dan kalaupun ada yang me-reverse engineer/decompile aplikasi yang kita buat juga akan kesulitan memahami alur aplikasi kita. Perlu dijadikan perhatian, obfuscator tidak akan pernah mengubah konstanta string yang ada di source code aplikasi kita.Hal ini juga berlaku untuk konten string yang ada di webview yang kita isi secara manual seperti contoh pada awal blog ini. Sehingga boleh jadi, setelah selesai obfuscation kelas yang kita buat menjadi kurang lebih seperti ini:

class J {
    public String s() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new J(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

Kita perhatikan source code di atas, anotasi atribut @JavascriptInterface hilang, dan nama kelas JsObject berubah menjadi J dan fungsi toString berubah menjadi s(), tetapi di fungsi javascript nama fungsinya tidak berubah tetap toString; anda bisa lihat, ini akan membuat javascript tidak berjalan karena fungsi toString sudah tidak lagi ada dan kalau anda menjalankan aplikasi tersebut di device dengan API Level 17 ke atas juga “lebih” bermasalah karena anotasi  @JavascriptInterface hilang.

Solution

Agar fungsi yang kita gunakan melalui interface javacript tidak diikut di obfuscate, kita bisa menambahkan beberapa rule di file konfigurasi obfuscator/proguard:
1. Konfigurasi agar proguard tidak menghapus anotasi atribut

-keepattributes JavascriptInterface
-keepattributes *Annotation*

2. Konfigurasi agar proguard tidak mengubah nama fungsi dan kelasnya

-keep public class com.bla.bli.blu.Bleblo$JsObject
-keep public class * implements com.bla.bli.blu.Bleblo$JsObject
-keepclassmembers class com.bla.bli.blu.Bleblo$JsObject {
<methods>;
}

dengan beberapa baris konfigurasi di atas, maka aplikasi tidak lagi bermasalah saat melakukan interfacing fungsi dari javascript ke java.

happy coding :)

Iklan

Rasanya Baru Kemarin

rasanya
baru kemarin bung karno dan bung hatta
atas nama kita menyiarkan dengan seksama
kemerdekaan kita di hadapan dunia
rasanya
gaung pekik merdeka kita
masih memantul-mantul
tidak hanya dari mulut-mulut jurkam pdi saja
rasanya
baru kemarin
padahal sudah lima puluh tiga tahun lamanya

pelaku-pelaku sejarah yang nista dan yang mulia
sudah banyak yang tiada
penerus-penerusnya sudah banyak yang berkuasa
atau berusaha
tokoh-tokoh pujaan maupun cercaan bangsa
taruna-taruna sudah banyak yang jadi
petinggi negeri
mahasiswa-mahasiswa yang dulu suka berdemonstrasi
sudah banyak yang jadi menteri

rasanya
baru kemarin
padahal sudah lebih setengah abad lamanya
negara sudah semakin kuat
rakyat sudah semakin terdaulat

pembangunan ekonomi kita sudah sedemikian laju
semakin jauh meninggalkan pembangunan akhlak
yang tak kunjung maju
anak-anak kita sudah semakin mekar tubuhnya
bapak-bapak kita sudah semakin besar perutnya

rasanya baru kemarin
padahal sudah lima puluh tiga tahun kita merdeka
kemajuan sudah menyeret dan mengurai
pelukan kasih banyak ibu-bapa
dari anak-anak kandung mereka
kemakmuran duniawi sudah menutup mata
banyak saudara terhadap saudaranya

daging sudah lebih tinggi harganya
dibanding ruh dan jiwa
tanda gambar sudah lebih besar pengaruhnya
dari bendera merah putih dan lambang garuda
pejuang marsinah sudah berkali-kali
kuburnya digali tanpa perkaranya terbongkar
preman-preman sejati sudah berkali-kali
diselidiki dan berkas-berkasnya selalu terbakar

rasanya
baru kemarin
padahal sudah lebih setengah abad kita merdeka
pahlawan-pahlawan idola bangsa
seperti diponegoro
imam bonjol dan sisingamangaraja
sudah dikalahkan oleh ksatria baja hitam
dan kura-kura ninja

banyak orang pandai sudah semakin linglung
banyak orang bodoh sudah semakin bingung
banyak orang kaya sudah semakin kekurangan
banyak orang miskin sudah semakin kecurangan

rasanya
baru kemarin

banyak ulama sudah semakin dekat kepada pejabat
banyak pejabat sudah semakin erat dengan konglomerat
banyak wakil rakyat sudah semakin jauh dari umat
banyak nurani dan akal budi sudah semakin sekarat

( hari ini ingin rasanya
aku bertanya kepada mereka semua
sudahkah kalian
benar-benar merdeka ? )

rasanya
baru kemarin

tokoh-tokoh angkatan 45 sudah banyak yang koma
tokoh-tokoh angkatan 66 sudah banyak yang terbenam

rasanya
baru kemarin

negeri zamrud katulistiwaku yang manis
sudah terbakar habis
dilalap krisis demi krisis
mereka yang kemarin menikmati pembangunan
sudah banyak yang bersembunyi meninggalkan beban
mereka yang kemarin mencuri kekayaan negeri
sudah meninggalkan utang dan lari mencari selamat sendiri

rasanya baru kemarin
padahal sudah lebih setengah abad kita merdeka

mahasiswa-mahasiswa penjaga nurani
sudah kembali mendobrak tirani
para oportunis pun mulai bertampilan
berebut menjadi pahlawan
politisi-politisi pensiunan
sudah bangkit kembali
partai-partai politik sudah bermunculan
dalam reinkarnasi

rasanya
baru kemarin

tokoh-tokoh orde lama sudah banyak yang mulai menjelma
tokoh-tokoh orde baru sudah banyak yang mulai menyaru

rasanya
baru kemarin

pak harto sudah tidak menjadi tuhan lagi
bayang-bayangnya sudah berani persi sendiri
mester habibie sudah memberanikan diri
menjadi presiden transisi
bung harmoko sudah tak lagi
mengikuti petunjuk dan mendominasi televisi
gus dur muali siap madeg pandita
ustadz amin rais sudah siap jadi sang nata
mbak mega sudah mulai agak lega
mas surjadi sudah mulai jaga-jaga

( hari ini rasanya
aku bertanya kepada mereka semua
bagaimana rasanya merdeka )

rasanya baru kemarin
padahal sudah lima puluh tiga tahun kita merdeka

para jendral dan pejabat sudah saling mengadili
para reformis dan masyarakat sudah nyaris tak terkendali

mereka kemarin yang dijarah
sudah mulai pandai meniru menjarah
mereka yang perlu direformasi
sudah mulai fasih meneriakkan reformasi
mereka yang kemarin dipaksa-paksa
sudah mulai berani mencoba memaksa
mereka yang kemarin dipojokkan
sudah mulai belajar memojokkan

rasanya baru kemarin
orangtuaku sudah lama pergi bertapa
anak-anakku sudah pergi berkelana
kakakku sudah menjadi politikus
aku sendiri sudah menjadi tikus

( hari ini
setelah lima puluh tiga tahun kita merdeka
ingin rasanya aku mengajak kembali
mereka semua yang kucinta
untuk mensyukuri lebih dalam lagi
rahmat kemerdekaan ini
dengan mereformasi dan meretas belenggu tirani
diri sendiri
bagi merahmati sesama )

rasanya baru kemarin
ternyata sudah lima puluh tiga tahun kita merdeka

( ingin rasanya
aku sekali lagi menguak angkasa
dengan pekik yang lebih perkasa :
merdeka ! )

 

~KH. Mustofa Bisri