diff options
Diffstat (limited to 'src/proguard/ConfigurationParser.java')
-rw-r--r-- | src/proguard/ConfigurationParser.java | 171 |
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()); |