Как добавить Apache HTTP API (устаревший) в качестве зависимости во время компиляции в build.grade для Android M?
Как уже упоминалось, Android M не будет поддерживать API Apache HTTP. Документы заявляют:
используйте вместо этого класс HttpURLConnection.
или же
Чтобы продолжить использовать API-интерфейсы Apache HTTP, вы должны сначала объявить следующую зависимость времени компиляции в файле build.gradle:
android {useLibrary 'org.apache.http.legacy'}
Я преобразовал большую часть использования моего проекта HttpClient в HttpURLConnection, однако мне все еще нужно использовать HttpClient в нескольких областях. Следовательно, я пытаюсь объявить org.apache.http.legacy как зависимость во время компиляции, но получаю ошибку в build.gradle:
Метод Gradle DSL не найден: 'useLibrary()'
Мой вопрос: как мне объявить org.apache.http.legacy как зависимость времени компиляции в моем проекте?
Буду признателен за любую оказанную помощь. Спасибо
11 ответов
Для API 23:
Верхний уровень build.gradle - /build.gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
}
}
...
Специфичный для модуля build.gradle - /app/build.gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
useLibrary 'org.apache.http.legacy'
...
}
Официальные документы (для предварительного просмотра): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html
Последний список изменений плагина для Android: http://tools.android.com/tech-docs/new-build-system
Другая альтернатива - просто добавить зависимость jbundle. Это более дружественно для Android Studio, так как Android Studio не выдает сообщение "невозможно разрешить символ..."
dependencies {
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}
Примечание для Android 9 (пирог).
Дополнительно к useLibrary 'org.apache.http.legacy'
Вы должны добавить в AndroidManifest.xml:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Источник: https://developer.android.com/about/versions/pie/android-9.0-changes-28
В вашем файле build.gradle добавьте useLibrary 'org.apache.http.legacy' согласно Android 6.0 Changes
> Apache HTTP Client Removal
заметки.
android {
...
useLibrary 'org.apache.http.legacy'
...
}
Чтобы избежать ошибок отсутствующих ссылок, добавьте в зависимости
dependencies {
provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}
используя 'условии', зависимость не будет включена в апк
Только что скопированный файл: org.apache.http.legacy.jar
от Android/Sdk/platforms/android-23/optional
папка в папку проекта app/libs
,
Работал как шарм для 23.1.1.
Поскольку ответы немного устарели, я выложу свое решение (что сработало для меня), оно может быть полезным для кого-то еще... Я взял свое решение из официальной документации Apache, никакого обходного пути.
1 / в gradle:
dependencies {
...
// This is the maintained version from apache.
compile group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.1'
}
2 / в остальной части приложения заменить org.apache.http
от cz.msebera.android.httpclient
и все ваши импорты (зависимости) будут исправлены. Вы можете просто сделать Ctrl+ Shift+R и заменить его во всем проекте.
Это должно помочь:
android {
...
useLibrary 'org.apache.http.legacy'
...
}
Чтобы избежать ошибок отсутствующих ссылок, добавьте в зависимости
dependencies {
provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}
или же
dependencies {
compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}
так как
Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.
Я решил эту проблему так:
1.) Установите classpath в файле сборки верхнего уровня, как указано в GUG:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0-beta2'
}
allprojects {
repositories {
jcenter()
}
}
}
2.) В файле сборки конкретного модуля:
android {
useLibrary 'org.apache.http.legacy'
compileSdkVersion 'android-MNC'
buildToolsVersion '23.0.0 rc3'
}
FWIW удаление библиотеки Apache было предсказано некоторое время назад. Наш хороший друг Джесси Уилсон дал нам подсказку еще в 2011 году: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
Google перестал работать над ApacheHTTPClient некоторое время назад, поэтому любая библиотека, которая все еще полагается на это, должна быть включена в список устаревших библиотек, если сопровождающие не обновят свой код.
<rant>
Я не могу сказать вам, сколько технических аргументов я имел с людьми, которые настаивали на том, чтобы придерживаться HTTP-клиента Apache. Существуют некоторые основные приложения, которые могут сломаться, потому что руководство моих прежних работодателей, которых никто не называл, не слушало своих лучших инженеров или не знало, о чем они говорили, когда игнорировали предупреждение... но вода под мост.
Я выигрываю.
</rant>
HTTP-клиент Apache устарел
В Android 6.0 Google удалил поддержку HTTP-клиента Apache. Начиная с Android 9, эта библиотека удаляется из пути к загрузочному классу и по умолчанию недоступна для приложений.
Чтобы продолжить использование HTTP-клиента Apache, приложения, предназначенные для Android 9 и более поздних версий, могут добавить в свои
AndroidManifest.xml:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Примечание:
Атрибут android: required="false" требуется для приложений с минимальным пакетом SDK 23 или ниже, поскольку на устройствах с уровнями API ниже 24 библиотека org.apache.http.legacy недоступна. (На этих устройствах классы HTTP Apache доступны в пути к загрузочному классу.)
Найдено Все изменения в android 9.0:
https://developer.android.com/about/versions/pie/android-9.0-changes-28
Для решения проблем убедитесь, что вы используете инструменты сборки версии "23.0.0 rc2" со следующими инструментами для построения зависимости gradle:
classpath 'com.android.tools.build:gradle:1.3.0-beta2'