diff options
9 files changed, 20 insertions, 131 deletions
@@ -47,8 +47,8 @@ java_library_host { java_resource_dirs: ["res"], static_libs: [ - "asm-9.2", - "asm-commons-9.2", + "asm-6.0", + "asm-commons-6.0", ], libs: [ diff --git a/src/android/com/android/jarjar/RemoveAndroidCompatAnnotationsJarTransformer.java b/src/android/com/android/jarjar/RemoveAndroidCompatAnnotationsJarTransformer.java index f9e5e14..990e048 100644 --- a/src/android/com/android/jarjar/RemoveAndroidCompatAnnotationsJarTransformer.java +++ b/src/android/com/android/jarjar/RemoveAndroidCompatAnnotationsJarTransformer.java @@ -51,7 +51,7 @@ public final class RemoveAndroidCompatAnnotationsJarTransformer extends JarTrans private boolean isClassRemapped; AnnotationRemover(ClassVisitor cv) { - super(Opcodes.ASM7, cv); + super(Opcodes.ASM6, cv); } @Override @@ -74,7 +74,7 @@ public final class RemoveAndroidCompatAnnotationsJarTransformer extends JarTrans Object value) { FieldVisitor superVisitor = super.visitField(access, name, descriptor, signature, value); - return new FieldVisitor(Opcodes.ASM7, superVisitor) { + return new FieldVisitor(Opcodes.ASM6, superVisitor) { @Override public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { return visitAnnotationCommon(descriptor, @@ -89,7 +89,7 @@ public final class RemoveAndroidCompatAnnotationsJarTransformer extends JarTrans String signature, String[] exceptions) { MethodVisitor superVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); - return new MethodVisitor(Opcodes.ASM7, superVisitor) { + return new MethodVisitor(Opcodes.ASM6, superVisitor) { @Override public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { return visitAnnotationCommon(descriptor, diff --git a/src/main/com/tonicsystems/jarjar/EmptyClassVisitor.java b/src/main/com/tonicsystems/jarjar/EmptyClassVisitor.java index c7614a1..7a758fe 100644 --- a/src/main/com/tonicsystems/jarjar/EmptyClassVisitor.java +++ b/src/main/com/tonicsystems/jarjar/EmptyClassVisitor.java @@ -28,23 +28,23 @@ import org.objectweb.asm.Opcodes; public class EmptyClassVisitor extends ClassVisitor { public EmptyClassVisitor() { - super(Opcodes.ASM7); + super(Opcodes.ASM6); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - return new MethodVisitor(Opcodes.ASM7) {}; + return new MethodVisitor(Opcodes.ASM6) {}; } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - return new AnnotationVisitor(Opcodes.ASM7) {}; + return new AnnotationVisitor(Opcodes.ASM6) {}; } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - return new FieldVisitor(Opcodes.ASM7) {}; + return new FieldVisitor(Opcodes.ASM6) {}; } } diff --git a/src/main/com/tonicsystems/jarjar/PackageRemapper.java b/src/main/com/tonicsystems/jarjar/PackageRemapper.java index e281f24..4d102be 100644 --- a/src/main/com/tonicsystems/jarjar/PackageRemapper.java +++ b/src/main/com/tonicsystems/jarjar/PackageRemapper.java @@ -16,6 +16,7 @@ package com.tonicsystems.jarjar; +import org.objectweb.asm.*; import org.objectweb.asm.commons.*; import java.util.*; import java.util.regex.Pattern; @@ -27,7 +28,7 @@ class PackageRemapper extends Remapper private static final Pattern ARRAY_FOR_NAME_PATTERN = Pattern.compile("\\[L[\\p{javaJavaIdentifierPart}\\.]+?;"); - private final WildcardTrie wildcards; + private final List<Wildcard> wildcards; private final Map<String, String> typeCache = new HashMap<String, String>(); private final Map<String, String> pathCache = new HashMap<String, String>(); private final Map<Object, String> valueCache = new HashMap<Object, String>(); @@ -35,7 +36,7 @@ class PackageRemapper extends Remapper public PackageRemapper(List<Rule> ruleList, boolean verbose) { this.verbose = verbose; - wildcards = new WildcardTrie(PatternElement.createWildcards(ruleList)); + wildcards = PatternElement.createWildcards(ruleList); } // also used by KeepProcessor @@ -117,7 +118,7 @@ class PackageRemapper extends Remapper } private String replaceHelper(String value) { - for (Wildcard wildcard : wildcards.getPossibleMatches(value)) { + for (Wildcard wildcard : wildcards) { String test = wildcard.replace(value); if (test != null) return test; diff --git a/src/main/com/tonicsystems/jarjar/PatternElement.java b/src/main/com/tonicsystems/jarjar/PatternElement.java index 6b852d7..6ccd9ea 100644 --- a/src/main/com/tonicsystems/jarjar/PatternElement.java +++ b/src/main/com/tonicsystems/jarjar/PatternElement.java @@ -32,14 +32,12 @@ abstract public class PatternElement static List<Wildcard> createWildcards(List<? extends PatternElement> patterns) { List<Wildcard> wildcards = new ArrayList<Wildcard>(); - int ruleIndex = 0; for (PatternElement pattern : patterns) { String result = (pattern instanceof Rule) ? ((Rule)pattern).getResult() : ""; String expr = pattern.getPattern(); if (expr.indexOf('/') >= 0) throw new IllegalArgumentException("Patterns cannot contain slashes"); - wildcards.add(new Wildcard(expr.replace('.', '/'), result, ruleIndex)); - ruleIndex++; + wildcards.add(new Wildcard(expr.replace('.', '/'), result)); } return wildcards; } diff --git a/src/main/com/tonicsystems/jarjar/StringReader.java b/src/main/com/tonicsystems/jarjar/StringReader.java index 164b0a2..5bb719c 100644 --- a/src/main/com/tonicsystems/jarjar/StringReader.java +++ b/src/main/com/tonicsystems/jarjar/StringReader.java @@ -24,7 +24,7 @@ abstract class StringReader extends ClassVisitor private String className; public StringReader() { - super(Opcodes.ASM7); + super(Opcodes.ASM6); } abstract public void visitString(String className, String value, int line); @@ -42,7 +42,7 @@ abstract class StringReader extends ClassVisitor public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { handleObject(value); - return new FieldVisitor(Opcodes.ASM7){ + return new FieldVisitor(Opcodes.ASM6){ @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return StringReader.this.visitAnnotation(desc, visible); @@ -52,7 +52,7 @@ abstract class StringReader extends ClassVisitor @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - return new AnnotationVisitor(Opcodes.ASM7) { + return new AnnotationVisitor(Opcodes.ASM6) { @Override public void visit(String name, Object value) { handleObject(value); @@ -71,7 +71,7 @@ abstract class StringReader extends ClassVisitor @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor mv = new MethodVisitor(Opcodes.ASM7){ + MethodVisitor mv = new MethodVisitor(Opcodes.ASM6){ @Override public void visitLdcInsn(Object cst) { handleObject(cst); diff --git a/src/main/com/tonicsystems/jarjar/Wildcard.java b/src/main/com/tonicsystems/jarjar/Wildcard.java index c92e0fb..5cc486f 100644 --- a/src/main/com/tonicsystems/jarjar/Wildcard.java +++ b/src/main/com/tonicsystems/jarjar/Wildcard.java @@ -27,18 +27,14 @@ class Wildcard private static Pattern star = Pattern.compile("\\*"); private static Pattern estar = Pattern.compile("\\+\\??\\)\\Z"); private static Pattern dollar = Pattern.compile("\\$"); - // Apart from stars and dollar signs, wildcards are plain-text full matches - private static Pattern plainTextPrefixPattern = Pattern.compile("^[^*$]*"); private final Pattern pattern; - private final String plainTextPrefix; - private final int ruleIndex; private final int count; private final ArrayList<Object> parts = new ArrayList<Object>(16); // kept for debugging private final String[] strings; private final int[] refs; - public Wildcard(String pattern, String result, int ruleIndex) { + public Wildcard(String pattern, String result) { if (pattern.equals("**")) throw new IllegalArgumentException("'**' is not a valid pattern"); if (!checkIdentifierChars(pattern, "/*")) @@ -51,13 +47,6 @@ class Wildcard regex = replaceAllLiteral(star, regex, "([^/]+)"); regex = replaceAllLiteral(estar, regex, "*)"); regex = replaceAllLiteral(dollar, regex, "\\$"); - Matcher prefixMatcher = plainTextPrefixPattern.matcher(pattern); - // prefixMatcher will always match, but may match an empty string - if (!prefixMatcher.find()) { - throw new IllegalArgumentException(plainTextPrefixPattern + " not found in " + pattern); - } - this.plainTextPrefix = prefixMatcher.group(); - this.ruleIndex = ruleIndex; this.pattern = Pattern.compile("\\A" + regex + "\\Z"); this.count = this.pattern.matcher("foo").groupCount(); @@ -106,14 +95,6 @@ class Wildcard // System.err.println(this); } - public String getPlainTextPrefix() { - return plainTextPrefix; - } - - public int getRuleIndex() { - return ruleIndex; - } - public boolean matches(String value) { return getMatcher(value) != null; } diff --git a/src/main/com/tonicsystems/jarjar/WildcardTrie.java b/src/main/com/tonicsystems/jarjar/WildcardTrie.java deleted file mode 100644 index e80dbc9..0000000 --- a/src/main/com/tonicsystems/jarjar/WildcardTrie.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.tonicsystems.jarjar; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.TreeMap; - -/** - * A prefix trie of {@link Wildcard}, where the prefix is obtained from - * {@link Wildcard#getPlainTextPrefix()}. - * - * This allows quick lookup of applicable wildcards in the common case where wildcards have a - * non-empty plain-text prefix. - */ -public class WildcardTrie { - private final TreeMap<String, WildcardTrie> subTries = new TreeMap<>(); - private final List<Wildcard> wildcards = new ArrayList<>(); - private final String prefix; - - public WildcardTrie(List<Wildcard> wildcards) { - this(""); - final ArrayList<Wildcard> lst = new ArrayList<>(wildcards); - // Sort values to ensure that wildcards that prefix others are added first - lst.sort(Comparator.comparing(Wildcard::getPlainTextPrefix)); - for (Wildcard w : lst) { - final String prefix = w.getPlainTextPrefix(); - final WildcardTrie prefixTrie = findSubTrieWhichPrefixes(prefix, this); - if (prefixTrie.prefix.equals(prefix)) { - prefixTrie.wildcards.add(w); - } else { - final WildcardTrie newTrie = new WildcardTrie(prefix); - newTrie.wildcards.add(w); - prefixTrie.subTries.put(prefix, newTrie); - } - } - } - - private WildcardTrie(String prefix) { - this.prefix = prefix; - } - - private static WildcardTrie findSubTrieWhichPrefixes(String value, WildcardTrie baseTrie) { - final String possiblePrefix = baseTrie.subTries.floorKey(value); - // Because each level of the trie does not contain keys that are prefixes of each other, - // there can be at most one prefix of the value at that level, and that prefix will be the - // highest key ordered before the value (any non-prefix key would have a character - // difference with the prefix and so be ordered before the prefix or after the value). - if (possiblePrefix != null && value.startsWith(possiblePrefix)) { - return findSubTrieWhichPrefixes(value, baseTrie.subTries.get(possiblePrefix)); - } - return baseTrie; - } - - public List<Wildcard> getPossibleMatches(String value) { - WildcardTrie baseTrie = this; - List<Wildcard> prefixMatches = wildcards.isEmpty() - // If there's no match, don't even allocate a list and use the singleton emptyList - ? Collections.emptyList() : new ArrayList<>(wildcards); - while (true) { - final String possiblePrefix = baseTrie.subTries.floorKey(value); - if (possiblePrefix != null && value.startsWith(possiblePrefix)) { - baseTrie = baseTrie.subTries.get(possiblePrefix); - if (prefixMatches.isEmpty()) { - prefixMatches = new ArrayList<>(baseTrie.wildcards); - } else { - prefixMatches.addAll(baseTrie.wildcards); - } - } else { - prefixMatches.sort(Comparator.comparing(Wildcard::getRuleIndex)); - return prefixMatches; - } - } - } -} diff --git a/src/main/com/tonicsystems/jarjar/util/GetNameClassWriter.java b/src/main/com/tonicsystems/jarjar/util/GetNameClassWriter.java index db6ec4f..966ac82 100644 --- a/src/main/com/tonicsystems/jarjar/util/GetNameClassWriter.java +++ b/src/main/com/tonicsystems/jarjar/util/GetNameClassWriter.java @@ -25,7 +25,7 @@ public class GetNameClassWriter extends ClassVisitor private String className; public GetNameClassWriter(int flags) { - super(Opcodes.ASM7,new ClassWriter(flags)); + super(Opcodes.ASM6,new ClassWriter(flags)); } public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { |