Как добавить 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'
Другие вопросы по тегам