2017-09-18 22 views
6

Giả sử tôi có cấu trúc:Proguard, tiếp tục mọi tầng lớp tham chiếu

import some.other.Clazz; 

public class A { 

    Clazz clazz; 
    B b; 

    public class B { 
     C c; 
     //... 
    } 

    public static class C { 
     //... 
    } 
} 

Có một số Proguard lừa tiện lợi mà sẽ cho phép tôi để đệ quykeep mọi tầng lớp được sử dụng bởi lớp học của tôi A? Vì vậy, cũng có tất cả các lớp được tham chiếu nội bộ theo số B, CClazz?

+0

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

+0

@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. –

+0

Đây có phải là câu hỏi dành cho Android không? –

Trả lời

2

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:

  1. ố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).

  2. ố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.

+1

Nó không phải là hoàn hảo nhưng tôi có thể làm việc với 'jdeps' (trong đó sự tồn tại mà tôi không biết trước đây). Cảm ơn –

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