2013-11-28 16 views
13

Ứ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.

Trả lời

-6

Không bảo vệ (các) gói ứng dụng của bạn trong khi thử nghiệm, trừ khi bạn hoàn toàn phải làm như vậy.

+5

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

11

Đây là những gì làm việc cho tôi:

Trong build.gradle tôi đã thêm dòng này vào phần defaultConfig tôi:

testProguardFile "test-proguard-rules.pro"

Sau đó, tôi tạo test-proguard-rules.pro với các nội dung sau :

-dontobfuscate 
-dontwarn 

Điều này cho bạn biết cách sử dụng cấu hình bảo vệ riêng biệt này cho gói thử nghiệm của bạn, gói chứa công cụ kiểm tra ntation. Trong trường hợp này, bạn đang bảo proguard không làm xáo trộn gói thử nghiệm của bạn, đó có lẽ là những gì bạn muốn. Gói ứng dụng chính mà bạn đang thử nghiệm vẫn bị xáo trộn khi sử dụng cấu hình proguard hiện có của bạn.

+2

Làm thế nào để bạn xử lý tất cả các cuộc gọi mà gói thử nghiệm thực hiện cho ứng dụng chính. Vì lớp và phương pháp trong ứng dụng chính sẽ bị làm phiền bởi proguard, làm thế nào ứng dụng thử nghiệm sẽ gọi những phương thức/lớp bị làm xáo trộn này? –

Các vấn đề liên quan