前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用proguard混淆java9代码

使用proguard混淆java9代码

作者头像
code4it
发布2018-09-17 16:01:05
2.6K0
发布2018-09-17 16:01:05
举报
文章被收录于专栏:码匠的流水账码匠的流水账

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

maven

代码语言:javascript
复制
            <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

代码语言:javascript
复制
-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

代码语言:javascript
复制
 [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

代码语言:javascript
复制
 [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

代码语言:javascript
复制
 [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引起的

代码语言:javascript
复制
                    <libs>
                        <lib>${java.home}/jmods/java.base.jmod(!**.jar;!module-info.class)</lib>
                    </libs>

可能是该plugin的问题,将其配置移到proguard.cfg就可以

代码语言:javascript
复制
-libraryjars <java.home>/jmods/java.base.jmod(!.jar;!module-info.class)

小结

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

doc

  • libraryjars
  • Proguard injars and libraryjars
  • ProGuard 6.0 beta2 - Unable to run Jar
  • Note: duplicate definition of program/library class
  • Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can’t find referenced class问题的解决方案
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • maven
  • proguard.cfg
  • 问题
    • duplicate class definitions
      • can’t find referenced class
        • Can’t read java.base.jmod
        • 小结
        • doc
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档