这与最近的这些问题类似:
用于减小大小的最佳Java混淆应用程序 创建非反向可执行的Java程序
但是,最终会推荐yGuard和另一个ProGuard,但两者都没有提及.我想知道我们是否可以对每一个进行比较,并听取围栏两侧人们的经历.在ProGuard网站上查看这个比较图表,它明显倾向于ProGuard.但是每个人的实际经验呢?哪一个产生较小的输出?哪一个更难反编译?每个支持哪些Java版本?
就个人而言,我对J2ME的观点特别感兴趣,但请不要将讨论局限于此.
我目前正在开发自己的Java库,以便在我办公室的其他应用程序中使用,我正在探索模糊库本身的方法.
我正在使用Eclipse Indigo,并且正在使用yGuard v2.3.0.1.
首先,我的Java代码:
package com.test.ObfuscateTest;
public class MainClass {
private String secretClassVariable;
public static void main(String[] args) {
}
protected void SecretMethod(String secretParameter) {
secretClassVariable = secretParameter;
}
}
Run Code Online (Sandbox Code Playgroud)
使用带有以下ANT脚本的yGuard,给我一个空的JAR文件:
<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="yguard" basedir=".">
<target name="init">
<property name="project_name" value="ObfuscateTest"/>
<property name="srcDir" value="."/>
<property name="classDir" value="classes"/>
<property name="jar" value="${project_name}.jar"/>
<property name="obfjar" value="${project_name}_obf.jar"/>
<property name="renamelog" value="${project_name}_renamelog.xml"/>
<property name="shrinklog" value="${project_name}_shrinklog.xml"/>
<property name="mainclass" value="com.test.ObfuscateTest"/>
<mkdir dir="${classDir}" />
</target>
<target depends="jar" name="yguard">
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="/Users/foo/Desktop/yguard-2.3.0.1/lib/yguard.jar"/>
<!-- the following can …
Run Code Online (Sandbox Code Playgroud) 我的项目使用 yGuard 在 Gradle 中混淆 Java 代码。
我有一个正在用 Gson 序列化的类和枚举包。
每个枚举值都有一个@SerializedName
注释,例如:
package com.package.whatever;
import com.google.gson.annotations.SerializedName;
public enum Enum1 {
@SerializedName("item1")
item1,
@SerializedName("item2")
item2,
;
}
Run Code Online (Sandbox Code Playgroud)
我已经在 gradle 上配置了 yguard 以停止混淆所在包上的类Enum1
,如下所示:
ant.yguard() {
inoutpair(in: shadowJar.outputs.files.singleFile, out:
"${buildDir}/libs/${shadowJar.archiveName}")
rename(logfile: "${buildDir}/libs/yguard.log.xml", replaceClassNameStrings: 'true') {
keep {
'class'(classes: 'public', methods: 'public') {
patternset {
include(name: 'com.package.whatever.*')
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将停止对com.package.whatever
包内类中的方法进行混淆,但这并没有阻止在枚举值中发生混淆。
生成的yguard.log.xml
文件最终具有如下记录:
<field class="com.package.whatever.Enum1" name="item1" map="D"/>
<field class="com.package.whatever.Enum1" name="item2" map="E"/>
Run Code Online (Sandbox Code Playgroud)
如何避免这种混淆并导致 yguard 跳过枚举值?
我正在将项目构建从 ANT 移植到 Gradle。除了混淆部分外,一切都已完成,混淆任务如下build.xml
:
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="${ant.yguard.path}"/>
<target name="obfuscate-no-test" depends="no-test-jar">
<yguard>
<inoutpairs>
<fileset dir="${dir.dist}">
<include name="**/*.jar"/>
<exclude name="**/*_obf.jar"/>
<exclude name="**/*-doc.jar"/>
</fileset>
</inoutpairs>
<externalclasses>
<path refid="path.lib.biz"/>
<path refid="path.lib.share"/>
<path refid="path.lib.web"/>
</externalclasses>
<rename logfile="${rename.log}">
<property name="naming-scheme" value="best"/>
<keep>
<class classes="none" fields="none" methods="none">
<patternset>
<include name="com.payeshgaran.framework.internal.**.*"/>
</patternset>
</class>
<class classes="public" fields="protected" methods="protected">
<patternset>
<include name="com.payeshgaran.framework.**.*"/>
<exclude name="com.payeshgaran.framework.internal.**.*"/>
</patternset>
</class>
</keep>
<adjust replacecontent="true">
<include name="META-INF/*.tld"/>
</adjust>
</rename>
</yguard>
</target>
Run Code Online (Sandbox Code Playgroud)
为了将其移植到 gradle,我这样做了:
task obfuscate(dependsOn: [":ext:build", ":biz:build", ":web:build"]) {
ant.taskdef(name: "yguard",
classname: "com.yworks.yguard.YGuardTask", …
Run Code Online (Sandbox Code Playgroud)