66 lines
2.7 KiB
Markdown
66 lines
2.7 KiB
Markdown
+++
|
|
template = "article.html"
|
|
title = "Use Apache HTTP Client on Android SDK 23"
|
|
date = 2015-10-01T15:46:00+02:00
|
|
description = "How to continue using Apache HTTP Client in Android SDK 23 after Google removed it from the platform."
|
|
|
|
[taxonomies]
|
|
tags = ["android"]
|
|
+++
|
|
|
|
With the Android M SDK (API 23), Google removed the Apache HTTP Client library.
|
|
It was deprecated since API 22, and Google recommanded to use
|
|
`HttpURLConnection` instead since API 9. While the classes are still bundled in
|
|
Android 6 ROMs, it won't be long until we see them completely go away.
|
|
|
|
Some applications are still relying on this library, and need to be updated to
|
|
use the SDK 23, without having time/budget/whatever required to switch from
|
|
HTTP Client. While I strongly recommend you to still take time to move to
|
|
something else (there are many high-level libraries, like
|
|
[OkHttp](http://square.github.io/okhttp/) or
|
|
[Ion](https://github.com/koush/ion), or you can use `HttpURLConnection`
|
|
to keep a low-level access), there is a way to use the Apache library
|
|
while using the SDK 23.
|
|
|
|
<!--more-->
|
|
|
|
## Current situation
|
|
|
|
The Android SDK is mainly a JAR of empty stubs, which allows the build system to
|
|
assemble an APK depending on these stubs. But the JAR is not bundled in the
|
|
APK. At runtime, Android will provide actual implementations of all these
|
|
classes and their methods. That's a rough explanation, but we don't have to go
|
|
more in-depth to explain the issue we have with the SDK 23.
|
|
|
|
In this new SDK, Google simply removed the stubs for the Apache HTTP Client
|
|
library. As a result, any application using it doesn't build anymore. But… an
|
|
old APK still works on devices running on Android M. The explanation is simple:
|
|
the stubs have been removed, but not the matching classes on the device. The
|
|
solution seems obvious: we need to get back those stubs!
|
|
|
|
## Fixing the problem on a Gradle project
|
|
|
|
Using the build-tools 23 and the SDK 23 (well, you won't have the issue without
|
|
it anyway), providing stubs for the Apache library is really easy. Simply
|
|
add this command in the `android` section of your `build.gradle`:
|
|
|
|
*build.gradle*
|
|
|
|
```groovy
|
|
android {
|
|
useLibrary 'org.apache.http.legacy'
|
|
}
|
|
```
|
|
|
|
Rebuild, problem solved.
|
|
|
|
## Other project types
|
|
|
|
If you're not using Gradle, the solution is not much more complicated. Google is
|
|
providing a JAR with the stubs you need. That's the one used by Gradle. You can
|
|
find it in your SDK: `platforms/android-23/optional/org.apache.http.legacy.jar`.
|
|
Simply build against this JAR, and you'll be fine.
|
|
|
|
In both cases, please remember to actually fix this by not using the Apache HTTP
|
|
Client library any more as soon as possible, as it will probably be deleted in a
|
|
future Android release.
|