diff --git a/app/build.gradle b/app/build.gradle index d12b52e7..47077172 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,6 @@ dependencies { compile 'com.squareup.okhttp:okhttp:2.5.0' compile 'com.google.code.gson:gson:2.3.1' compile 'com.android.support:design:25.4.0' - compile 'org.javassist:javassist:3.20.0-GA' + compile 'org.javassist:javassist:3.22.0-GA' compile project(path: ':patch') } \ No newline at end of file diff --git a/auto-patch-plugin/build.gradle b/auto-patch-plugin/build.gradle index 30d13cc2..5b00e098 100644 --- a/auto-patch-plugin/build.gradle +++ b/auto-patch-plugin/build.gradle @@ -8,7 +8,7 @@ dependencies { compile gradleApi() compile localGroovy() compile 'com.android.tools.build:gradle:2.1.0' - compile 'org.javassist:javassist:3.20.0-GA' + compile 'org.javassist:javassist:3.22.0-GA' // compile 'com.meituan.robust:autopatchbase:' + VERSION_NAME compile project(':autopatchbase') } diff --git a/gradle-plugin/build.gradle b/gradle-plugin/build.gradle index 69056f95..5e9645b1 100644 --- a/gradle-plugin/build.gradle +++ b/gradle-plugin/build.gradle @@ -7,7 +7,7 @@ dependencies { compile gradleApi() compile localGroovy() compile 'com.android.tools.build:gradle:2.1.0' - compile 'org.javassist:javassist:3.20.0-GA' + compile 'org.javassist:javassist:3.22.0-GA' compile fileTree(dir: "./src/main/libs", include: ['*.jar']) compile project(':autopatchbase') // compile 'com.meituan.robust:autopatchbase:0.4.93' diff --git a/gradle-plugin/src/main/groovy/robust/gradle/plugin/ConvertUtils.groovy b/gradle-plugin/src/main/groovy/robust/gradle/plugin/ConvertUtils.groovy index 7489957e..3e3e4599 100644 --- a/gradle-plugin/src/main/groovy/robust/gradle/plugin/ConvertUtils.groovy +++ b/gradle-plugin/src/main/groovy/robust/gradle/plugin/ConvertUtils.groovy @@ -12,27 +12,30 @@ import java.util.regex.Matcher * Created by mivanzhang on 16/11/3. */ class ConvertUtils { - static List toCtClasses(Collection inputs, ClassPool classPool) { - List classNames = new ArrayList<>() + static List toCtClasses(List exceptCtClassNameList, Collection inputs, ClassPool directoryClassPool, ClassPool jarClassPool) { + List directoryClassNames = new ArrayList<>() + List jarClassNames = new ArrayList<>() List allClass = new ArrayList<>(); def startTime = System.currentTimeMillis() inputs.each { it.directoryInputs.each { def dirPath = it.file.absolutePath - classPool.insertClassPath(it.file.absolutePath) + directoryClassPool.insertClassPath(it.file.absolutePath) org.apache.commons.io.FileUtils.listFiles(it.file, null, true).each { if (it.absolutePath.endsWith(SdkConstants.DOT_CLASS)) { def className = it.absolutePath.substring(dirPath.length() + 1, it.absolutePath.length() - SdkConstants.DOT_CLASS.length()).replaceAll(Matcher.quoteReplacement(File.separator), '.') - if(classNames.contains(className)){ - throw new RuntimeException("You have duplicate classes with the same name : "+className+" please remove duplicate classes ") + if(!isExceptClassNameClass(exceptCtClassNameList, className)) { + if (directoryClassNames.contains(className)) { + throw new RuntimeException("You have duplicate classes with the same name : " + className + " please remove duplicate classes ") + } + directoryClassNames.add(className) } - classNames.add(className) } } } it.jarInputs.each { - classPool.insertClassPath(it.file.absolutePath) + jarClassPool.insertClassPath(it.file.absolutePath) def jarFile = new JarFile(it.file) Enumeration classes = jarFile.entries(); while (classes.hasMoreElements()) { @@ -40,24 +43,34 @@ class ConvertUtils { String className = libClass.getName(); if (className.endsWith(SdkConstants.DOT_CLASS)) { className = className.substring(0, className.length() - SdkConstants.DOT_CLASS.length()).replaceAll('/', '.') - if(classNames.contains(className)){ - throw new RuntimeException("You have duplicate classes with the same name : "+className+" please remove duplicate classes ") + if(!isExceptClassNameClass(exceptCtClassNameList, className)) { + if (jarClassNames.contains(className) || directoryClassNames.contains(className)) { + throw new RuntimeException("You have duplicate classes with the same name : " + className + " please remove duplicate classes ") + } + jarClassNames.add(className) } - classNames.add(className) } } } } def cost = (System.currentTimeMillis() - startTime) / 1000 println "read all class file cost $cost second" - classNames.each { + directoryClassNames.each { try { - allClass.add(classPool.get(it)); + allClass.add(directoryClassPool.get(it)); } catch (javassist.NotFoundException e) { println "class not found exception class name: $it " } + } + + jarClassNames.each { + try { + allClass.add(jarClassPool.get(it)); + } catch (javassist.NotFoundException e) { + println "class not found exception class name: $it " + } } Collections.sort(allClass, new Comparator() { @@ -69,5 +82,15 @@ class ConvertUtils { return allClass; } + protected static boolean isExceptClassNameClass(List exceptCtClassNameList, String className) { + if(exceptCtClassNameList != null) { + for (String exceptName : exceptCtClassNameList) { + if (className.startsWith(exceptName)) { + return true; + } + } + } + return false; + } } \ No newline at end of file diff --git a/gradle-plugin/src/main/groovy/robust/gradle/plugin/RobustTransform.groovy b/gradle-plugin/src/main/groovy/robust/gradle/plugin/RobustTransform.groovy index f43aeff9..21de9274 100644 --- a/gradle-plugin/src/main/groovy/robust/gradle/plugin/RobustTransform.groovy +++ b/gradle-plugin/src/main/groovy/robust/gradle/plugin/RobustTransform.groovy @@ -25,6 +25,7 @@ class RobustTransform extends Transform implements Plugin { private static List hotfixMethodList = new ArrayList<>(); private static List exceptPackageList = new ArrayList<>(); private static List exceptMethodList = new ArrayList<>(); + private static List exceptCtClassNameList = new ArrayList<>(); private static boolean isHotfixMethodLevel = false; private static boolean isExceptMethodLevel = false; // private static boolean isForceInsert = true; @@ -76,6 +77,7 @@ class RobustTransform extends Transform implements Plugin { hotfixMethodList = new ArrayList<>() exceptPackageList = new ArrayList<>() exceptMethodList = new ArrayList<>() + exceptCtClassNameList = new ArrayList<>() isHotfixMethodLevel = false; isExceptMethodLevel = false; /*对文件进行解析*/ @@ -91,7 +93,9 @@ class RobustTransform extends Transform implements Plugin { for (name in robust.exceptMethod.name) { exceptMethodList.add(name.text()); } - + for(name in robust.exceptCtClassName.name) { + exceptCtClassNameList.add(name.text()); + } if (null != robust.switch.filterMethod && "true".equals(String.valueOf(robust.switch.turnOnHotfixMethod.text()))) { isHotfixMethodLevel = true; } @@ -153,12 +157,18 @@ class RobustTransform extends Transform implements Plugin { jarFile.delete(); } - ClassPool classPool = new ClassPool() + ClassPool directoryClassPool = new ClassPool() + project.android.bootClasspath.each { + directoryClassPool.appendClassPath((String) it.absolutePath) + } + + ClassPool jarClassPool = new ClassPool() project.android.bootClasspath.each { - classPool.appendClassPath((String) it.absolutePath) + jarClassPool.appendClassPath((String) it.absolutePath) } - def box = ConvertUtils.toCtClasses(inputs, classPool) + def box = ConvertUtils.toCtClasses(exceptCtClassNameList, inputs, directoryClassPool, jarClassPool) + def cost = (System.currentTimeMillis() - startTime) / 1000 // logger.quiet "check all class cost $cost second, class count: ${box.size()}" if (useASM) {