如何在Android Marshmallow上使用旧版Apache HTTP客户端?


76

背景

在Android Marshmallow上,Google已完全删除了对Apache HTTP客户端的支持(链接此处),因为与其他替代品相比,它的性能不佳。

这也可能是导致Android Marshmallow上许多应用程序崩溃的原因。

问题

通过将以下行添加到gradle文件中,Google允许您仍然使用此API,而不是内置API:

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


通过它编译良好,您的意思是gradle同步良好,还是在运行时收到ClassNotFoundException?
Blackbelt,2015年

您能发布Android Studioat的某些屏幕截图吗?
DevUt 2015年

@Blackbelt我的意思是,直到我编写了本应受支持的类为止,它都可以进行编译和运行(因为没有什么可使用的)。不能有任何ClassNotFoundException,因为我还没有使用它们。只有当我尝试使用应该存在的类时,我才不能。它不允许我这样做,也没有为我提供所需的进口商品。
Android开发人员

@ user4847410截屏究竟是什么?试图强行实施进口将导致其未被识别。并使用存在的类也可以。无论如何,我已经更新了问题以显示当前情况,这是非常小的……
android开发人员

检查您是否正在使用最新的beta gradle。依赖项{classpath'com.android.tools.build:gradle:1.3.0'}在该版本之后,似乎缺少了一些东西(即“ -beta”之类的东西)。使用最新的Beta版为我解决了它
milosmns'Jul

Answers:


93

Android Studio抱怨org.apache.http

org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils

不见了。

所以我org.apache.http.legacy.jarAndroid/Sdk/platforms/android-23/optional文件夹中添加了app/libs

我也将此行添加到我的app.gradle文件中

compile files('libs/org.apache.http.legacy.jar')

但是,如果您使用更多的库,则可以使用这种方式

compile fileTree(dir: 'libs', include: ['*.jar'])

这解决了我所有由于Google删除了对Apache HTTP客户端的支持而导致的错误。


2
为我工作。我必须将Jar作为库添加到我的应用程序模块中,以摆脱有关HttpClient等的Android Studio错误。
尔根·卡什班·瓦尔曼(Jürgen'Kashban)Wahlmann,2015年

1
当我包含org.apache.http.legacy.jar时,出现Proguard问题:是否IOExcpetion: Can't write [path to classes.jar] (Can't read [path to libs/org.apache.http.legacy.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [org.apache.http.legacy.jar:org/apache/commons/codec/binary/Hex.class]))还有其他人在使用Proguard?有任何想法吗?
ashughes

1
令人遗憾的是,谷歌选择使用一种黑客程序,要求人们向其项目中添加二进制文件,而不是向人工制品仓库发布http-legacy。我以为我们在10年前就抛弃了这种反模式。
威廉

1
先生,你是天才。
活动

1
即使如此,它仍然对我没有用。任何可能的诊断请@CoPLaS
Lakshmi Narayanan

9

直到我在Android Studio项目的主build.gradle文件中升级了Gradle工具版本后,useLibrary的org.apache.http.legacy才对我不起作用,如下所示:

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

非常感谢!知道为什么只有这种更改才能解决问题吗?
Shirane85

显然useLibrary指令是最近才添加到Gradle的,因此需要使用较新的版本,如上所述。
杰米·霍尔

我在主gradle文件中有此文件:classpath'com.android.tools.build:gradle:1.0.0-rc2'所以我应该删除它并添加您的行或保留这两行,这样就可以正常工作了
Sagar Devanga15年

删除并添加以上内容。
杰米·霍尔

9

通过运行简单的文件路径检查,在这里是完美的解决方案。通过运行

   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 /“您的名字” /开发/android-sdk-macosx/platforms/android-MNC/android.jar / Users /“您的名字” /Development/android-sdk-macosx/platforms/android-MNC/optional/org.apache .http.legacy.jar

所以你去了,罐子在那里,由于某种原因,它没有被添加到项目中。但我想您总是可以手动添加它。


1
我不明白 您编写的这段代码是什么?您的意思是我应该搜索这个jar,并将其添加到项目中。请解释。
Android开发人员

是的,没错。我在android子句下的build.gradle中编写了该代码。正是我所说的,这个罐子不是自动捡起来的。也许你需要手动添加
超等

该代码做什么?真的需要吗?另外,您检查了吗?工作正常吗?
Android开发人员

不,它只是打印文件路径。没有任何花哨的功能,您可以安全地将其删除。该罐包含旧apache罐(HttpClient,Log等)中的所有内容,我想它可以正常工作。

好的谢谢。希望我在时间到时不需要它。如有必要,将再次检查。目前,您为此付出了+1。
Android开发人员

6

经过许多令人沮丧的小时,以下工作:

1.找到apache jar。 它应该位于以下位置:

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 看到这个

希望这可以帮助某人过上幸福的生活。


5

上面的答案仅有助于调试版本的运行,以及发布利用gradle的版本。

在使用旧版apache类的所有项目实例上,将其插入清单文件中的application标记内:

<uses-library android:name="org.apache.http.legacy" android:required="false" />

这对于那些在编译期间仍在使用Eclipse和ant脚本的人有帮助。


2

我知道这是愚蠢的原因,但请尝试一下...

我最近遇到了这个问题,它是由路径长度限制引起的,我认为最大长度为256个字符。

迁移项目,构建将成功。希望为您完成这项工作。


这不是傻了......这是我的情况下工作的答案...过去36小时里,我花了试图在地球上的一切,除了这个..它在一开始听起来傻傻的,所以我没有把它当回事..
KawaiKx

伙计们,也尝试一下...它确实对我有用,其他一切都失败了
KawaiKx 2016年

@KawaiKx
Arpit Patel

2

旧版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中


2

首先,您必须在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文件

同时检查外部库


1

在sdk / platforms / android-23 / optional / optional.json中启用此功能

[
  {
    "name": "org.apache.http.legacy",
    "jar": "org.apache.http.legacy.jar",
    "manifest": false
  }
]

0

去掉

useLibrary 'org.apache.http.legacy' 

从build.gradle中,我还将这一行添加到我的app.gradle文件中

compile files('libs/org.apache.http.legacy.jar')

但是,如果您使用更多的库,则可以使用这种方式

compile fileTree(dir: 'libs', include: ['*.jar'])

CoPLaS回答解决了我的问题。


2
然后,只需对CoPLaS答案进行投票,而不是在此处复制它!
Leo

0

如何在Android Marshmallow上使用旧版Apache HTTP客户端?

要继续为API 23+使用Apache HTTP类:

首先,请确保将gradle依赖项添加到build.gradlef中

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

0

解决此问题的一种简单方法是C:\ Users \ username \ AppData \ Local \ Android \ sdk \ platforms。在这里删除您的android-23,并从SDK管理器中再次更新您的API 23。它将解决您的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.