2017-09-18 75 views
6

假設我有結構:Proguard的,讓所有引用的類

import some.other.Clazz; 

public class A { 

    Clazz clazz; 
    B b; 

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

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

有一些漂亮的proguard的技巧,可以讓我遞歸keep由我A類使用的所有類?所以也所有類由BCClazz內部參考?

+0

你能解釋爲什麼你需要這樣一個'漂亮的技巧'嗎?你的用例是什麼? – larsgrefer

+0

@larsgrefer當然,我正在創建一個工具來驗證我需要保留在proguard中的類有正確的proguard規則。對於我來說,驗證類「A」的單個規則的存在比手動找出所有引用的類並驗證所有類的規則存在更容易。 –

+0

這是一個android問題嗎? –

回答

2

我不認爲你只能做到這一點與proguard的,我真懷疑有一個簡單的解決方案(插件,您可以使用)與MVN \ gradle這個\ SBT \不管這個。

如果您在構建過程中運行代碼或shell命令時可以使用,我可以推薦一些構建塊,但由於將它們放在一起真的取決於您如何構建項目,因此我只能提供關於如何粘合它們的基本建議一起。


的總體思路是:

(1)使用jdeps(的一部分,並與JDK分佈)來從利益編譯.class文件的依賴關係(包括傳遞)。

在你的情況下,輸出的some.class遞歸的依賴關係(僅限於root_package)應該是這樣的:

jdeps -v -R -e "root_package.*" some.class 

(2)jdeps輸出,並將其轉化爲ProGuard配置文件(類列表-keep) 。 (3)

(3)在你的main proguard配置文件中,你在(2)中生成的配置文件爲include


步驟(2)需要大多數工作並且可以以不同方式接近。

我的建議是使用任何腳本功能構建系統具有運行jdeps,做輸出的轉變。

Maven的,例如,具有生成過程中plugin that allows groovy scripts to be executed

如果您更舒適的運行shell腳本,你可以做到以下幾點:

  1. jdeps輸出成類似:

    grep -Po classname_regex

    ...只保留類名你想保留(可以使用零長度斷言建立classname_regex)。

  2. grep管道輸出到類似:

    awk '{print "-keep class " $0}

    ...讓ProGuard配置文件,並保存輸出到文件。

+1

這並不完美,但我可能能夠使用'jdeps'(我以前不知道它的存在)。謝謝 –

相關問題