Tôi không nghĩ rằng bạn có thể làm điều đó với proguard chỉ và tôi thực sự nghi ngờ có một giải pháp đơn giản (plugin bạn có thể sử dụng) với mvn \ gradle \ sbt \ bất cứ điều gì cho việc này.
Nếu bạn đồng ý với việc chạy mã hoặc lệnh shell trong quá trình xây dựng, tôi có thể giới thiệu cho bạn một số khối xây dựng, vì việc đặt chúng lại với nhau thực sự phụ thuộc vào cách bạn xây dựng dự án của mình. cùng với nhau.
Ý tưởng chung là:
(1) Sử dụng jdeps (một phần của và được phân phối với jdk) để lấy phụ thuộc (bao gồm cả bắc cầu) từ biên soạn .class
file quan tâm.
Trong trường hợp của bạn xuất ra phụ thuộc đệ quy của some.class
(giới hạn root_package
) nên được một cái gì đó như:
jdeps -v -R -e "root_package.*" some.class
(2) lấy jdeps
đầu ra và biến nó thành Proguard config (danh sách các lớp để -keep
) .
(3) Trong tệp cấu hình proguard chính include tệp cấu hình bạn đã tạo trong (2).
Bước (2) yêu cầu hầu hết legwork và có thể được tiếp cận khác nhau.
Đề xuất của tôi là sử dụng bất kỳ khả năng kịch bản nào mà hệ thống xây dựng của bạn phải chạy jdeps
và thực hiện chuyển đổi đầu ra. Ví dụ:
Maven, có plugin that allows groovy scripts to be executed khi tạo.
Nếu bạn cảm thấy thoải mái hơn với chạy kịch bản shell bạn có thể làm như sau:
ống jdeps
đầu ra vào một cái gì đó như:
grep -Po classname_regex
... để giữ chỉ tên lớp bạn muốn giữ lại (bạn có thể sử dụng các xác nhận có độ dài bằng không để xây dựng classname_regex
).
ống đầu ra của grep
vào một cái gì đó như:
awk '{print "-keep class " $0}
... để có được Proguard cấu hình và lưu lượng để nộp.
Nguồn
2017-09-20 21:44:02
Bạn có thể giải thích lý do tại sao bạn cần một mẹo 'tiện lợi' như vậy? Trường hợp sử dụng của bạn là gì? – larsgrefer
@larsgrefer Chắc chắn, tôi đang tạo một công cụ xác minh rằng lớp tôi cần giữ trong proguard có quy tắc proguard đúng. Nó sẽ dễ dàng hơn cho tôi để xác minh sự hiện diện của một quy tắc duy nhất cho một lớp 'A', hơn là tự tìm ra tất cả các lớp được tham chiếu và xác minh sự hiện diện của quy tắc cho tất cả chúng. –
Đây có phải là câu hỏi dành cho Android không? –