SDK Resolusi Dependensi di Android

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.

Prasyarat

Pastikan Anda sudah membaca tuntas panduan Memulai dan Memulai Android Audience Network sebelum melanjutkan.

Konflik Dependensi

1: Pustaka Bersama dalam Dependensi dari Konfigurasi yang Sama

2: Pustaka Bersama dalam Dependensi dari Konfigurasi yang Berbeda

Solusi Konflik Dependensi

1: Biarkan Gradle Menyelesaikan Masalah Dependensi untuk Anda

2: Jangan Sertakan Versi Dependensi Spesifik

3: Tentukan secara Eksplisit Pustaka yang Berkonflik di Gradle

4: Paksa Resolusi Pustaka



Konflik Dependensi

1: Pustaka Bersama dalam Dependensi dari Konfigurasi yang Sama

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'  

2: Pustaka Bersama dalam Dependensi dari Konfigurasi yang Berbeda

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' 

Solusi Konflik Dependensi

1: Biarkan Gradle Memecahkan Masalah untuk Anda

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' 

2: Jangan Sertakan Versi Dependensi Tertentu

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 Configuration
implementation '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'
}

3: Tentukan Secara Eksplisit Pustaka yang Berkonflik di Gradle

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' 

4: Paksa Resolusi Pustaka

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 Configuration
android {
    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'
    }
}

Langkah Berikutnya

Sumber Informasi Lainnya

Panduan Memulai

Panduan teknis untuk memulai menggunakan Audience Network

Referensi API

Referensi Facebook SDK untuk iOS