Proguard不会在ZipEntry中保留包层次结构

时间:2015-03-19 08:14:47

标签: java jar proguard

我使用proguard混淆了我的代码。在代码中,我想用以下代码读取指定包中的所有类。

    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 /测试/ UI /控制器/ d.class

当我使用未经模糊处理的jar运行相同的代码时,这里是输出。包装级别保存在jar中。您是否知道如何通过保持包装级别告诉Proguard创建jar。

COM /

COM /测试/

COM /测试/ UI /

COM /测试/ UI /控制器/

COM /测试/ UI /控制器/的A.class

COM /测试/ UI /控制器/ c.class

COM /测试/ UI /控制器/ b.class

COM /测试/ UI /控制器/ d.class

2 个答案:

答案 0 :(得分:0)

  

-keeppackagenames [package_filter]

     

指定不混淆给定的包名称。可选过滤器是以逗号分隔的包名列表。包名称可以   包含?,*和**通配符,它​​们之前可以包含!   否定器。仅在混淆时适用。

(资料来源:http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions

答案 1 :(得分:0)

-keepdirectories解决了我的问题。

  

指定要保存在输出jar中的目录(或aars,   战争,耳朵,拉链,apks或目录)。默认情况下,目录条目   被删除。这会减少jar的大小,但它可能会破坏你的程序   如果代码试图用类似的结构找到它们   “mypackage.MyClass.class.getResource(” “)”。那你就想保留   与包对应的目录,“-keepdirectories   mypackage“。如果指定选项没有过滤器,全部   目录保存。使用过滤器,只有匹配的目录   保持。例如,“-keepdirectories mydirectory”匹配   指定的目录,“-keepdirectories mydirectory / *”匹配它   直接子目录,和“-keepdirectories mydirectory / **”   匹配其所有子目录。