proguard hell - không thể tìm thấy lớp tham chiếu


125

Vì vậy, tôi đang cố gắng phát hành một số phần mềm nhưng Proguard đang khiến tôi đau đầu.

Khi tôi cố gắng xuất bằng proguard, tôi nhận được rất nhiều cảnh báo tức là "không thể tìm thấy lớp tham chiếu"

Ví dụ:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

Các cảnh báo dường như liên quan đến đơn giản hóa, vì vậy trong tệp cấu hình proguard của tôi, tôi đã thêm vào như sau:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Đâu pathtoprojecttolibslà đường dẫn đến các lọ được tham chiếu bởi dự án của tôi.

Điều này làm cho KHÔNG có sự khác biệt.

Nếu tài liệu tham khảo Simpleframework javax tôi có thể nói với proguard để bỏ qua điều này không ??

Có ý kiến ​​gì không?


1
Bạn đang sử dụng proguard chỉ để làm treeshaking? Nếu vậy, bạn đã kiểm tra kích thước tập tin của bạn mà không sử dụng nó? Bạn có thể gặp lỗi superwierd khi proguard ném ra thứ gì đó được truy cập bằng phản chiếu chẳng hạn mà bạn sẽ không tìm thấy cho đến khi nó phá vỡ thời gian chạy, vì vậy hãy thực sự chắc chắn rằng bạn cần nó.
alun

Tôi thực sự chỉ sử dụng nó để cố gắng bảo vệ mã được đặt biệt danh dễ dàng? Bạn có nghĩ rằng nó có giá trị nó?
i Nhiệmillyquestions

3
@ListenToRick Proguard hoàn toàn ổn, nếu nó chạy với các cấu hình phù hợp và ứng dụng kết quả của bạn được kiểm tra đúng cách. Tôi khá chắc chắn Google thậm chí còn khuyến nghị sử dụng nó. Google cung cấp rất nhiều hướng dẫn / ví dụ để sử dụng Proguard với ứng dụng Android.
CrackerJack9

Proguard là một công cụ tốt nhưng google khuyến nghị nó có lẽ ít nhất là vì giới hạn kích thước khá lớn hơn ở định dạng dex như mọi thứ khác. (Xem code.google.com/p/android/issues/detail?id=7147 )
alun

5
@alun, đó không phải là lý do. Những người trong chúng ta không muốn các ứng dụng của chúng tôi đảo ngược hoặc đang sử dụng giấy phép để 'thử' để ngăn chặn vi phạm bản quyền nên sử dụng một công cụ che giấu như thế này để làm cho tin tặc khó khăn hơn. Làm cho ứng dụng của bạn chiếm ít không gian hơn cũng là một lợi ích cho người dùng cuối và cũng có những tối ưu hóa được thực hiện bởi các công cụ này ... còn một lợi ích khác.
Christopher Perry

Câu trả lời:


128

org.simpleframework.xml.stream.StreamReadertrong mã của bạn đề cập đến javax.xml.stream.events.XMLEvent. Lớp thứ hai là một phần của thời gian chạy Java ( rt.jar) nhưng không phải là một phần của thời gian chạy Android ( android.jar), vì vậy ProGuard cảnh báo rằng một cái gì đó có thể bị hỏng. Nếu bạn chắc chắn rằng ứng dụng của bạn vẫn hoạt động, bạn có thể chỉ định

-dontwarn javax.xml.stream.events.**

Địa ngục ProGuard?


15
Điều đó đã không khắc phục nó cho tôi, tuy nhiên điều này đã làm-dontwarn javax.xml.**
Jeshurun

8
Thêm -libraryjars <java.home>/lib/rt.jarsửa lỗi cho tôi.
Gautam

3
Tôi đã nhận được các cảnh báo bổ sung về ví dụ javax.xml.stream.XMLInputFactory, vì vậy tôi đã sử dụng-dontwarn javax.xml.stream.**
không gian

1
Làm cách nào tôi có thể đặt -dontwarnGUI?
Tomáš Zato - Phục hồi Monica

2
Proguard hell tiếp tục, chỉ cần flay tôi và được thực hiện với nỗi đau này.
Josh


5

Lỗi này xảy ra do các lib bạn sử dụng phụ thuộc vào các lib khác không được sử dụng thực sự, nhưng Proguard đang tìm kiếm chúng.
Thêm các dòng -dontwarn của bạn vào tệp proguard-rules.pro trong dự án Android của bạn để tắt cảnh báo này.

nhập mô tả hình ảnh ở đây

Bạn có thể tìm thấy những phụ thuộc mà bạn cần để thêm vào proguard-rules.pro của bạn trong ngăn xếp lỗi của bạn.


2

Bạn nên bao gồm điều này trong cấu hình Proguard của bạn:

-dontskipnonpubliclibraryclasses

Chà, nó đã làm cho tôi vào thời điểm đó ... ~ 4 năm trước ... mọi thứ có thể đã thay đổi kể từ đó :) Dường như đã làm việc cho ít nhất 2 người khác.
CrackerJack9

Proguard-android.txt mặc định đã có dòng này.
Cristina De Rito

1
@Ultimecia cam kết là từ năm 2013, bài đăng này được thực hiện vào năm 2011
CrackerJack9

2

Khóa ma thuật của tôi đã giải quyết hàng giờ tìm kiếm của tôi: Thêm mã này vào progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Hừm. Đọc cảnh báo đó có vẻ như thư viện bạn đang cố sử dụng có sự phụ thuộc vào javax.xml.stream.events. Tôi không nghĩ rằng không gian tên thực sự được bao gồm trong Android. (Xem Chỉ mục gói ).

Hãy thử triển khai nó cho trình giả lập mà không sử dụng proguard và xem nó có hoạt động không. Tôi đoán là không nếu cảnh báo đó là chính xác.


Xin chào, nếu nó đang làm việc trong trình giả lập mà không có proguard, điều đó có nghĩa là các cảnh báo không chính xác? Tôi đang cố gắng tìm hiểu tại sao tôi lại có những cảnh báo tương tự. Tôi không muốn chỉ đàn áp những cảnh báo.
Michelle Shieh

0

Tôi nghĩ rằng đây là một trường hợp cạnh nhưng trong trường hợp của tôi, tôi đã phải xóa hoàn toàn thư mục xây dựng trên trình bảo vệ Jenkins của tôi đã cố gắng làm việc với mã cũ không còn nữa - chỉ trong trường hợp bất kỳ ai cũng có vấn đề tương tự.


0

Trong trường hợp của tôi, tôi đã không thay đổi bất cứ điều gì và cảnh báo bắt đầu hiển thị. Vấn đề là với bộ đệm gradle bị hỏng. Kiểm tra câu trả lời khác của tôi . Tôi chia sẻ với điều này vì phải mất 2 giờ để tìm ra vấn đề:]


0

Thêm dòng này vào proguard-rules.protệp của bạn trong thư mục tập lệnh gradle:

-dontwarn package.class.name.**

nơi package.class.namelà tên gói với tên lớp của tập tin jar nối.

Ví dụ:

-dontwarn com.myexternalclass.utils.**
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.