Làm cách nào để thêm API Apache HTTP (kế thừa) làm phụ thuộc thời gian biên dịch vào build.grade cho Android M?


96

Như đã đề cập ở đây , Android M sẽ không hỗ trợ API Apache HTTP. Trạng thái tài liệu là:

sử dụng lớp HttpURLConnection thay thế.

hoặc là

Để tiếp tục sử dụng các API Apache HTTP, trước tiên bạn phải khai báo phụ thuộc thời gian biên dịch sau trong tệp build.gradle của mình:

android {useLibrary 'org.apache.http.legacy'}

Tôi đã chuyển đổi phần lớn việc sử dụng HttpClient trong dự án của mình thành HttpURLConnection, tuy nhiên, tôi vẫn cần sử dụng HttpClient trong một số lĩnh vực. Do đó, tôi đang cố gắng khai báo 'org.apache.http.legacy' dưới dạng phụ thuộc thời gian biên dịch nhưng gặp lỗi trong build.gradle:

Không tìm thấy phương thức Gradle DSL: 'useLibrary ()'

Câu hỏi của tôi là: làm cách nào để khai báo 'org.apache.http.legacy' dưới dạng phụ thuộc thời gian biên dịch trong dự án của tôi?

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao. Cảm ơn


3
Đảm bảo rằng bạn đang sử dụng plugin Gradle dành cho Android khá gần đây. Tôi đoán rằng điều này thực sự mới, có nghĩa là bạn sẽ cần một cái gì đó như thế 1.3.0-rc2. Bạn cũng có thể cân nhắc sử dụng phiên bản HttpClient tương thích với Android của Apache .
CommonsWare

Cảm ơn bạn đã phản hồi nhanh @CommonsWare ... Bạn đang đề cập đến dòng "classpath 'com.android.tools.build:gradle:1.0.0'" trong tệp build.gradle cấp cao nhất?
Virat Singh

1
Đúng. Tôi sẽ khá ngạc nhiên nếu 1.0.0useLibraryđiều này. Có thể nó đã xuất hiện trước 1.3.x, vì vậy bạn có thể thử 1.2.3(AFAIK, phiên bản sản xuất mới nhất) và xem điều gì sẽ xảy ra.
CommonsWare

Tôi chỉ cố gắng '1.2.3' và không có may mắn - cùng lỗi -> "không tìm thấy phương pháp DSL Gradle: 'useLibrary ()'": /
Virat Singh

Vâng, vì điều này được gắn với Bản xem trước dành cho nhà phát triển M, tôi không bị sốc vì điều đó. Có lẽ bạn cần 1.3.0-rc2(hoặc một cái gì đó mới hơn, nếu có).
CommonsWare

Câu trả lời:


172

Đối với API 23:

Build.gradle cấp cao nhất - /build.gradle

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

Mô-đun build.gradle cụ thể - /app/build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.apache.http.legacy'
    ...
}

Tài liệu chính thức (để xem trước): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Bảng thay đổi plugin gradle android mới nhất: http://tools.android.com/tech-docs/new-build-system


2
Tôi cập nhật phiên bản xây dựng gradle và sau đó khai báo useLibrary cho apache nhưng sau đó tôi cũng sẽ gặp lỗi: Lỗi: (204, 13) error: không thể tìm thấy lớp biểu tượng DefaultHttpClient Error: (204, 48) error: không thể tìm thấy lớp biểu tượng DefaultHttpClient Error: (205, 13) lỗi: không tìm thấy lớp ký hiệu Lỗi HttpPost: (205, 37) lỗi: không tìm thấy lớp ký hiệu Lỗi HttpPost: (207, 13) lỗi: không tìm thấy lớp ký hiệu Lỗi HttpResponse: (208, 13) lỗi: không thể tìm lỗi biểu tượng lớp HttpEntity: (209, 19) lỗi: không thể tìm thấy EntityUtils biến biểu tượng
Varnit Khandelwal

1
Điều gì đó mà tôi đã bỏ sót trong câu trả lời: Bạn cần đảm bảo rằng đường dẫn gradle nằm trong tệp xây dựng cấp cao nhất của ứng dụng, nơi useLibraryphải có trong tệp xây dựng cụ thể cho ứng dụng của bạn.
Graeme

Cũng không quên để thêm video này jar tập tin để có được làm việc giải pháp trên :)
Sheraz Ahmad Khilji

@Sheraz rằng không còn cần thiết - các gradle build nhặt nó lên tự động
Richard Le Mesurier

1
@Ratul bạn nên thêm một packagingOptions {}khối bên trong androidkhối, bên trong khối này, add exclude 'META-INF/LICENSE'... (mỗi dòng cho mỗi tập tin trùng lặp báo cáo)
hidro

28

Một thay thế khác là chỉ cần thêm phụ thuộc jbundle. Điều này thân thiện hơn với Android Studio vì Android Studio không đưa ra thông báo "không thể phân giải biểu tượng ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }

nó có sẵn trên kho lưu trữ mavenCentral ().
nexDev

Nó không thể được biên dịch: Lỗi: Thực thi không thành công cho tác vụ ': <Proj>: package <Proj> Debug'. > Không thể tính hàm băm của /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov

bạn đã thử biên dịch (xây dựng lại) mà không có proguard chưa?
nexDev

bạn có thể vui lòng hiển thị một dự án mẫu làm việc với điều này? Bây giờ tôi gặp lỗi này: Lỗi: Thực thi không thành công cho tác vụ ': app: packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.Zip Ngoại lệ: mục nhập trùng lặp: org / apache / http / annotation / GuardedBy.class
nhà phát triển android

Loại lỗi bạn mắc phải dường như cụ thể đối với dự án của bạn. Bạn có các gói apache trùng lặp. Một cái rõ ràng là trong org.jbundle. .... và cái khác ở đâu đó trong một trong các Thư viện của bạn. Tôi sẽ tìm kiếm gói trùng lặp trong:
nexDev


13

Trong tệp build.gradle của bạn, hãy thêm useLibrary 'org.apache.http.legacy' theo Android 6.0 Changes> Apache HTTP Client Removalghi chú.

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Để tránh lỗi liên kết bị thiếu, hãy thêm vào phần phụ thuộc

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

sử dụng 'được cung cấp', phần phụ thuộc sẽ không được bao gồm trong gói ứng dụng


11

Chỉ cần sao chép tệp: org.apache.http.legacy.jartừ Android/Sdk/platforms/android-23/optionalthư mục vào thư mục dự án app/libs.

Làm việc như một sự quyến rũ cho 23.1.1.


2

Tôi đã giải quyết vấn đề này như vậy:

1.) Đặt classpath trong tệp xây dựng cấp cao nhất như GUG đã đề cập:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta2'
    }
    allprojects {
        repositories {
           jcenter()
        }
    }
}

2.) Trong tệp xây dựng của mô-đun cụ thể:

android {
   useLibrary 'org.apache.http.legacy'
   compileSdkVersion 'android-MNC'
   buildToolsVersion '23.0.0 rc3'
}

2

Vì các câu trả lời hơi cũ, tôi sẽ đưa ra giải pháp của mình (những gì phù hợp với tôi), nó có thể hữu ích cho người khác ... Tôi đã lấy giải pháp của mình từ tài liệu chính thức của Apache, không cần thao tác.

1 / trong gradle:

dependencies {
...
// This is the maintained version from apache.
compile group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.1'
}

2 / trong phần còn lại của ứng dụng thay thế org.apache.httpbằng cz.msebera.android.httpclientvà tất cả các lần nhập (phụ thuộc) của bạn sẽ được sửa. bạn chỉ có thể thực hiện ctrl + shift + R và thay thế nó trong toàn bộ dự án.


2

nó sẽ giúp:

android {
    ...
    useLibrary 'org.apache.http.legacy'
    ...
}

Để tránh lỗi liên kết bị thiếu, hãy thêm vào phần phụ thuộc

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

hoặc là

dependencies {
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

bởi vì

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.

hoặc cung cấp biên dịch thay vì cung cấp cả hai sẽ hoạt động
logeshwaran

với cấu hình trên, tôi đã gặp lỗi: (155, 0) Không tìm thấy phương pháp Gradle DSL: 'cung cấp ()'
RoFF

1

FWIW việc loại bỏ thư viện Apache đã được báo trước một thời gian trước. Người bạn tốt của chúng tôi Jesse Wilson đã cho chúng tôi manh mối vào năm 2011: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google đã ngừng hoạt động trên ApacheHTTPClient một thời gian trước, vì vậy bất kỳ thư viện nào vẫn dựa vào đó sẽ được đưa vào danh sách các thư viện không dùng nữa trừ khi người bảo trì cập nhật mã của họ.

<rant> Tôi không thể cho bạn biết tôi đã có bao nhiêu tranh luận kỹ thuật với những người khăng khăng gắn bó với ứng dụng Apache HTTP. Có một số ứng dụng chính sẽ bị phá vỡ bởi vì ban quản lý tại các nhà tuyển dụng trước đây không được nêu tên của tôi đã không lắng nghe các kỹ sư hàng đầu của họ hoặc không biết họ đang nói gì khi họ phớt lờ cảnh báo ... nhưng, nước dưới cây cầu.

Tôi thắng.

</rant>


1
Sự hiểu biết của tôi là Apache HttpClient được ẩn trong android-23 nhưng không thực sự bị xóa. Việc xóa sẽ phá vỡ nhiều khách hàng hiện tại nhắm mục tiêu các nền tảng trước đó, trong đó HttpClient không bị ẩn và các ứng dụng hiện có này vẫn dự kiến ​​sẽ chạy trên android-23. Trên android-23, việc thêm useLibrary phục vụ để nối các lớp kế thừa này vào đường dẫn khởi động, nghĩa là, vào danh sách các lớp được cung cấp bởi nền tảng. Điều này về cơ bản hiện các lớp trên android-23.
Joe Bowbeer

Khi một lớp không được dùng nữa, trước tiên, người ta thường ẩn nó đi để ngăn nó được sử dụng về sau. Sau đó, nó có thể được gỡ bỏ khi thời gian trôi qua. Một cái gì đó như: 1. đánh dấu là không dùng nữa trong phiên bản hiện tại. 2. ẩn trong phiên bản thứ hai. 3. cấu trúc lại tất cả mã để loại bỏ hoàn toàn lớp cũ.
Coder Roadie

0

Để giải quyết vấn đề, hãy đảm bảo rằng bạn đang sử dụng phiên bản công cụ xây dựng "23.0.0 rc2" với các công cụ sau xây dựng độ phụ thuộc gradle:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.