Làm thế nào để giữ / loại trừ một đường dẫn gói cụ thể khi sử dụng proguard?


110

Tôi muốn loại trừ một số đường dẫn tệp khỏi ProGuard. Thí dụcom.myapp.customcomponents

Tôi có thể làm cái này như thế nào? Tôi ghét đặt cờ -keep cho mọi tệp thành phần tùy chỉnh mà tôi có trong thư mục này.

Tôi đã thử những cách sau nhưng không hiệu quả:

-keep public class com.myapp.customcomponents.*

Câu trả lời:


241

Bạn không chỉ định nó không hoạt động theo cách nào. Cấu hình của bạn giữ tên của tất cả các lớp công khai trong gói được chỉ định:

-keep public class com.myapp.customcomponents.*

Cấu hình sau giữ tên của tất cả các lớp công khai trong gói được chỉ định và các gói con của nó:

-keep public class com.myapp.customcomponents.**

Cấu hình sau giữ tên của tất cả các lớp / trường / phương thức công khai / được bảo vệ trong gói được chỉ định và các gói con của nó:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
Dấu hoa thị kép (**) không biên dịch nữa (Android Studio 4.0)
Daniel

Android Studio 4.x sẽ hiển thị các lỗi như "Tên lớp chưa được giải quyết", v.v. cho dấu hoa thị kép (**), nhưng nó sẽ hoạt động như mong đợi.
Mahmudul Hasan Shohag

55

Thêm dòng sau vào cuối cấu hình ProGuard của bạn:

-keep class com.facebook.** { *; }

Thay thế tên gói cho phù hợp, ở đây gói com.facebooksẽ bị loại trừ khỏi ProGuard.


13
tại sao giữ và sử dụng dontwarn cùng
Jongz Puangput

@Jongz Puangput, nếu tôi đúng - nếu ứng dụng không sử dụng gói com.facebook, thì trên bản dựng sẽ được hiển thị ghi chú "cấu hình đề cập đến lớp không xác định ...". -không báo trước vô hiệu hóa ghi chú này.
Yura Shinkarev

14
những gì hiện { *; }có nghĩa là?
Muhammad Babar

15
@MuhammadBabar tôi có nghĩa là mọi thành viên, phương thức, lớp trong mọi phạm vi, nói tóm lại là mọi thứ!
Omar El Don

1

Nhiều người dường như đề xuất -keep class com.myapp.customcomponents.** { *; }như một cách để loại trừ một đường dẫn đang được xử lý. Xem tại đây:

  1. loại trừ các gói khỏi proguard
  2. Làm cho Proguard hoàn toàn bỏ qua gói
  3. Ngăn chặn một thư mục khỏi sự xáo trộn proguard

Vấn đề với giải pháp này là vẫn có một số mức độ xáo trộn xảy ra, có thể phá vỡ mã của bạn. Bạn có thể thấy ánh xạ trong bản in bản đồ:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

Giải pháp tôi đã chọn là một quy trình hai bước. Đầu tiên, sử dụng injarsvới một bộ lọc để chọn đường dẫn gói mà tôi muốn xử lý. Có thể thêm các gói khác làm thư viện.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

Thứ hai, hợp nhất jar đã xử lý với jar ban đầu, nhưng chỉ những đường dẫn đã bị bỏ qua.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

Kết quả là một jar hợp nhất là sự kết hợp của đường dẫn gói đã xử lý và các đường dẫn bị bỏ qua. Bài tập này không hợp lệ, nếu ai đó có thể cung cấp một cách để bỏ qua hoàn toàn việc xử lý các đường dẫn nhất định (mà tôi chưa tìm thấy).


1

Những gì hiệu quả với tôi khi sử dụng Android Studio 4.0 là:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Dấu hoa thị kép (**) trong các câu trả lời khác không phù hợp với tôi. Tôi cũng đã thử cấu hình trên với R8, hoạt động tốt.


câu trả lời này là câu trả lời cập nhật nhất mà tôi nghĩ. cảm ơn bạn.
Gogo-the-Cat
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.