Cara mendiagnosis masalah integrasi SDK. Pengalaman tim pengembangan SDK Iklan Seluler Yandex

Halo semuanya! Nama saya Dmitry Fisko, saya sedang mengembangkan Yandex Mobile Ads SDK. Perpustakaan kami dirancang untuk memonetisasi aplikasi seluler di platform Android dan iOS. Hari ini saya ingin memberi tahu Anda tentang bagaimana kami menyederhanakan analisis kesalahan integrasi SDK yang kompleks dalam aplikasi Android. Mungkin pengalaman kami akan bermanfaat bagi Anda.

Pengguna kami - pengembang aplikasi seluler - tidak selalu membaca dokumentasi, jadi terkadang mereka menemukan cara rumit untuk menggunakan SDK. Integrasi yang salah dapat mengurangi efektivitas iklan, dan karenanya mengurangi pendapatan pengembang. Untuk membantu pengembang memonetisasi aplikasi lebih baik, kami telah menciptakan sistem pemantauan proaktif yang menganalisis kinerja aplikasi seluler. Jika kami mempelajari masalah melalui pemantauan, maka kami menghubungi pengembang dan membantu mereka menemukan sumber masalah dan menyelesaikannya.

Sayangnya, tidak semua kesalahan integrasi SDK dapat diidentifikasi dengan pemantauan. Jika situasi seperti itu muncul, kami berpaling kepada mitra untuk mengklarifikasi detail integrasi. Kemudian kami mencoba menentukan penyebab masalah dan membantu menyelesaikannya. Jika bahkan informasi ini tidak cukup untuk menentukan penyebab kesalahan, kami meminta izin kepada mitra untuk merekayasa balik aplikasi. Setelah izin, kami mulai melihat karya SDK iklan dalam aplikasi sebagai kotak hitam. Kami melihat aktivitas jaringan melalui proxy, memeriksa tampilan tampilan iklan melalui Inspektur Tata Letak, dll.

Melihat aktivitas jaringan aplikasi yang dimulai dengan Android 7.0 bermasalah, karena sistem secara default tidak mempercayai sertifikat yang ditetapkan oleh pengguna. Diperlukan instalasi sertifikat untuk melihat lalu lintas SSL aplikasi melalui proxy. Ini akan menyelesaikan masalah dengan meluncurkan aplikasi pada versi Android lebih awal dari 7.0, atau dengan menambahkan network_security_config ke aplikasi, misalnya, melalui Apktool. Anda dapat melihat tampilan tampilan iklan melalui utilitas Layout Inspector dengan menjalankan aplikasi pada emulator atau pada perangkat. Dalam hal ini, Anda perlu memodifikasi file AndroidManifest.xml dengan menambahkan atribut debuggable = true melalui Apktool.

Jika metode kotak hitam tidak cukup dan masalahnya tidak dapat direproduksi, Anda dapat melihat logika aplikasi. Untuk melakukan ini, Anda dapat menggunakan utilitas dekompilasi APK, seperti JADX , Bytecode Viewer . Namun seringkali pendekatan ini membutuhkan terlalu banyak waktu dan tidak selalu membuahkan hasil. Oleh karena itu, untuk memahami dengan cepat bagaimana aplikasi menggunakan SDK dari dalam, kami membuat skrip untuk menggantikan implementasi SDK baru ke dalam aplikasi yang sudah dibangun.

Menginstal implementasi SDK baru ke dalam aplikasi


Mengubah kode SDK memungkinkan Anda untuk menanamkan kode arbitrer ke dalam aplikasi melalui kelas-kelas versi SDK yang dimodifikasi dan, misalnya, mengaktifkan mode logging tambahan. Algoritma operasi adalah sebagai berikut. Skrip:

  1. membongkar file aplikasi DEX di smali;
  2. mengkonversi file JAR dari versi baru SDK ke smali;
  3. menggantikan implementasi file smali SDK dalam file aplikasi smali;
  4. Menyatukan kembali aplikasi dengan versi baru SDK.


D sedang memasang file aplikasi DEX di smali


Anda perlu menguraikan aplikasi, membaginya menjadi unit yang lebih kecil, sehingga Anda dapat mengubah kode kelas SDK tanpa mengubah kode aplikasi. Bagaimana cara mendekati aplikasi yang dirakit? Bongkar DEX menjadi file smali.

Di Android, aplikasi menyimpan kode dalam file DEX. Anda dapat mengekstraknya dari aplikasi melalui utilitas unzip, karena APK adalah arsip reguler dengan konten terstruktur. File DEX memiliki format biner untuk kemasan kode yang lebih padat dibandingkan dengan JAR. Karena sifat biner dari DEX, itu tidak manusiawi, jadi mengubah DEX itu sendiri tidak rasional. Hal pertama yang terlintas dalam pikiran adalah untuk mendekompilasi DEX di Jawa. Konversi semacam itu dimungkinkan, tetapi bersifat non-sepele dan terjadi dengan hilangnya fungsionalitas kode. Oleh karena itu, kami akan menggunakan terjemahan ke dalam kode smali. Konversi ke smali memungkinkan Anda mentransfer instruksi dari DEX secara akurat dalam bentuk yang dapat dibaca manusia dengan kemungkinan konversi selanjutnya menjadi kode yang bisa diterapkan.

Memanggil utilitas smali mengubah DEX ke satu set kelas dalam kode smali. Dalam hal ini, pengaturan awal kelas oleh subpackage dipertahankan.


Konversi SDK baru ke smali


Kami akan menyiapkan versi pengganti SDK. Untuk menjamin reproduktifitas masalah, kami akan membuat versi SDK dengan logging yang diaktifkan berdasarkan versi yang sama yang sudah terintegrasi ke dalam aplikasi. Salah satu cara termudah untuk mengetahui versi Yandex Mobile Ads SDK yang terhubung dalam aplikasi adalah dengan melihat konten metode di kelas MobileAds.getLibraryVersion () melalui Apk Analizer di Android Studio. Setelah menemukan versi SDK iklan yang digunakan, kami beralih ke cabang rilis ini dan mengumpulkan versi pustaka dengan pencatatan tambahan. Akibatnya, kami mendapatkan file AAR. Ini berisi sumber daya dan kode perpustakaan. Dalam file AAR, kami hanya tertarik pada kode pada file JAR, karena tidak ada sumber daya eksternal di SDK kami: semua sumber daya dimasukkan langsung ke dalam kode atau berasal dari backend. Kurangnya file sumber daya menyederhanakan integrasi SDK ke dalam IDE tanpa dukungan sistem pembangunan modern.

Untuk mengubah versi SDK dalam aplikasi ke yang baru, kami membawa AAR ke keadaan yang sama dengan aplikasi yang dibongkar, yaitu, dari AAR kami mendapatkan satu set file smali. Konversi berlangsung di sepanjang rantai: AAR → JAR → DEX → SMALI:

  1. dari AAR menggunakan utilitas unzip kami mengekstrak JAR dengan kode;
  2. Kami mengonversi JAR ke DEX melalui utilitas dxdump dari Android SDK Tools;
  3. kita mendapatkan file dalam kode smali menggunakan utilitas smali dengan file DEX sebagai parameter.


Implementasi SDK


Setelah menerima file smali dari aplikasi dan SDK dengan log, kami mengganti implementasi SDK dengan yang baru. Lalu kami membangun kembali aplikasi. Saat siaran ke smali, kelas yang dihasilkan mempertahankan lokasi mereka dengan sub-paket. Oleh karena itu, jika paket di mana kelas SDK berada diketahui, mudah untuk membedakan kelas perpustakaan dari kelas aplikasi. Kelas SDK dapat didistribusikan di beberapa DEX. Jadi algoritma dimana implementasi SDK diganti berbeda untuk aplikasi dengan satu atau beberapa file DEX.

Dan algoritma untuk mengganti implementasi SDK dalam aplikasi dengan satu DEX


Dalam satu aplikasi DEX, kami cukup menyalin kelas smali SDK baru di atas semua kelas aplikasi dan menghasilkan DEX yang dimodifikasi. Anda dapat menghasilkan file DEX menggunakan utilitas baksmali. Direktori dengan file paket kelas dalam kode smali diumpankan ke input utilitas. Setelah melewati baksmali file smali gabungan dari aplikasi dan SDK baru, kita mendapatkan file DEX yang dimodifikasi dengan logika SDK yang diubah.


Dan algoritma untuk mengganti implementasi SDK dalam aplikasi dengan MultiDex


Untuk aplikasi dengan MultiDex, tambahkan SDK terpisah ke DEX baru dan hapus versi SDK sebelumnya dari sisa file DEX aplikasi. Menambahkan versi baru SDK ke masing-masing DEX akan menghindari batasan jumlah metode dalam format DEX. MultiDex akan secara otomatis memuat file DEX yang ditambahkan dengan kode SDK jika dinamai dengan benar. MultiDex mencari file DEX secara bergantian, menggunakan indeks di akhir file: pertama dex1, lalu dex2 - dan seterusnya. Jika Anda memberi nama file dengan indeks tambahan, maka MultiDex akan secara otomatis memuatnya ke dalam mesin virtual. Dengan demikian, melalui baksmali, kita akan menghasilkan file DEX berdasarkan file aplikasi smali yang diterima sebelumnya, tetapi dengan kelas-kelas SDK versi lama yang dihapus. Dan juga mengumpulkan file DEX tambahan dengan versi SDK yang dimodifikasi, menambah indeks atas nama file DEX.


Bangun kembali aplikasi dengan versi baru SDK


Kami mendapat file aplikasi DEX dengan versi SDK yang dimodifikasi. Masalahnya kecil: kita akan mengganti file DEX di file APK yang awalnya tidak dibongkar dari aplikasi dengan file DEX yang dimodifikasi. Dan dengan memanggil perintah zip kita mendapatkan versi final APK, yang masih harus ditandatangani. Kami akan masuk dengan kunci debug melalui apksigner sehingga aplikasi dapat diinstal pada perangkat. Aplikasi dengan logika SDK yang dimodifikasi sudah siap.

N Menyimpan


Algoritme berfungsi untuk sebagian besar kasus, tetapi terkadang tidak akan berfungsi untuk menggantikan implementasi SDK dalam aplikasi. Alasan untuk ini:

  1. ProGuard Kebingungan. Aturan dalam file konsumen perpustakaan mencegah ProGuard memindahkan kelas SDK. Tetapi jika pengembang membatalkan instruksi ini, maka bagian dari kelas perpustakaan dapat mengubah paket mereka. Dalam hal ini, algoritme tidak akan berfungsi, karena skrip tidak akan menemukan lokasi kelas-kelas SDK lama.
  2. Batasan format DEX. Jika semua kode dalam aplikasi disimpan dalam satu file DEX, yang hampir sepenuhnya kehabisan batas metode yang digunakan. Saat mengganti versi SDK dalam aplikasi dengan versi dengan logging tambahan, jumlah metode akan meningkat. Batas akan terlampaui. Dalam format DEX, batasnya adalah 2 ^ 16.
  3. Lindungi aplikasi Anda dari perubahan. Aplikasi ini memiliki mekanisme bawaan untuk memerangi modifikasi. Misalnya, melalui validasi tanda tangan aplikasi. Dengan mengubah APK, kami mengubah tanda tangannya. Ketika aplikasi dimulai, ia memeriksa tanda tangan terhadap referensi dan melemparkan pengecualian. Sangat sulit untuk menghapus cek ini jika ditempatkan di bagian asli.

Dan togas


Kami mengotomatiskan langkah-langkah yang dijelaskan dalam artikel dengan skrip bash sederhana. Script memiliki kekurangan, tetapi sangat mempercepat analisis masalah kompleks ketika mengintegrasikan SDK ke dalam aplikasi mitra. Meskipun, kami jarang menggunakan pendekatan ini, karena kami sering menemukan solusi pada tahap sebelumnya.

Dari konversi ke smali, Anda bisa mendapatkan manfaat tambahan: file smali memungkinkan Anda untuk men-debug aplikasi tanpa sumber. Untuk mulai debugging, Anda perlu membuat proyek di Android Studio berdasarkan file-file kecil aplikasi dan melampirkan debugger ke proses yang diinginkan. Rincian lebih lanjut ditulis dalam artikel ini .

Source: https://habr.com/ru/post/id460597/


All Articles