Di bagian sebelumnya saya sudah ketemu kode-kode hexadecimal yang di write ke LEDnya dan mendapatkan APK com.android.settings untuk di reverse engineer. Di bagian ini saya akan coba untuk mengerti jadx dan melihat kedalam aplikasi com.android.settings.
Untuk sedikit info di awal, artikel ini bakal banyak ngebahas tentang coding dan mungkin bakal banyak gambarnya (kalau gambarnya gak keliatan bisa dicoba lihat di atas (yang panjang mirip-mirip banner))
Pas buka pertama kali buka jadx-gui, terang banget (ini kira-kira saya buka jam 11an). Saya langsung cari biar bisa dark mode.
Nah, mendingan. Setelah itu, saya buka file .APKnya. Penasaran, saya langsung global search (search semua file) untuk "Preview on Back"
Waduh, gak ketemu. Singkat cerita, saya akhirnya nyerah dengan metode nyari text gini. Dan lanjut, saya coba cari kira-kira aplikasi apa yang sedang di focus oleh HP saya (yang sedang ditampilkan di layar).
Sambil buka setting untuk Active Halo, saya memakai ADB untuk mencari fokusnya dengan menggunakan perintah: "dumpsys window displays | grep -E “mCurrentFocus” command". dumpsys ... displays mengeluarkan sebuah "log" untuk semua aplikasi, "|" memasukkan output ke perintah selanjutnya, grep digunakan untuk mencari text tertentu. Dan hasilnya adalah "com.android.settings/com.transsion.backlight.v3.EffectSettingsV3Activity".
Kalau dari yang saya lihat-lihat, ini adalah sesuatu yang namanya "intent", jadi dalam sebuah aplikasi bisa ada halaman-halaman lain (masuk akal buat settings). Jadi, method yang perlu saya lihat adalah "com.transsion.backlight.v3.EffectSettingsV3Activity". Setelah di global search, ketemu juga methodnya.
"Ini apaan!?" yang pertama kali saya pikirkan pas lihat ini. Sedikit informasi, saya ngerti sedikit kalau python, javascript dan kotlin sedikit. Tapi ini java (masih bisa dimengerti karena mirip-mirip kotlin). Setelah dilihat-lihat beberapa menit, ada yang menarik.
button.setOnClickListener(new k0(this, 28));
a aVar = (a) new ViewModelProvider(this).get(a.class);
this.f10429a = aVar;
aVar.getClass();
MediatorLiveData mediatorLiveData = new MediatorLiveData();
mediatorLiveData.setValue(new a.C0135a(Settings.Global.getInt(aVar.getApplication().getContentResolver(), "tran_led_color_setting", 0), Settings.Global.getInt(aVar.getApplication().getContentResolver(), "tran_led_mode_setting", 1)));
mediatorLiveData.observe(this, new j(this, 5));
this.f10429a.d(this.f10439s);
button.setOnClickListener(new k0(this, 28));
a aVar = (a) new ViewModelProvider(this).get(a.class);
this.f10429a = aVar;
aVar.getClass();
MediatorLiveData mediatorLiveData = new MediatorLiveData();
mediatorLiveData.setValue(new a.C0135a(Settings.Global.getInt(aVar.getApplication().getContentResolver(), "tran_led_color_setting", 0), Settings.Global.getInt(aVar.getApplication().getContentResolver(), "tran_led_mode_setting", 1)));
mediatorLiveData.observe(this, new j(this, 5));
this.f10429a.d(this.f10439s);
Kayaknya ini yang saya cari, ada "button.setOnclickListener(new k0(this, 28));" yang berarti (dari sepengertian saya) setiap kali tombol ini ditekan (harusnya yang "Preview on Back") dia menjalankan fungsi k0 dan memberikan 2 argumen (this dan 28) dan sisanya saya gak ngerti (hehe) tapi kira-kira sisanya set props (nanti saya bakal bahas).
Buat ngerti apa yang k0 lakuin, kita harus lihat dulu codenya. k0 mengambil 2 argumen (object, integer). Integer kedua masuk kedalam switch statement, switch statement kira-kira begini:
case 1 :
(lakukan sesuatu kalau x itu satu)
case 2:
(lakukan yang lain)
k0 ini casenya nyampe 28, kalau kita lihat argument sebelumnya adalah 28. Yuk, lihat kodenya.
case 28:
((EffectSettingsV3Activity) obj).f10429a.a(80);
return;
Buset, ini apaan!? return biasanya dipakai di switch statement, tapi yang EffectSettings itu apa? Ini bikin pusing nyarinya, kira-kira gini proses saya:
1. Cari f10429a di define dimana (di EffectSettingsV3Activity (file yang sebelumnya))
2. f10429a itu apaan? (didefinisikan di kode kalau ini itu a)
3. a itu apa?
Di proses 3 ini yang bikin bingung, nyari definisi itu gampang, tapi a itu ngapain?, berdasarkan fungsinya a mengambil 1 argumen (integer), di dalam fungsi a ada try catch. Try catch biasanya begini:
try {
(coba ini)} catch (e) {
(kalau error, ngapain)
}
Biar gak bingung sayanya, catch saya gak liatin. Trynya yang aneh:
Class.forName("android.app.ActivityManager").getDeclaredMethod("hookDisturbStatus", Integer.TYPE).invoke((ActivityManager) getApplication().getSystemService(ActivityManager.class), Integer.valueOf(i10));
Iya, sepanjang ini tapi satu baris. Jadi dia dapetin method namanya hookDisturbStatus? terus invoke sesuatu yang ngambil system service activity manager dengan integer dari yang dikasih tadi? (saya juga gak ngerti). Saya liatin terus-terusan, bingung sendiri terus keinget: "Ketika tidak tahu sesuatu, tanya ChatGPT.".
Dari balasan ChatGPT, fungsi ini berhubungan dengan Do Not Disturb nah yang saya bingung apa yang di-invoke? Saya tanya ChatGPT tapi ChatGPT bilang kalau tidak ada kodenya, dia tidak tahu apa yang fungsi tersebut lakukan.
Jadi prosesnya begini kalau mencet:
1. Pencet
2. k0(this, 28) (ini ngejalanin fungsi k0, yang nanti ke case 28)
3. a(80) (sesuatu tentang DND, gajelas)
Lah terus hubungannya DND sama nyala apaan? Bisa jadi ada notifikasi tapi di DND biar gak keliatan? Saya juga bingung.
Saya nyerah, cuma sebatas ini doang yang saya ketemu. Mau saya lanjutin pakai frida biar bisa lebih detail lagi, tapi perlu root. Sebenernya frida bisa gak pakai root, tapi appnya perlu di disassemble dan di masukkan frida-gadget (ini mau saya lakukan tapi kapan-kapan). Mendadak saya kepikiran, music mode gimana?
Kalau ada lagu (dari Spotify, YT Music, dll) dia nyala warna-warni ikutin irama lagunya, apa tiap beat dia send sesuatu ke LEDnya?
Ternyata enggak, dia cuma kirim byte:
"00 0A 00 00 00 00"
dan pas lagunya berhenti, dia kirim byte reset (semuanya "00")
Ada satu lagi yang belum saya bahas yaitu props! Di awal sempet saya singgung sedikit, sebenernya saya awalnya ngeliat-liat propsnya dulu (bahkan sebelum part 1, saya lupa menceritakan ini), saya juga lupa gimana bisa saya kepikiran ngeliat props dulu. Prop bisa dibilang adalah "properti", banyak informasi bisa didapetin di props. Cara mendapatkan daftar prop bisa dengan cara "adb shell getprop". Hasilnya agak panjang.
Terus gimana caranya bisa tahu prop yang mana yang diganti? Gampangnya, saya save 2 kali propsnya dengan mengganti settingannya. Jadi, settingan 1 prop 1, settingan 2 prop 2 dan melihat perbedaannya.
Dan akhirnya ketemu 4 prop yang berbeda:
[persist.sys.transsion.led_color_setting]: [2]
[persist.sys.transsion.led_mode_setting]: [1]
[persist.sys.transsion.led_setting_enable]: [1]
[persist.sys.transsion.led_start_boot_enable]: [1]
yang pertama, adalah warna yang dipilih sekarang
yang kedua, mode (Lively, Rhythm, AI)
yang ketiga, kira-kira fiturnya aktif atau tidak
yang keempat, kalau smartphone baru nyala apakah LEDnya nyala?
Ada 2 perintah adb yang berhubungan sama prop, getprop (mendapatkan) dan setprop (mengatur). Setelah tahu apa aja yang diganti, tinggal pakai setprop dong? Saya coba, tapi gak ada yang berubah. Di sini saya mulai frustrasi, tapi setelah cari-cari di Google ada satu perintah ADB yaitu "adb shell settings". Jadi untuk mengubah-ubah configurasinya bisa tinggal "adb shell settings put global persist.sys.transsion.led_mode_setting 1" (ini buat ubah mode ke mode 1).
Jadi part selanjutnya apa? Part selanjutnya (kalau bisa) saya bakal coba pakai frida-gadget dan ke settingsnya biar bisa dilihat secara detail apa saja system call yang dipanggil saat menekan "Preview on back". Menurut saya sedikit lucu sih, satu tombol saja bisa bikin serepot ini. Sekian dari saya, semoga artikel ini menghibur. Terima kasih
Baca konten-konten menarik Kompasiana langsung dari smartphone kamu. Follow channel WhatsApp Kompasiana sekarang di sini: https://whatsapp.com/channel/0029VaYjYaL4Spk7WflFYJ2H