2015-03-19 23 views
0

我使用proguard對我的代碼進行了模糊處理。在代碼中,我想用以下代碼從指定的包中讀取所有類。Proguard在ZipEntry中不保留包層次結構

URL directoryURL = Thread.currentThread().getContextClassLoader() 
      .getResource("com/test/ui/controller"); 

此代碼不起作用,因爲proguard創建的jar不會保留包層次結構。我寫了一個從混淆jar中讀取條目的代碼。這是輸出。 看到類包沒有保存在zip文件中。所以getResource()不起作用。

COM /測試/ UI /控制器/的A.class

COM /測試/ UI /控制器/ c.class

COM /測試/ UI /控制器/ b.class

COM /test/ui/controller/d.class

當我用unobfuscated jar運行相同的代碼時,這裏輸出。包級別保存在jar中。你有什麼想法可以告訴Proguard通過保持包級別來創建jar。

COM/

COM /測試/

COM /測試/ UI/

COM /測試/ UI /控制器/

COM /測試/ UI /控制器/一個。類

COM /測試/ UI /控制器/ c.class

COM /測試/ UI /控制器/ b.class

COM /測試/ UI /控制器/ d.class

回答

0

-keepdirectories解決我的問題。

指定要保留在輸出罐(或罐, 戰爭,耳朵,拉鍊,apks或目錄)的目錄。默認情況下,刪除目錄條目 。這會減小jar的大小,但如果代碼嘗試使用類似 「mypackage.MyClass.class.getResource(」「)」的結構查找它們,可能會破壞程序 。然後,您將要保留 與包「-keepdirectories mypackage」對應的目錄。如果該選項未指定過濾器,則保留所有 目錄。使用過濾器時,只有匹配的目錄保留爲 。例如,「-keepdirectories mydirectory」與 指定的目錄匹配,「-keepdirectories mydirectory/*」匹配其 直接子目錄,「-keepdirectories mydirectory/**」 匹配其所有子目錄。

0

-keeppackagenames [package_filter]

指定不混淆給定的包名稱。可選過濾器是包名稱的逗號分隔列表。包名稱可以包含?,*和**通配符,它​​們可以在前面加上! negator。只有在混淆時才適用。

(來源:http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions

+0

如您所見,包名已保存。所以我們可以看到com/test/ui/controller/a.class。問題在這裏,它只是把類級放到ZipEntry中。 – user725455 2015-03-19 11:16:00