我使用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
答案 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 / **” 匹配其所有子目录。