Bagaimana cara menambahkan Apache HTTP API (legacy) sebagai dependensi waktu kompilasi ke build.grade untuk Android M?


96

Seperti yang disebutkan di sini , Android M tidak akan mendukung Apache HTTP API. Dokumen menyatakan:

gunakan kelas HttpURLConnection sebagai gantinya.

atau

Untuk terus menggunakan Apache HTTP API, Anda harus mendeklarasikan ketergantungan waktu kompilasi berikut dalam file build.gradle Anda:

android {useLibrary 'org.apache.http.legacy'}

Saya telah mengonversi banyak penggunaan HttpClient proyek saya ke HttpURLConnection, namun, saya masih perlu menggunakan HttpClient di beberapa area. Karenanya, saya mencoba mendeklarasikan 'org.apache.http.legacy' sebagai dependensi waktu kompilasi tetapi saya mendapatkan kesalahan dalam build.gradle:

Metode Gradle DSL tidak ditemukan: 'useLibrary ()'

Pertanyaan saya adalah: bagaimana cara mendeklarasikan 'org.apache.http.legacy' sebagai ketergantungan waktu kompilasi dalam proyek saya?

Bantuan apa pun sangat dihargai. Terima kasih


3
Pastikan Anda menggunakan plugin Gradle untuk Android yang cukup baru. Dugaan saya ini benar-benar baru, artinya Anda akan membutuhkan sesuatu seperti 1.3.0-rc2. Anda juga dapat mempertimbangkan untuk menggunakan edisi HttpClient yang kompatibel dengan Android milik Apache .
CommonsWare

Terima kasih atas tanggapan cepat @CommonsWare ... Apakah Anda merujuk ke baris "classpath 'com.android.tools.build:gradle:1.0.0'" di file build.gradle tingkat atas?
Virat Singh

1
Iya. Saya akan agak terkejut jika 1.0.0memiliki barang useLibraryitu. Mungkin saja itu merangkak sebelum 1.3.x, jadi Anda dapat mencoba 1.2.3(AFAIK, rilis produksi terbaru) dan melihat apa yang terjadi.
CommonsWare

Saya baru saja mencoba '1.2.3' dan tidak berhasil - kesalahan yang sama -> "Metode Gradle DSL tidak ditemukan: 'useLibrary ()'": /
Virat Singh

Ya, karena ini terkait dengan Pratinjau Pengembang M, saya tidak terkejut dengan itu. Mungkin Anda membutuhkan 1.3.0-rc2(atau sesuatu yang lebih baru, jika ada).
CommonsWare

Jawaban:


172

Untuk API 23:

Tingkat atas build.gradle - /build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}
...

Build.gradle khusus modul - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.apache.http.legacy'
    ...
}

Dokumen resmi (untuk pratinjau): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Log perubahan plugin gradle android terbaru: http://tools.android.com/tech-docs/new-build-system


2
Saya memperbarui versi build gradle dan kemudian mendeklarasikan useLibrary untuk apache juga tetapi kemudian saya juga akan mendapatkan kesalahan: Kesalahan: (204, 13) kesalahan: tidak dapat menemukan kelas simbol Kesalahan DefaultHttpClient: (204, 48) kesalahan: tidak dapat menemukan kelas simbol Kesalahan DefaultHttpClient: (205, 13) kesalahan: tidak dapat menemukan kelas simbol Kesalahan HttpPost: (205, 37) kesalahan: tidak dapat menemukan kelas simbol Kesalahan HttpPost: (207, 13) kesalahan: tidak dapat menemukan kelas simbol Kesalahan HttpResponse: (208, 13) kesalahan: tidak dapat menemukan kelas simbol HttpEntity Error: (209, 19) error: tidak dapat menemukan variabel simbol EntityUtils
Varnit Khandelwal

1
Sesuatu yang saya lewatkan dari jawabannya: Anda perlu memastikan bahwa gradle classpath ada di file build level atas aplikasi Anda, yang useLibraryharus ada di file build khusus aplikasi Anda.
Graeme

Juga jangan lupa untuk menambahkan file jar ini agar solusi di atas berfungsi :)
Sheraz Ahmad Khilji

@Sheraz yang tidak lagi diperlukan - build gradle mengambilnya secara otomatis
Richard Le Mesurier

1
@Ratul Anda harus menambahkan packagingOptions {}blok di dalam androidblok, di dalam blok ini, tambahkan exclude 'META-INF/LICENSE'... (setiap baris per file duplikat dilaporkan)
hidro

28

Alternatif lain adalah dengan menambahkan dependensi jbundle. Ini lebih ramah Android Studio karena Android Studio tidak memberikan pesan "tidak dapat menyelesaikan simbol ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }

itu tersedia di repositori mavenCentral ().
nexDev

Itu tidak dapat dikompilasi: Kesalahan: Eksekusi gagal untuk tugas ': <Proj>: paket <Proj> Debug'. > Tidak dapat menghitung hash /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov

Sudahkah Anda mencoba mengompilasi (membangun kembali) tanpa proguard?
nexDev

bisakah Anda menunjukkan contoh proyek yang bekerja dengan ini? Sekarang saya mendapatkan kesalahan ini: Kesalahan: Eksekusi gagal untuk tugas ': app: packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.ZipException: entri duplikat: org / apache / http / annotation / GuardedBy.class
pengembang android

Nah, Jenis kesalahan yang Anda miliki tampaknya khusus untuk proyek Anda. Anda memiliki paket apache duplikat. Satu tampaknya di org.jbundle. .... dan lainnya di suatu tempat di salah satu Perpustakaan Anda. Saya akan mencari paket duplikat di:
nexDev


13

Di file build.gradle Anda, tambahkan useLibrary 'org.apache.http.legacy' sesuai Android 6.0 Changes> Apache HTTP Client Removalcatatan.

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Untuk menghindari kesalahan link yang hilang, tambahkan dependensi

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

menggunakan 'asalkan' ketergantungan tidak akan disertakan dalam apk


11

Baru saja menyalin file: org.apache.http.legacy.jardari Android/Sdk/platforms/android-23/optionalfolder ke folder proyek app/libs.

Bekerja seperti pesona untuk 23.1.1.


2

Saya memecahkan masalah ini seperti:

1.) Setel jalur kelas dalam file versi tingkat atas seperti yang disebutkan GUG:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta2'
    }
    allprojects {
        repositories {
           jcenter()
        }
    }
}

2.) Dalam membangun file modul tertentu:

android {
   useLibrary 'org.apache.http.legacy'
   compileSdkVersion 'android-MNC'
   buildToolsVersion '23.0.0 rc3'
}

2

Karena jawabannya agak lama, saya akan memberikan solusi saya (apa yang berhasil untuk saya), ini dapat membantu orang lain ... Saya mengambil solusi saya dari dokumentasi resmi Apache, tidak ada solusi .

1 / dalam gradle:

dependencies {
...
// This is the maintained version from apache.
compile group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.1'
}

2 / di aplikasi lainnya, ganti org.apache.httpoleh cz.msebera.android.httpclientdan semua impor Anda (dependensi) akan diperbaiki. Anda tinggal melakukan ctrl + shift + R dan menggantinya di seluruh proyek.


2

itu akan membantu:

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Untuk menghindari kesalahan link yang hilang, tambahkan dependensi

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

atau

dependencies {
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

karena

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.

atau berikan kompilasi alih-alih disediakan keduanya akan berfungsi
logeshwaran

dengan konfigurasi di atas, saya bertemu dengan Kesalahan: (155, 0) Metode Gradle DSL tidak ditemukan: 'disediakan ()'
RoFF

1

FWIW penghapusan pustaka Apache telah diramalkan beberapa waktu lalu. Teman baik kami Jesse Wilson memberi kami petunjuk di tahun 2011: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google berhenti bekerja di ApacheHTTPClient beberapa waktu yang lalu, jadi pustaka apa pun yang masih mengandalkannya harus dimasukkan ke dalam daftar pustaka yang tidak digunakan lagi kecuali pengelola memperbarui kodenya.

<rant> Saya tidak dapat memberi tahu Anda berapa banyak argumen teknis yang saya miliki dengan orang-orang yang bersikeras untuk tetap menggunakan klien HTTP Apache. Ada beberapa aplikasi utama yang akan rusak karena manajemen di tempat kerja saya sebelumnya yang tidak akan disebutkan namanya tidak mendengarkan insinyur top mereka atau tahu apa yang mereka bicarakan ketika mereka mengabaikan peringatan itu ... tetapi, air di bawah jembatan.

Saya menang.

</rant>


1
Pemahaman saya adalah bahwa Apache HttpClient tersembunyi di android-23 tetapi sebenarnya tidak dihapus. Penghapusan akan merusak banyak klien yang ada yang menargetkan platform sebelumnya, di mana HttpClient tidak disembunyikan, dan aplikasi yang sudah ada ini masih diharapkan untuk berjalan di android-23. Di android-23, menambahkan useLibrary berfungsi untuk menambahkan class lama ini ke classpath boot, yaitu ke daftar class yang disediakan oleh platform. Ini pada dasarnya memperlihatkan kelas-kelas di android-23.
Joe Bowbeer

Saat sebuah kelas tidak digunakan lagi, biasanya pertama menyembunyikannya untuk mencegahnya digunakan di masa mendatang. Kemudian dapat dihapus seiring berjalannya waktu. Sesuatu seperti: 1. tandai sebagai usang dalam versi saat ini. 2. bersembunyi di versi kedua. 3. refactor semua kode untuk menghilangkan class lama sepenuhnya.
Coder Roadie

0

Untuk mengatasi masalah tersebut, pastikan Anda menggunakan fitur build versi "23.0.0 rc2" dengan dependensi gradle build alat berikut:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.