Masalah dependensi muncul di paket atau pustaka bersama yang menjadi sumber dependensi beberapa paket lainnya, namun paket tersebut bergantung pada versi paket bersama yang berbeda-beda dan tidak kompatibel. Gradle telah memudahkan para developer Android - cukup tambahkan satu dependensi di build.gradle, dan pustaka yang diperlukan disertakan secara mulus dalam build. Namun, apa yang terjadi jika 2 dependensi memiliki dependensi pada versi yang berbeda dalam pustaka yang sama?
Gradle dapat secara otomatis menyelesaikan masalah dependensi jika kedua dependensi termasuk dalam konfigurasi yang sama, yaitu konfigurasi aplikasi. Contoh, Audience Network Android SDK bergantung pada pustaka "exoplayer". Jika Anda perlu menambahkan versi pustaka "exoplayer" yang berbeda, Gradle akan memilih versi yang lebih tinggi untuk disertakan. Namun, jika kedua dependensi tersebut termasuk dalam konfigurasi yang berbeda, yaitu aplikasi dan pengujian, Gradle akan menampilkan kesalahan. Di bawah ini kita akan membahas konflik dan solusi yang berbeda-beda.
Pastikan Anda sudah membaca tuntas panduan Memulai dan Memulai Android Audience Network sebelum melanjutkan.
Pertimbangkan contoh berikut. Kedua dependensi dalam kode di bawah berada dalam konfigurasi yang sama dan memiliki dependensi internal pada pustaka "org.hamcrest:hamcrest-core". Karena kedua dependensi ini secara internal menggunakan versi yang berbeda dari pustaka yang sama, versi tertinggi disertakan dalam build. Hasil sinkronisasi Gradle dengan jelas menandakan bahwa ini secara otomatis meningkatkan versi pustaka hamcrest dari 1.1 ke 1.3 pada build akhir.
// Depends on version 1.3 of org.hamcrest:hamcrest-core androidTestImplementation 'junit:junit:4.12' // Depends on version 1.1 of org.hamcrest:hamcrest-core androidTestImplementation 'org.mockito:mockito-core:1.10.19'
Jika kedua dependensi termasuk dalam konfigurasi yang berbeda, yaitu konfigurasi aplikasi dan pengujian, Gradle akan menampilkan kesalahan. Pertimbangkan snippet kode berikut. Dependensi termasuk dalam konfigurasi aplikasi, sedangkan dependensi kedua termasuk dalam konfigurasi pengujian. Jadi, saat membangun proyek, ini akan gagal dengan pengecualian.
Saat uji instrumentasi dijalankan, APK utama dan APK pengujian memiliki jalur kelas yang sama. Build Gradle akan gagal jika APK utama dan APK pengujian menggunakan pustaka yang sama (mis., Guava) tetapi dalam versi berbeda. Jika Gradle tidak merekamnya, aplikasi dapat berperilaku berbeda selama pengujian dan selama berjalan normal (termasuk kerusakan di salah satu kasus).
// Depends on version 1.3 of org.hamcrest:hamcrest-core implementation 'junit:junit:4.12' // Depends on version 1.1 of org.hamcrest:hamcrest-core androidTestImplementation 'org.mockito:mockito-core:1.10.19'
Pendekatan ini paling sederhana, tetapi terbatas untuk dependensi dalam konfigurasi yang sama. Contoh: modul secara eksplisit bergantung pada versi tertentu ExoPlayer. Akan tetapi, Audience Network SDK telah menyertakan versi lain ExoPlayer. Secara default, versi tertinggi disertakan dalam build. Dengan snippet kode di bawah, hasil sinkronisasi Gradle secara jelas akan menandakan bahwa ini secara otomatis meningkatkan versi pustaka ExoPlayer dari r2.4.2 ke 2.7.3 dalam build akhir.
implementation 'com.google.android.exoplayer:exoplayer-core:2.7.3' implementation 'com.google.android.exoplayer:exoplayer-dash:2.7.3' ... // audience-network-sdk depends on exoplayer-core:r2.4.2 and exoplayer-dash:r2.4.2 implementation 'com.facebook.android:audience-network-sdk:4.28.1'
Biasanya, developer ingin memiliki kontrol atas versi pustaka mana yang pada akhirnya disertakan dalam build. Anda diizinkan mengonfigurasi build.gradle untuk mewujudkannya. Contoh: jika developer lebih menyukai ExoPlayer r2.4.0 versi lebih rendah daripada r2.4.2 di Audience Network SDK, Anda dapat mengecualikan modul tersebut saat mengumumkan dependensi "audience-network-sdk". Tanda pengecualian juga berlaku untuk dependensi dalam konfigurasi yang berbeda.
Dalam proyek nyata, akan ada banyak dependensi yang memiliki versi berbeda dari pustaka yang sama. Jika demikian, untuk semua dependensi, Anda harus memiliki tanda pengecualian sehingga Anda dapat menyertakan versi yang diharapkan dari pustaka tersebut.
Scenario 1: Dependencies in Same Configurationimplementation 'com.google.android.exoplayer:exoplayer-core:r2.4.0' implementation 'com.google.android.exoplayer:exoplayer-dash:r2.4.0' ... // audience-network-sdk depends on exoplayer-core:r2.4.2 and exoplayer-dash:r2.4.2 implementation ('com.facebook.android:audience-network-sdk:4.28.1') { exclude group: 'com.google.android.exoplayer', module:'exoplayer-core' exclude group: 'com.google.android.exoplayer', module:'exoplayer-dash' }Scenario 2: Dependencies in Different Configuration
// Depends on version 1.3 of org.hamcrest:hamcrest-core implementation 'junit:junit:4.12' // Depends on version 1.1 of org.hamcrest:hamcrest-core androidTestImplementation ('org.mockito:mockito-core:1.10.19'){ exclude group: 'org.hamcrest', module:'hamcrest-core' }
Ini adalah cara yang lebih bersih untuk menyelesaikan konflik untuk dependensi dari konfigurasi yang berbeda-beda. Dalam hal ini, kita harus secara eksplisit menyebutkan versi pustaka yang ingin kita sertakan dalam build final untuk salah satu konfigurasi.
Pendekatan ini lebih bersih untuk menyelesaikan konflik, tetapi kekurangannya adalah bahwa saat memperbarui dependensi aktual seperti junit dan mockito, developer juga harus memperbarui pustaka yang berkonflik.
// Depends on version 1.3 of org.hamcrest:hamcrest-core implementation 'junit:junit:4.12' // Depends on version 1.1 of org.hamcrest:hamcrest-core androidTestImplementation 'org.mockito:mockito-core:1.10.19' // Explictly mention that include version 1.3 of org.hamcrest:hamcrest-core androidTestCompile 'org.hamcrest:hamcrest-core:1.3'
Ini adala cara lain untuk menyelesaikan masalah konflik di mana daripada mendeklarasikan satu konfigurasi, paksa untuk semua konfigurasi. Dalam contoh di bawah, Anda dapat menambahkan "resolutionStrategy" Anda sendiri build.gradle tingkat modul, sehingga memaksakan versi paket tertentu agar disertakan, terlepas dari apakah dependensi dalam konfigurasi yang sama atau berbeda.
Pendekatan ini harus digunakan secara hati-hati. Dalam contoh pertama, jika audience-network-sdk diperbarui dan pustaka tersebut memperbarui versi pustaka exoplayer-core dan exoplayer-dash, kami akan tetap memaksa menggunakan versi mundur. Meski skenario ini benar untuk pendekatan solusi kedua, dalam pendekatan ini kami memaksakan versi dependensi di semua konfigurasi, alih-alih satu konfigurasi.
Scenario 1: Dependencies in Same Configurationandroid { configurations.all { resolutionStrategy.force 'com.google.android.exoplayer:exoplayer-core:r2.4.0' resolutionStrategy.force 'com.google.android.exoplayer:exoplayer-dash:r2.4.0' } }Scenario 2: Dependencies in Different Configuration
android { configurations.all { resolutionStrategy.force 'org.hamcrest:hamcrest-core:1.1' } }
Integrasi iklan uji dengan aplikasi Anda
Ajukan aplikasi Anda untuk ditinjau.
Begitu kami menerima permintaan untuk iklan dari aplikasi atau situs web Anda, kami akan meninjaunya untuk memastikan kepatuhan pada kebijakan Audience Network dan standar komunitas Facebook. Pelajari selengkapnya tentang proses peninjauan kami.
Sumber Informasi Lainnya |
Panduan MemulaiPanduan teknis untuk memulai menggunakan Audience Network | Referensi APIReferensi Facebook SDK untuk iOS |