Ứng dụng tôi đang làm việc đang được xây dựng với Gradle. Tôi đang cố gắng thêm Espresso làm phụ thuộc cho các thử nghiệm công cụ. Bản thân ứng dụng có một vài phụ thuộc, một trong số đó là Guava 15.0. Để thực hiện công việc này, tôi sử dụng phiên bản Espresso với các phụ thuộc rõ ràng và loại trừ Ổ đĩa đã được nhóm (bằng cách sử dụng của riêng tôi thay thế).Tích hợp Espresso với Proguard và Gradle
dependencies {
...
instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar')
compile 'com.google.guava:guava:15.0'
...
}
Khi tôi cố gắng xây dựng với gradle connectedInstrumentTest
, tôi gặp lỗi liên quan đến các phương pháp và lớp bị thiếu.
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState
at com.google.android.apps.common.testing.ui.espresso.base.InputManagerEventInjectionStrategy.<init>(InputManagerEventInjectionStrategy.java:35)
Thêm -keep class com.google.common.** { *; }
vào cấu hình Proguard làm mọi thứ hoạt động tốt. Những gì dường như đang xảy ra là Proguard chỉ phân tích các lớp được sử dụng bởi ứng dụng chính và nó không phải là tìm kiếm sử dụng bởi các phụ thuộc kiểm tra cụ. Các phương thức/lớp học không được ứng dụng chính của tôi sử dụng, nhưng cần thiết cho các bài kiểm tra, dường như được tối ưu hóa.
Tôi làm cách nào để Proguard có thể giữ các lớp/phương pháp được yêu cầu bởi Espresso và các phụ thuộc của nó? Nó không có vẻ thực tế để xác định tất cả chúng bằng tay (có rất nhiều tập quán), và giữ tất cả chúng đánh bại mục đích của Proguard.
Thật không may, ứng dụng không thực hiện bước dex mà không có proguard do có quá nhiều phương pháp (qua thư viện). Có đủ thời gian để thêm loại trừ Xoài nhưng các lỗi tương tự cũng có thể xảy ra ở những nơi khác (ví dụ: bất cứ khi nào các phương pháp/lớp được sử dụng để thử nghiệm nhưng không được sử dụng trong ứng dụng chính). – antonyt