summaryrefslogtreecommitdiff
path: root/src/proguard/ConfigurationParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/proguard/ConfigurationParser.java')
-rw-r--r--src/proguard/ConfigurationParser.java171
1 files changed, 94 insertions, 77 deletions
diff --git a/src/proguard/ConfigurationParser.java b/src/proguard/ConfigurationParser.java
index a38e9ed..72949cf 100644
--- a/src/proguard/ConfigurationParser.java
+++ b/src/proguard/ConfigurationParser.java
@@ -2,7 +2,7 @@
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -20,7 +20,7 @@
*/
package proguard;
-import proguard.classfile.ClassConstants;
+import proguard.classfile.*;
import proguard.classfile.util.ClassUtil;
import proguard.util.ListUtil;
@@ -236,7 +236,7 @@ public class ConfigurationParser
private long parseIncludeArgument(long lastModified) throws ParseException, IOException
{
- // Read the configuation file name.
+ // Read the configuration file name.
readNextWord("configuration file name", true, false);
File file = file(nextWord);
@@ -285,7 +285,7 @@ public class ConfigurationParser
ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD.equals(nextWord))
{
// Read all filters in an array.
- List[] filters = new List[5];
+ List[] filters = new List[7];
int counter = 0;
do
@@ -320,6 +320,18 @@ public class ConfigurationParser
if (counter > 0)
{
entry.setZipFilter(filters[--counter]);
+ if (counter > 0)
+ {
+ // For backward compatibility, the apk
+ // filter comes second in the list.
+ entry.setApkFilter(filters[--counter]);
+ if (counter > 0)
+ {
+ // For backward compatibility, the aar
+ // filter comes first in the list.
+ entry.setAarFilter(filters[--counter]);
+ }
+ }
}
}
}
@@ -469,16 +481,17 @@ public class ConfigurationParser
keepClassSpecifications = new ArrayList();
}
- //boolean allowShrinking = false;
- boolean allowOptimization = false;
- boolean allowObfuscation = false;
+ boolean markDescriptorClasses = false;
+ //boolean allowShrinking = false;
+ boolean allowOptimization = false;
+ boolean allowObfuscation = false;
// Read the keep modifiers.
while (true)
{
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
- "', '" + ClassConstants.EXTERNAL_ACC_INTERFACE +
- "', or '" + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+ "', '" + JavaConstants.ACC_INTERFACE +
+ "', or '" + JavaConstants.ACC_ENUM + "'",
false, true);
if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord))
@@ -491,21 +504,26 @@ public class ConfigurationParser
"', '" + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION +
"', or '" + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION + "'");
- if (ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION .startsWith(nextWord))
+ if (ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION.startsWith(nextWord))
{
- allowShrinking = true;
+ markDescriptorClasses = true;
}
- else if (ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION.startsWith(nextWord))
+ else if (ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION .startsWith(nextWord))
{
- allowOptimization = true;
+ allowShrinking = true;
}
- else if (ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION .startsWith(nextWord))
+ else if (ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION .startsWith(nextWord))
{
- allowObfuscation = true;
+ allowOptimization = true;
+ }
+ else if (ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION .startsWith(nextWord))
+ {
+ allowObfuscation = true;
}
else
{
- throw new ParseException("Expecting keyword '" + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION +
+ throw new ParseException("Expecting keyword '" + ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION +
+ "', '" + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION +
"', '" + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION +
"', or '" + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION +
"' before " + reader.locationDescription());
@@ -519,6 +537,7 @@ public class ConfigurationParser
// Create and add the keep configuration.
keepClassSpecifications.add(new KeepClassSpecification(markClasses,
markConditionally,
+ markDescriptorClasses,
allowShrinking,
allowOptimization,
allowObfuscation,
@@ -538,8 +557,8 @@ public class ConfigurationParser
// Read and add the class configuration.
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
- "', '" + ClassConstants.EXTERNAL_ACC_INTERFACE +
- "', or '" + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+ "', '" + JavaConstants.ACC_INTERFACE +
+ "', or '" + JavaConstants.ACC_ENUM + "'",
false, true);
classSpecifications.add(parseClassSpecificationArguments());
@@ -577,25 +596,25 @@ public class ConfigurationParser
// Parse the class access modifiers.
int accessFlag =
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_PUBLIC) ? ClassConstants.INTERNAL_ACC_PUBLIC :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_FINAL) ? ClassConstants.INTERNAL_ACC_FINAL :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE) ? ClassConstants.INTERNAL_ACC_INTERFACE :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT) ? ClassConstants.INTERNAL_ACC_ABSTRACT :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC) ? ClassConstants.INTERNAL_ACC_SYNTHETIC :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_ANNOTATION) ? ClassConstants.INTERNAL_ACC_ANNOTATTION :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_ENUM) ? ClassConstants.INTERNAL_ACC_ENUM :
- unknownAccessFlag();
+ strippedWord.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC :
+ strippedWord.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL :
+ strippedWord.equals(JavaConstants.ACC_INTERFACE) ? ClassConstants.ACC_INTERFACE :
+ strippedWord.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT :
+ strippedWord.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC :
+ strippedWord.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATTION :
+ strippedWord.equals(JavaConstants.ACC_ENUM) ? ClassConstants.ACC_ENUM :
+ unknownAccessFlag();
// Is it an annotation modifier?
- if (accessFlag == ClassConstants.INTERNAL_ACC_ANNOTATTION)
+ if (accessFlag == ClassConstants.ACC_ANNOTATTION)
{
// Already read the next word.
- readNextWord("annotation type or keyword '" + ClassConstants.EXTERNAL_ACC_INTERFACE + "'",
+ readNextWord("annotation type or keyword '" + JavaConstants.ACC_INTERFACE + "'",
false, false);
// Is the next word actually an annotation type?
- if (!nextWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE) &&
- !nextWord.equals(ClassConstants.EXTERNAL_ACC_ENUM) &&
+ if (!nextWord.equals(JavaConstants.ACC_INTERFACE) &&
+ !nextWord.equals(JavaConstants.ACC_ENUM) &&
!nextWord.equals(ConfigurationConstants.CLASS_KEYWORD))
{
// Parse the annotation type.
@@ -628,8 +647,8 @@ public class ConfigurationParser
"' before " + reader.locationDescription());
}
- if (strippedWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE) ||
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_ENUM) ||
+ if (strippedWord.equals(JavaConstants.ACC_INTERFACE) ||
+ strippedWord.equals(JavaConstants.ACC_ENUM) ||
strippedWord.equals(ConfigurationConstants.CLASS_KEYWORD))
{
// The interface or enum keyword. Stop parsing the class flags.
@@ -637,11 +656,11 @@ public class ConfigurationParser
}
// Should we read the next word?
- if (accessFlag != ClassConstants.INTERNAL_ACC_ANNOTATTION)
+ if (accessFlag != ClassConstants.ACC_ANNOTATTION)
{
readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
- "', '" + ClassConstants.EXTERNAL_ACC_INTERFACE +
- "', or '" + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+ "', '" + JavaConstants.ACC_INTERFACE +
+ "', or '" + JavaConstants.ACC_ENUM + "'",
false, true);
}
}
@@ -764,21 +783,21 @@ public class ConfigurationParser
// Parse the class member access modifiers.
int accessFlag =
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_PUBLIC) ? ClassConstants.INTERNAL_ACC_PUBLIC :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_PRIVATE) ? ClassConstants.INTERNAL_ACC_PRIVATE :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_PROTECTED) ? ClassConstants.INTERNAL_ACC_PROTECTED :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_STATIC) ? ClassConstants.INTERNAL_ACC_STATIC :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_FINAL) ? ClassConstants.INTERNAL_ACC_FINAL :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNCHRONIZED) ? ClassConstants.INTERNAL_ACC_SYNCHRONIZED :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_VOLATILE) ? ClassConstants.INTERNAL_ACC_VOLATILE :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_TRANSIENT) ? ClassConstants.INTERNAL_ACC_TRANSIENT :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_BRIDGE) ? ClassConstants.INTERNAL_ACC_BRIDGE :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_VARARGS) ? ClassConstants.INTERNAL_ACC_VARARGS :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_NATIVE) ? ClassConstants.INTERNAL_ACC_NATIVE :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT) ? ClassConstants.INTERNAL_ACC_ABSTRACT :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_STRICT) ? ClassConstants.INTERNAL_ACC_STRICT :
- strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC) ? ClassConstants.INTERNAL_ACC_SYNTHETIC :
- 0;
+ strippedWord.equals(JavaConstants.ACC_PUBLIC) ? ClassConstants.ACC_PUBLIC :
+ strippedWord.equals(JavaConstants.ACC_PRIVATE) ? ClassConstants.ACC_PRIVATE :
+ strippedWord.equals(JavaConstants.ACC_PROTECTED) ? ClassConstants.ACC_PROTECTED :
+ strippedWord.equals(JavaConstants.ACC_STATIC) ? ClassConstants.ACC_STATIC :
+ strippedWord.equals(JavaConstants.ACC_FINAL) ? ClassConstants.ACC_FINAL :
+ strippedWord.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED :
+ strippedWord.equals(JavaConstants.ACC_VOLATILE) ? ClassConstants.ACC_VOLATILE :
+ strippedWord.equals(JavaConstants.ACC_TRANSIENT) ? ClassConstants.ACC_TRANSIENT :
+ strippedWord.equals(JavaConstants.ACC_BRIDGE) ? ClassConstants.ACC_BRIDGE :
+ strippedWord.equals(JavaConstants.ACC_VARARGS) ? ClassConstants.ACC_VARARGS :
+ strippedWord.equals(JavaConstants.ACC_NATIVE) ? ClassConstants.ACC_NATIVE :
+ strippedWord.equals(JavaConstants.ACC_ABSTRACT) ? ClassConstants.ACC_ABSTRACT :
+ strippedWord.equals(JavaConstants.ACC_STRICT) ? ClassConstants.ACC_STRICT :
+ strippedWord.equals(JavaConstants.ACC_SYNTHETIC) ? ClassConstants.ACC_SYNTHETIC :
+ 0;
if (accessFlag == 0)
{
// Not a class member access modifier. Stop parsing them.
@@ -882,7 +901,7 @@ public class ConfigurationParser
{
// This must be a constructor then.
// Make sure the type is a proper constructor name.
- if (!(type.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) ||
+ if (!(type.equals(ClassConstants.METHOD_NAME_INIT) ||
type.equals(externalClassName) ||
type.equals(ClassUtil.externalShortClassName(externalClassName))))
{
@@ -892,8 +911,8 @@ public class ConfigurationParser
}
// Assign the fixed constructor type and name.
- type = ClassConstants.EXTERNAL_TYPE_VOID;
- name = ClassConstants.INTERNAL_METHOD_NAME_INIT;
+ type = JavaConstants.TYPE_VOID;
+ name = ClassConstants.METHOD_NAME_INIT;
}
else
{
@@ -974,22 +993,22 @@ public class ConfigurationParser
/**
* Reads a comma-separated list of java identifiers or of file names.
* Examples of invocation arguments:
- * ("directory n", true, true, false, true, false, true, false, false, ...)
- * ("optimizatio", true, false, false, false, false, false, false, false, ...)
- * ("package nam", true, true, false, false, true, false, true, false, ...)
- * ("attribute n", true, true, false, false, true, false, false, false, ...)
- * ("class name", true, true, false, false, true, false, true, false, ...)
- * ("resource fi", true, true, false, true, false, false, false, false, ...)
- * ("resource fi", true, true, false, true, false, false, false, false, ...)
- * ("class name", true, true, false, false, true, false, true, false, ...)
- * ("class name", true, true, false, false, true, false, true, false, ...)
- * ("filter", true, true, true, true, false, true, false, false, ...)
- * ("annotation ", false, false, false, false, true, false, false, true, ...)
- * ("class name ", true, false, false, false, true, false, false, false, ...)
- * ("annotation ", true, false, false, false, true, false, false, true, ...)
- * ("class name ", false, false, false, false, true, false, false, false, ...)
- * ("annotation ", true, false, false, false, true, false, false, true, ...)
- * ("argument", true, true, true, false, true, false, false, false, ...)
+ * ("directory name", true, true, false, true, false, true, false, false, ...)
+ * ("optimization", true, false, false, false, false, false, false, false, ...)
+ * ("package name", true, true, false, false, true, false, true, false, ...)
+ * ("attribute name", true, true, false, false, true, false, false, false, ...)
+ * ("class name", true, true, false, false, true, false, true, false, ...)
+ * ("resource file", true, true, false, true, false, false, false, false, ...)
+ * ("resource file", true, true, false, true, false, false, false, false, ...)
+ * ("class name", true, true, false, false, true, false, true, false, ...)
+ * ("class name", true, true, false, false, true, false, true, false, ...)
+ * ("filter", true, true, true, true, false, true, false, false, ...)
+ * ("annotation ", false, false, false, false, true, false, false, true, ...)
+ * ("class name ", true, false, false, false, true, false, false, false, ...)
+ * ("annotation ", true, false, false, false, true, false, false, true, ...)
+ * ("class name ", false, false, false, false, true, false, false, false, ...)
+ * ("annotation ", true, false, false, false, true, false, false, true, ...)
+ * ("argument", true, true, true, false, true, false, false, false, ...)
*/
private List parseCommaSeparatedList(String expectedDescription,
boolean readFirstWord,
@@ -1141,9 +1160,7 @@ public class ConfigurationParser
int toIndex = word.indexOf(ConfigurationConstants.CLOSE_SYSTEM_PROPERTY, fromIndex+1);
if (toIndex < 0)
{
- throw new ParseException("Expecting closing '" + ConfigurationConstants.CLOSE_SYSTEM_PROPERTY +
- "' after opening '" + ConfigurationConstants.OPEN_SYSTEM_PROPERTY +
- "' in " + reader.locationDescription());
+ break;
}
String propertyName = word.substring(fromIndex+1, toIndex);
@@ -1154,9 +1171,9 @@ public class ConfigurationParser
"' is undefined in " + reader.locationDescription());
}
- word = word.substring(0, fromIndex) +
- propertyValue +
- word.substring(toIndex+1);
+ word = word.substring(0, fromIndex) + propertyValue + word.substring(toIndex+1);
+
+ fromIndex += propertyValue.length();
}
return word;
@@ -1290,7 +1307,7 @@ public class ConfigurationParser
{
if (((requiredSetMemberAccessFlags |
requiredUnsetMemberAccessFlags) &
- ~ClassConstants.VALID_INTERNAL_ACC_FIELD) != 0)
+ ~ClassConstants.VALID_ACC_FIELD) != 0)
{
throw new ParseException("Invalid method access modifier for field before " +
reader.locationDescription());
@@ -1308,7 +1325,7 @@ public class ConfigurationParser
{
if (((requiredSetMemberAccessFlags |
requiredUnsetMemberAccessFlags) &
- ~ClassConstants.VALID_INTERNAL_ACC_METHOD) != 0)
+ ~ClassConstants.VALID_ACC_METHOD) != 0)
{
throw new ParseException("Invalid field access modifier for method before " +
reader.locationDescription());