使用proguard混淆java9代码

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了使用proguard混淆java9代码脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

本文主要研究一下如何使用PRoGuard混淆java9代码

maven

            <plugin>                 <groupId>com.github.wvengen</groupId>                 <artifactId>proguard-maven-plugin</artifactId>                 <executions>                     <execution>                         <phase>package</phase>                         <goals><goal>proguard</goal></goals>                     </execution>                 </executions>                 <configuration>                     <proguardVersion>6.0.1</proguardVersion>                     <injar>${project.build.finalName}.jar</injar>                     <outjar>${project.build.finalName}.jar</outjar>                     <inFilter>!META-INF/maven/**,!module-info.class</inFilter>                     <obfuscate>true</obfuscate>                     <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>                     <libs>                         <lib>${java.home}/jmods/java.base.jmod(!**.jar;!module-info.class)</lib>                     </libs>                 </configuration>                 <dependencies>                     <dependency>                         <groupId>net.sf.proguard</groupId>                         <artifactId>proguard-base</artifactId>                         <version>6.0.1</version>                         <scope>runtime</scope>                     </dependency>                 </dependencies>             </plugin>
这里使用6.0.1版本的proguard-base

proguard.cfg

-target 9 -dontshrink -dontoptimize -useuniqueclassmembernames -adaptclassstrings -dontusemixedcaseclassnames -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod -keepclasseswithmembers public class * { public static void main(java.lang.String[]);}
这里target要指定为9版本

问题

duplicate class definitions

 [proguard] Warning: class [META-INF/versions/9/org/apache/logging/log4j/util/ProcessIdUtil.class] unexpectedly contains class [org.apache.logging.log4j.util.ProcessIdUtil]  [proguard] Reading library jar [/Users/demo/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar]  [proguard] Reading library jar [/Users/demo/.m2/repository/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar]  [proguard] Note: duplicate definition of library class [org.apache.logging.log4j.util.ProcessIdUtil]  [proguard] Note: duplicate definition of library class [org.apache.logging.log4j.util.StackLocator]  [proguard] Reading library jar [/Users/demo/.m2/repository/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar]  [proguard] Reading library jar [/Users/demo/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar]  [proguard] Warning: class [META-INF/versions/9/org/apache/logging/log4j/util/StackLocator.class] unexpectedly contains class [org.apache.logging.log4j.util.StackLocator]   [proguard] Note: there were 2 duplicate class definitions.  [proguard]       (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)  [proguard] Warning: there were 2 classes in incorrectly named files.  [proguard]          You should make sure all file names correspond to their class names.  [proguard]          The directory hierarchies must correspond to the package hierarchies.  [proguard]          (http://proguard.sourceforge.net/manual/troubleshooting.html#unexpectedclass)  [proguard]          If you don't mind the mentioned classes not being written out,  [proguard]          you could try your luck using the '-ignorewarnings' option.  [proguard] Error: Please correct the above warnings first. 
如果没有使用到log4j的话,可以在progurard.cfg文件中配置dontwarn忽略

can't find referenced class

 [proguard] Warning: cn.example.Demo: can't find referenced class java.io.ByteArrayOutputStream  [proguard] Warning: there were 858 unresolved references to classes or interfaces.  [proguard]          You may need to add missing library jars or update their versions.  [proguard]          If your code works fine without the missing classes, you can supPress  [proguard]          the warnings with '-dontwarn' options.  [proguard]          (http://proguard.sourceforge.net/manual/troubleshooting.htML#unresolvedclass)  [proguard] Warning: there were 1 unresolved references to library class members.  [proguard]          You probably need to update the library versions.  [proguard]          (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)  [proguard] Error: Please correct the above warnings First.
这种多是没有配置好libraryjars的问题,比如这里就是没有配置java.base.jmod的问题。如果还依赖有其他jmod,可以根据具体日志修改配置。

Can't read java.base.jmod

 [proguard] Reading library directory [/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods/java.base.jmod(!**.jar;!module-info.class)]  [proguard] Error: Can't read [/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods/java.base.jmod(!**.jar;!module-info.class)] (No such file or directory: /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods/java.base.jmod(!**.jar;!module-info.class))
这个是在maven的pom文件配置lib引起的
                    <libs>                         <lib>${java.home}/jmods/java.base.jmod(!**.jar;!module-info.class)</lib>                     </libs>
可能是该plugin的问题,将其配置移到proguard.cfg就可以
-libraryjars <java.home>/jmods/java.base.jmod(!.jar;!module-info.class)

小结

这里的例子仅仅还是jdk是模块化的,但是工程代码还没有模块化。等所有依赖都模块化了,可以重新试验一下。

doc

脚本宝典总结

以上是脚本宝典为你收集整理的使用proguard混淆java9代码全部内容,希望文章能够帮你解决使用proguard混淆java9代码所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。