Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
Фон
На Android Marshmallow Google полностью исключил поддержку HTTP-клиента Apache (ссылка здесь), потому что он не имеет хорошей производительности по сравнению с альтернативами.
Это также может быть причиной падения многих приложений на Android Marshmallow.
Эта проблема
Google позволяет вам использовать этот API, но не как встроенный, добавив эту строку в файл Gradle:
useLibrary 'org.apache.http.legacy'
Итак, вот что я сделал:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
А также:
android {
compileSdkVersion 'android-MNC'
buildToolsVersion "23.0.0 rc3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.example.user.androidmtest"
minSdkVersion 'MNC'
targetSdkVersion 'MNC'
versionCode 1
versionName "1.0"
}
Когда я попробовал его, он скомпилировался нормально (ошибок не было, и я мог запустить приложение для проверки концепции, так как у него нет специального кода), но когда я попытался использовать некоторые из известных мне классов, являются частью старого API (например, класса "HttpClient"), я вижу, что он не позволяет мне это делать.
Я знаю, что не рекомендуется использовать это решение, но у нас должно быть приложение, готовое работать там хотя бы временно, пока мы не будем работать на 100% над всеми вещами, которые должны измениться для Android Marshmallow, и мы не хотим сюрпризов в форма аварий.
Вот скриншот:
Вопрос
Почему это происходит? Я правильно использовал это?
РЕДАКТИРОВАТЬ: сообщил об этой проблеме здесь:
12 ответов
Android Studio жаловалась, что org.apache.http
классы как
org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils
пропали без вести.
Итак, я добавил org.apache.http.legacy.jar
который вAndroid/Sdk/platforms/android-23/optional
папка к app/libs
Я также добавил эту строку в мой app.gradle
файл
compile files('libs/org.apache.http.legacy.jar')
Но если вы используете больше библиотек, вы можете использовать этот способ
compile fileTree(dir: 'libs', include: ['*.jar'])
Это решило все мои ошибки, которые были вызваны тем, что Google удалил поддержку HTTP-клиента Apache.
Идеальное решение здесь, выполнив простую проверку пути к файлу. запустив
android {
compileSdkVersion 'android-MNC'
buildToolsVersion "23.0.0 rc3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.example.user.androidmtest"
minSdkVersion 'MNC'
targetSdkVersion 'MNC'
versionCode 1
versionName "1.0"
}
getBootClasspath().each{File file ->
println file.absolutePath
}
}
}
Вы получите что-то вроде ниже
/Users/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/android.jar /Users/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/optional/org.apache.http.legacy.jar
Итак, поехали, баночка есть. По какой-то причине она не была добавлена в проект. но вы всегда можете добавить это вручную, я думаю.
useLibrary 'org.apache.http.legacy' не работал для меня, пока я не обновил версию инструментов Gradle в своем основном файле build.gradle своего проекта Android Studio следующим образом:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
Ответ, приведенный выше, просто помогает запускать отладочные сборки и выпускать сборки, использующие gradle.
Вставьте это в тег приложения в файле манифеста во всех экземплярах проекта, которые используют устаревшие классы apache:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
Это помогает тем, кто все еще использует Eclipse и ant-скрипты во время компиляции.
После многих разочаровывающих часов сработало следующее:
1. Найдите банку с апачем. Он должен находиться где-то вроде:
C:\Users\<yourname>\AppData\Local\Android\sdk\platforms\android-23\optional
2. Копировать org.apache.http.legacy.jar
в вашу папку libs.
Либо щелкните правой кнопкой мыши на libs -> paste, либо воспользуйтесь проводником, чтобы перейти к папке libs вашего проекта и вставьте.
Если у вас нет папки libs, как у меня, создайте новый проект и импортируйте все соответствующие файлы в соответствующие места.
3. Нажмите ok
видеть это
4. Самый важный шаг: щелкните правой кнопкой мыши на папке apache и выберите Add As Library
, видеть это
Надеюсь, что это помогает кому-то жить своей жизнью.
Старая библиотека Apache находится в
[ANDROID_SDK]\platforms\android-23\optional\org.apache.http.legacy.jar
Так что вы можете скопировать его в свои проектные библиотеки или просто использовать
compile files("${android.getSdkDirectory().getAbsolutePath()}" + File.separator + "platforms" + File.separator + "android-23" + File.separator + "optional" + File.separator + "org.apache.http.legacy.jar")
в вашем /app/build.gradle
Сначала вы должны проверить это в папке libs
Then add into your gradle file like this
android {
compileSdkVersion 23
buildToolsVersion '23.0.2'
defaultConfig {
applicationId "info.tranetech.laundry"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
android {
useLibrary 'org.apache.http.legacy'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1
compile 'com.android.support:design:23.0.1
testCompile 'junit:junit:4.12'
compile files('libs/android-async-http-1.4.4.jar')
compile 'com.google.android.gms:play-services:8.4.0'
}
Я знаю, что это глупая причина, но в списке попробуйте...
Я столкнулся с этой проблемой недавно, и она вызвана ограничением длины пути, я думаю, что это максимум 256 символов.
Переместите ваш проект, и сборка будет успешной. Надеюсь, эта работа для вас.
Удалить
useLibrary 'org.apache.http.legacy'
из build.gradle, и я также добавил эту строку в мой файл app.gradle
compile files('libs/org.apache.http.legacy.jar')
Но если вы используете больше библиотек, вы можете использовать этот способ
compile fileTree(dir: 'libs', include: ['*.jar'])
Ответ CoPLaS устранил мои проблемы.
Включите это в sdk/platform /android-23/ необязательный / необязательный. Json
[
{
"name": "org.apache.http.legacy",
"jar": "org.apache.http.legacy.jar",
"manifest": false
}
]
Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
Чтобы продолжить использовать HTTP-классы Apache для API 23+:
Прежде всего, обязательно добавьте зависимости gradle в build.gradle
е
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
}
}
Затем добавьте ссылку внутри build.gradle
вашего проекта:
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
useLibrary 'org.apache.http.legacy'
...
}
Простой способ решить эту проблему - это C:\Users\username\AppData\Local\Android\sdk\platform. Здесь удалите свой android-23 и из менеджера SDK обновите API 23 снова. Это решит вашу проблему.