yGuard 2.5.2 Release Notes
Contents of the yGuard distribution
LICENSE.html |
yGuard Software License |
3rdPartyLicenses/ |
3rd Party Licenses:
|
README.html |
this file |
doc/ |
documentation:
|
lib/ |
ant task library:
- yguard.jar
- ObfuscationAnnotation.jar
|
Please read the documentation for
installation instructions.
Technical requirements
yGuard requires Java2 SDK 1.4.x or greater and Ant 1.5 or greater installed on your system.
It may work with earlier versions of these pieces of software as well, however this has not
been tested thoroughly. yGuard 1.3.x and upwards works together with Ant 1.6.
yGuard works well with JDK 1.6 and Ant 1.7.
Java 7 Compatibilty
With Java 7, the Java class file version number changed, because the invokedynamic
instruction was introduced.
However, the JDK 7 does not contain any means of issuing this instruction.
The invokedynamic
instruction is currently generated only by compilers for other (dynamic) languages (such as JRuby),
or using third-party bytecode transformation tools.
Therefore, yGuard can handle class files that have been compiled for Java 7 and supports the
invokedynamic
instruction in the obfuscation process, but does not support shrinking of class files
that contain this instruction, yet.
This means that although yGuard does not fully support all features of the Java 7 class file format,
there should not be any issues using this yGuard release with a Java application that targets Java 7.
Changelog
yGuard 2.5.2 - Changes since 2.5.1
-
Added support for renaming
META-INF/services
entries if the
entry corresponds to a type that is obfuscated.
-
Fixed a bug that caused the stacktrace deobfuscation tool to ignore class
name mappings that started with one or more $ characters.
yGuard 2.5.1 - Changes since 2.5
- Fixed broken binary class file of the attached com.yworks.util.annotation.Obfuscation annotation in
ObfuscationAnnotation.jar
.
yGuard 2.5 - Changes since 2.4.0.1
- Added support for controlling obfuscation exclusion via annotations.
- Improved Java 7 support. yGuard does now support
invokedynamic
in the obfuscation process.
yGuard 2.4.0.1 - Changes since 2.4
- Fixed a regexp that could cause yGuard to parse manifest files for a very long time.
yGuard 2.4 - Changes since 2.3.0.1
- Added basic Java 7 class file support (see the note on Java 7 compatibility).
- Fixed a bug that caused yGuard to introduce invalid signatures for typed classes with inner classes.
- Fixed a bug that caused yGuard to erroneously exclude all classes from obfuscation when an
implements
attribute
was used for a <class>
element without an additional name
or expose
attribute.
- Fixed a bug that caused the shrinker to ignore the
attribute
element if the default
shrinking settings were used (i.e. if no keep
element was defined).
yGuard 2.3.0.1 - Changes since 2.3.0
- Fixed a bug that caused the shrinker to remove the static initializer of a non-static inner class,
when only fields of the inner class were referenced (e.g. compiler-generated switch map tables for enums).
yGuard 2.3.0 - Changes since 2.2.0
- yGuard won't try to initialize external classes needed for resolving anymore.
- The default behavior of the shrinker was changed to keep any referenced runtime visible annotation and parameter annotation attributes.
- The shrinker will now correctly adhere to the "lineNumberTable", "runtimeVisibleParameterAnnotations" etc.
attributes of the <keep> element.
- Fixed a bug that caused the shrinker to remove the enclosing method of anonymous inner classes
declared as entry points.
- Fixed a bug that caused the shrinker to remove referenced Annotation elements from Annotation interfaces.
- yGuard now won't rename or remove the package-info class.
- Fixed possible "Illegal group reference" Exception in yGuard's parse tool.
- The shrinker will now keep classes that are used as field types of
referenced fields.
- The shrinker will now correctly keep method attributes of methods that are kept as stubs.
yGuard 2.2.0 - Changes since 2.1.0
- yGuard is now fully JDK-1.6 compatible.
- The yGuard task now supports a way of specifying a set of jars that should be obfuscated at the same time
using simple patternset syntax.
- yGuard now uses the same technique for all elements in the MANIFEST file to adjust fully qualified class name strings.
- It is now possible to tell yGuard not to obfuscate specific package names.
- yGuard can now be given a list of digest algorithms that will be used to create the digests in the manifest.
- yGuard now issues a warning if the package or class or method name of a native method is obfuscated.
yGuard 2.1.0 - Changes since 2.0.3
- Fixed a bug that caused yGuard to throw a NullPointerException if a
attribute
element contained no nested patternset
. -
- Fixed a bug that caused yGuard to use multiple logging instances if a yGuard task was executed multiple times.
- Fixed LineNumberTable and SourceFile elements
- Added overloadEnabled property
yGuard 2.0.3 - Changes since 2.0.2
- Fixed a bug that broke the nested
map
element of the rename
element.
yGuard 2.0.2 - Changes since 2.0.1
- Fixed a bug that caused yGuard to fail during class file parsing if a method signature contained an inner class of a parameterized class.
- yGuard will not complain about the Java 1.5 attributes
Bridge
, Enum
and Varargs
as 'unknown attributes' anymore.
- Fixed a bug that caused all classnames to be kept from renaming if the
extends
attribute was used in combination with the classes
attribute.
yGuard 2.0.1 - Changes since 2.0
- Fixed an inconsistency between the interpretation of the Ant syntax in the
rename
and shrink
elements. Now, both elements apply patternset
elements in nested method
and field
elements to class names, just as stated in the yGuard documentation.
- If the
classes
attribute of the class
element is not set or set to "none", the shrinking engine will now include the classes that match based on the given name
attribute or nested patternset
, effectively ignoring the classes
attribute.
yGuard 2.0 - Changes since 1.5.0_03
- New elaborate code shrinking functionality.
- More powerful ant syntax:
extends
/implements
attributes for the class
element.
- General Ant syntax changes due to the introduction of the new
yguard
,shrink
and rename
elements.
- yGuard now needs Java2 SDK 1.4.x or greater to function properly.
yGuard 1.5.0_03 - Changes since 1.5.0_02
-
Fixed bad treatment of the new enclosing method feature in Tiger which sometimes led to AbstractMethodErrors at runtime.
yGuard 1.5.0_02 - Changes since 1.5.0_01
-
Improved obfuscation logic for enumerations. Now the two static methods valueOf(String) and values() don't have to be exposed manually anymore.
-
Fixed bad annotation handling for non-trivial annotations. Annotations had not been parsed and handled correctly, which could lead to either
errors during obfuscation or Errors at runtime.
yGuard 1.5.0_01 - Changes since 1.5
-
Fixed a bug that made yGuard ignore some of the attributes in the expose section ("sourcefile" and "linenumbertable").
-
Fixed a rare but severe bug that accidentally removed method attributes and sometimes led to ArrayIndexOutOfBoundsExceptions
during the obfuscation.
yGuard 1.5 - Changes since 1.3.2
-
Added JDK 1.5 (a.k.a Java 5.0 code-named Tiger) compatibility. yGuard can now deal correctly with the
new JDK and Java features: generics, var-args, enumerations, annotations, new "
.class
" bytecode construct,
signatures, local variable type table, enclosing method information.
-
Implemented the ability to obfuscate/scramble/shrink line number information. This makes it possible to more easily debug
stacktraces without exposing line number information in the obfuscated version of the application.
-
Implemented the ability to obfuscate the source file information. This is necessary in order to view line number information
in stack traces. It is now possible to reassign the source file attribute inside class files so that the original source file
name is not exposed in the obfuscated application.
-
Added the ability to determine on a per-class basis what attributes to expose or obfuscate. This includes line number
information (with optional scrambling/compression or removal), source file attributes, deprecation attributes, etc.
This makes it easy to obfuscate parts of your application while keeping the public API untouched and debug information
for third party jars intact.
-
Improved the stacktrace deobfuscation tool. It can now unscramble line number information from stacktraces, features a
more polished view of the mapping rules and deobfuscates stacktraces more reliably if the stacktraces are ambiguous.
yGuard 1.3.2 - Changes since 1.3.1_01
-
Improved name generation. yGuard will now generate legal identifiers
(with respect to
Character.isJavaIdentifierStart()
and Character.isJavaIdentifierPart(char)
and
Character.isIdentifierIgnorable(char)
) and should
therefor produce jars that should verify correctly even on older jdks
if yGuard is run using newer jdks.
-
yGuard now helps in the detection of duplicate class files in source jars.
In pedantic mode yGuard will terminate if duplicate classes are detected
in different source jars. yGuard's obfuscate task will always fail if mutliple
class files containing a definition for the same jar are detected. The log file
displays useful information for finding the duplicate entries.
-
Improved xml log file output for Unicode characters.
-
Made the log file viewer output more consistent with inner class names that
were being mapped during obfuscation versus those who remained fixed.
-
Jar file entries are now being sorted prior to being written to the jar.
-
Improved handling of external classes.
-
Bugfixes:
- Fixed a name clash problem that occurred when already obfuscated code
was being obfuscated again using different settings.
-
Fixed a resolution problem concerning interfaces from external classpaths.
yGuard 1.3.1_01 - Changes since 1.3.1
-
yGuard now treats the COMPATIBLE flag for the language conformity different.
Field names and class names are now made up of lower ascii-only chars.
-
Bugfixes:
- Fixed a problem concerning the
adjust
elements throwing
a RuntimeException
in the pattern matching code.
-
Fixed a problem where the wrong set of files was affected in the
adjust
section.
yGuard 1.3.1 - Changes since 1.3
-
yGuard will now generate (empty) directory entries in the resulting jar files for each non-empty directory.
-
Improved the optional keeping of "Deprecated" tags. Somehow they still seem to get lost under certain conditions.
Any feedback on this topic is welcomed.
-
Due to a compile time dependency, yGuard could not be used with jdk 1.3.x anymore even if the automatic
resource adjustment feature was not used. This has now been made possible again.
-
Bugfixes:
- Fixed a rare problem that broke obfuscated code using static method
invocations and static field references.
-
There was a bug in the log file viewer (
java -jar yguard.jar [logfile.xml[.gz]]
) that made it crash
under very rare circumstances.
-
Implemented a workaround for an Ant incompatibility problem, which resulted in yGuard behaving differently on
different platforms and in conjunction with different Ant versions.
yGuard 1.3 - Changes since 1.2
-
Added automatic text file and property file renaming mechanism. yGuard can
now be configured to rename .properties files according to the obfuscation.
-
It is now possible to process text files and replace occurances
of class names with their obfuscated versions.
-
One can now specify whether resource files should be kept in their original
directory while at the same time the classes residing in the respective
directory can be fully obfuscated to another package.
-
yGuard can now automatically create gzipped (.gz) logfiles and work directly
on compressed logfiles. This reduces the size of the logfiles drastically.
-
It is now possible to simply specify a list of attributes, that should not be
removed by yGuard (for example "
Deprecated
") using the
expose-attributes
property.
-
yGuard has a new name generation method (
language-conformity
= compatible
),
that creates jar file that can be successfully unzipped to the windows
filesystem.
-
In order to avoid namespace clashes, on can now easily specify a prefix
for completeley obfuscated package hierarchies using the
obfuscation-prefix
property.
-
Enhanced documentation (DTD, examples, and new features description).
-
Bugfixes:
- Innerclasses making use of the .class construct should now always be
correctly obfuscated using the replaceClassNameStrings feature.
-
The
patch
element had a bug concerning field name mappings,
which is now resolved.
-
yGuard now tests whether a newly obfuscated name already exists in external
jars and automatically generates names, that should not clash.
-
yGuard should now work together with Ant version 1.6 (there was an undocumented change in the API of Ant).
yGuard 1.2 - Changes since 1.1
yGuard 1.1 - Changes since 1.0.1
-
Added support for different naming schemes. These schemes result in smaller
jar files, better obfuscation and lead to jar files,
which cannot be unpacked to normal filesystems.
-
Fixed two JBuilder incompatibilities. Innerclasses created by JBuilder do
not prevent yGuard from working anymore and (correct) innerclasses created
by yGuard do not crash JBuilder anymore (which btw. is a bug in JB).
-
Implemented a fix for the problem, where the
ClassName.class
code construct prevented classes from being obfuscated entirely.
-
yGuard can now automatically obfuscate code of the form
Class.forName("com.mycompany.myapp.MyClass");
so that these classes can now be obfuscated by name, too.
-
Improved the serialization of the obfuscation map to the xml file, which can
now be parsed back in by the included tool even for complicated naming
schemes.
-
Refactored the creation of the final jar files. The current implementation
leads to more standard conform jar files.
-
Fixed two bugs concerning the handling of manifest files.
-
Fixed a bug concerning the handling of the Main-Class attribute of manifest
files.
Changes since 1.0
-
Implemented more robust handling of Manifest files. Implementation now makes
use of java.util.jar.Manifest.
-
The Main-Class attribute of the Manifest files will now be translated to the
obfuscated name, if the main class is not exposed.
-
The conserveManifest attribute of the obfuscate task now conserves the
manifest in a better way.