- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
“maven-plugin”项目(使用 maven-plugin-plugin)的生成输出 JAR 被 Proguard 执行的混淆破坏了工具。尝试将混淆的 JAR 用作 Maven 插件会生成异常,例如 MojoExecutionException ,这会以错误方式终止构建。允许生成包含自动生成的插件描述符的工作“maven-plugin”JAR 的正确 Proguard 配置选项是什么?
最佳答案
Maven 插件和 Proguard 工具的基础知识
为了生成一个 Maven 插件(maven 打包类型 "maven-plugin",它生成一个包含插件特定配置资源的 JAR)我们必须指示 maven-plugin-plugin关于我们 Mojos 的位置和名称。假设正确配置了 maven-plugin-plugin 执行,using annotations或其他配置选项,生成的 JAR 将在 JAR 根目录的 META-INF 目录中包含一个 plugin.xml 文件。该 plugin.xml 文件使用对 Java 类和包名称的静态引用来描述插件的目标和可配置参数(您可以在此文件 here 上找到更多信息)。
必须特别注意将混淆合并到“maven-plugin”JAR 的构建中;在这里,我们解释了使用 Proguard obfuscation library 所采取的步骤。 .使用 default Proguard configuration for library obfuscation 时,生成的 JAR 将不再正常工作,因为 Proguard 为 Maven 插件重命名、缩小、重新定位和混淆重要文件。尝试使用您的插件可能会导致异常终止构建,并出现与 Maven 运行时无法定位和处理插件的配置和类文件相关的错误。
但是,通过一些重新配置,我们可以指示 Proguard 正确维护生成的插件文件和“maven-plugin”JAR 的目录结构。 Proguard 选项的必要更改如下(请参阅有关以下链接的说明):
自定义 Proguard 配置
目录结构
-keepdirectories
-keepdirectories
这指示 Proguard 维护输入 JAR 目录结构,而不是将所有文件移动到根目录。 Maven 期望 plugin.xml 文件位于/META-INF/maven/目录中,该目录通过此选项与所有其他目录一起保留。您可以通过指定目录过滤器来更具体地过滤保留的目录,但是我选择不加选择地维护所有输入目录结构。
-keeppackagenames
-keeppackagenames org.apache.maven.plugin.my.MyMojo
您应该将占位符包替换为包含您的 Mojo 定义的包。如果您的 Mojo 定义不共享一个公共(public)包,您应该根据需要使用多个选项指定每个唯一的包。如果您不确定需要保留哪些包,请在文本编辑器中打开您生成的 plugin.xml 文件并检查每个“mojo”定义中的“implementation”元素。 “implementation”元素通过一个完全限定的名称来指定一个类。这些完全限定类名的每个包组件都是您应该指定的包。例如,我的 basedir-plugin 包含一个 Mojo 实现元素值“com.github.emabrey.maven.plugins.basedir.RootDirectoryGoal”,所以我将选项写为
-keeppackagenames com.github.emabrey.maven.plugins.basedir
.
-keepnames
-keepnames class * implements org.apache.maven.plugin.AbstractMojo
此选项可防止 Proguard 重命名包含 Maven 插件 Mojo 实现的类。如果这些类被重命名,上述“实现”元素将不再正确识别包含 Mojo 实现的类。
-keepclassmembers
-keepclassmembers class * implements org.apache.maven.plugin.AbstractMojo {
private <fields>;
private <methods>;
}
此选项可防止 Proguard 重命名插件 Mojo 实现中的类级别方法和字段。 Maven 使用这些类字段/方法的名称来生成插件的配置元素。如果 Proguard 重命名字段,Maven 执行环境将无法使用用户配置正确填充 Mojo 实现。
<!-- Configures Proguard obfuscation tool to generate an
obfuscated version of the JAR file that replaces the
default unobfuscated JAR.
-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.13</version>
<executions>
<execution>
<id>obfuscation-packaging</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
<configuration>
<proguardVersion>${tool.proguard.version}</proguardVersion>
<obfuscate>true</obfuscate>
<attach>true</attach>
<appendClassifier>false</appendClassifier>
<addMavenDescriptor>true</addMavenDescriptor>
<injar>${project.build.finalName}.jar</injar>
<injarNotExistsSkip>true</injarNotExistsSkip>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<options>
<option>-keepdirectories</option>
<option>-keeppackagenames org.apache.maven.plugin.my.MyMojo</option>
<option>-keepnames class * implements org.apache.maven.plugin.AbstractMojo</option>
<option>-keepclassmembers class * implements org.apache.maven.plugin.AbstractMojo {
private <![CDATA[<fields>]]>;
private <![CDATA[<methods>]]>;
}
</option>
<option>-keepparameternames</option>
<option>-renamesourcefileattribute SourceFile</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
</option>
<option>-target 1.8</option>
<option>-keep public class * {
public protected *;
}
</option>
<option>-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
</option>
<option>-keepclasseswithmembernames,includedescriptorclasses class * {
native <![CDATA[<methods>]]>;
}
</option>
<option>-keepclassmembers,allowoptimization enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
</option>
<option>-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
</option>
</options>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>${tool.proguard.version}</version>
</dependency>
</dependencies>
</plugin>
${tool.proguard.version}
是
com.github.wvengen:proguard-maven-plugin
截至 2017 年 3 月,直到进行此编辑。我将保留原始配置,版本号
2.0.14
因为版本
2.0.13
包含潜在的破坏性更改。它现在包含种子和 map 文件,作为最终 Proguard 混淆 Artifact 的输出 Artifact 的一部分。大多数用例实际上不太可能在使用 Artifact 中的其他文件时出现任何问题,而是忍者编辑配置以指向
2.0.14
。 ,我将留下这个笔记,让您评估哪个版本适合您的项目。也就是说,只需将版本更改为
2.0.14
应该没问题,因为版本
<version>2.0.14</version>
的提交历史记录中没有注意到插件配置更改.
关于java - 在构建 "maven-plugin"包时如何使用 Proguard 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706466/
https://www.guardsquare.com/en/proguard/manual/optimizations说 class/unboxing/enum Simplifies enum ty
我想使用 ProGuard 重命名变量和函数。我希望生成的类文件在所有方面都与源 jar 相同,除了名称。有没有办法做到这一点? 我尝试使用 dontoptimize 和 dontshrink 无效。
例如,这条规则在 proguard 中意味着什么: -keep class myjava.** {*;} 我理解 {*;} 部分意味着类中的所有成员和方法。但是包名中的 2 个星号是什么意思? 提前致
我有一个即将使用 ProGuard 混淆的库。 “图书馆模式”几乎适用于我的用例,即保留所有公共(public)和 protected 类和类成员几乎没问题。 然而,由于 Java 的可见性要求,一些
在我的 Playstore 中,我注意到去混淆后的代码包含相当多的 在堆栈跟踪中。 (例如 at .onAttach(ProfileLandingFragment.java) )。 有什么用真正意思?
我收到了一封来自 Google 的关于 unsafe implementation of TrustManager 的电子邮件唯一的线索是有问题的代码在 com.b.a.af 类中。显然,这是混淆的名
我读自 http://proguard.sourceforge.net/manual/usage.html关于assumenosideeffects的使用。我的问题涉及以下段落: -assumenos
什么是智能 ProGuard 配置来混淆特定类 com.acme.Algorithm 的私有(private)方法和常量? 我想对此进行混淆,因为它包含一个算法,当意外打开 .jar 时,该算法不应该
最近将 Pushwoosh 库集成到我的 Android 应用程序中。它运作良好。但是在导出为签名应用程序时遇到以下错误。请帮忙。提前致谢。 Proguard returned with error
有没有人有使用ProGuard的经验是否已经有超出类加载时间的应用程序性能测量? 我有一个相当复杂的应用程序,可能需要改进,但为 ProGuard 准备它需要几天时间,所以我想先听听一些意见。 最佳答
当我尝试使用 android studio 3.2 canary 17 构建应用程序包时,我收到以下错误消息。我不知道我所有的 proguard 文件中缺少什么角括号,一切似乎都很好,并且在旧版本的
我遇到了 proguard 的问题,我刚刚配置了 Bugsense 并且使用了它们的配置建议,我在 google 和 stackoverflow 上进行了搜索,通常 ppl 可以在控制台中看到该行或问
我第一次尝试使用 Proguard,我收到此错误,有人可以帮我吗?谢谢 [2014-09-03 11:44:58 - P - Photos] Proguard returned with error
当我收到此错误时,我正在尝试导出启用了 proguard 的 android 应用程序:- Proguard returned with error code 1. See console pro
看起来有两个用于运行 ProGuard 的 SBT 插件。任何人都可以谈谈他们的相对优势和劣势吗?我还没有在网上找到比较。 xsbt-proguard-plugin - https://github.
Proguard 会条纹 kotlin.Unit 独立对象(在 Kotlin 运行时库中),如果您使用此类型,则会导致编译错误。以下规则无助于保留此元素(可能是因为 Unit 不是一个类,它是一个对象
构建 Android 发行版 apk 时,Smack 4.1 的正确 ProGuard 规则是什么? 目前,我正在使用 aSmack github 存储库上 README.asmack 文件中的 aS
尝试使用 Proguard Maven 插件时出现 OutOfMemoryErrors。我尝试通过将 MAVEN_OPTS 环境变量设置为 -Xmx2g 来为 Maven 分配更多内存,但这没有任何区
我有一个 pom.xml 文件如下。当我运行 mvn clean install 时,出现错误 [proguard] Error: Can't read [C:\Program Files\Java\
我已经将支持库从 v22.2.1 更新到 v23.0.0,在构建应用程序后(使用 minifyEnabled true)我有“AppCompat 不支持当前主题功能”异常: 08-23 05:46:1
我是一名优秀的程序员,十分优秀!