首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

代码搅混器Proguard源码分析(一) 读取

2013-10-31 
代码混淆器Proguard源码分析(一) 读取????????????????????????? ClassUtil.externalClassName(programCla

代码混淆器Proguard源码分析(一) 读取
????????????????????????? ClassUtil.externalClassName(programClass.getName()) + "]");
??? }


??? public void visitLibraryClass(LibraryClass libraryClass)
??? {
??????? notePrinter.print(libraryClass.getName(),
????????????????????????? "Note: duplicate definition of library class [" +
????????????????????????? ClassUtil.externalClassName(libraryClass.getName()) + "]");
??? }

回到最初的位置,JarReader读入文件返回给ClassReader class数据,class数据被ClassReader接受到以后并不直接被解析,而是通过访问者访问,这个访问者可以是ProgramClassReader和LibClassReader也可以是他们的包装类。ClassReader在这里的角色更像是个代理,在ClassReader.read()方法里面区分不同的class类型

用不同的Reader来访问它

?if (isLibrary)
??????????? {
??????????????? clazz = new LibraryClass();
??????????????? clazz.accept(new LibraryClassReader(dataInputStream, skipNonPublicLibraryClasses, skipNonPublicLibraryClassMembers));
??????????? } else {
??????????????? clazz = new ProgramClass();
??????????????? clazz.accept(new ProgramClassReader(dataInputStream));
??????????? }

更像一个控制器。

好的读入程序class文件的代码就暂时结束,接下来自然是读取lib的字节码

?readInput("Reading library ",
????????????????????? configuration.libraryJars,
????????????????????? new ClassFilter(
????????????????????? new ClassReader(true,
????????????????????????????????????? configuration.skipNonPublicLibraryClasses,
????????????????????????????????????? configuration.skipNonPublicLibraryClassMembers,
????????????????????????????????????? warningPrinter,
????????????????????? new ClassPresenceFilter(programClassPool, duplicateClassPrinter,
????????????????????? new ClassPresenceFilter(libraryClassPool, duplicateClassPrinter,
????????????????????? new ClassPoolFiller(libraryClassPool))))));

libraryJars由libraryjars 参数来指定,在Proguard里面常常要用到rt.jar但是rt.jar里面有很多多余的class。前面我们提到过Classpath可以指定文件目录期间用递归的方式来解析。如果你是优化高手,可以解压以后删除多余的class以增加lib的载入速度。

?

readInput的参数可能不那么好解,没关系,我们一步步的来拆解它。就像罗升阳说的那样,read the fuck source
!

依旧到最底层,是一个new ClassPoolFiller(libraryClassPool) 这个类很明显是为了加入池子而设计的,然后在外面包装了个去重的操作类ClassPresenceFilter,但是我们惊讶的发现又在外面包装了ClassPresenceFilter这个类,其实目的很明显是为了去掉programClassPool和libraryClassPool中的可能重复类避免最终生成两个字节码。这里要强调一点,不论是那种类,一般情况下是被Lib或者Program的解析类处理完成以后才被其他的访问者访问,代码在ClassReader中,其他的访问这被作为classVisitor的参数来访问。

好了,到这里差不多读入类操作完成了,我们来看下我们的结果,结果就是读入了class文件放在了

programClassPool, libraryClassPool这两个池子中

?

?

?

?

?

?

?

热点排行