Как использовать устаревший 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, и мы не хотим сюрпризов в форма аварий.

Вот скриншот:

Вопрос

Почему это происходит? Я правильно использовал это?


РЕДАКТИРОВАТЬ: сообщил об этой проблеме здесь:

https://code.google.com/p/android/issues/detail?id=181474

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

Убедитесь, что в папке Libs проверьте, что библиотека apache

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

Это мой файл Gradle

Также проверьте внешнюю библиотеку

Я знаю, что это глупая причина, но в списке попробуйте...

Я столкнулся с этой проблемой недавно, и она вызвана ограничением длины пути, я думаю, что это максимум 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 снова. Это решит вашу проблему.

Другие вопросы по тегам