修复版AXMLPrinter

2,060 阅读1分钟

网上下载的AXMLPrinter.jar去反编译xml文件时,有时会抛出如下异常:

<?xml version="1.0" encoding="utf-8"?>
java.lang.ArrayIndexOutOfBoundsException: 62	
    at android.content.res.StringBlock.getShort(StringBlock.java:231)	
    at android.content.res.StringBlock.getString(StringBlock.java:91)	
    at android.content.res.AXmlResourceParser.getName(AXmlResourceParser.java:140)	
    at test.AXMLPrinter.main(AXMLPrinter.java:56)

查到网上有个修复的AXMLPrinter.jar,但是csdn上下载要积分,于是自己在网上搜罗了一把。终于搞出来了。

先上传一个解决版的AXMLPrinter.jar包吧:download.csdn.net/download/li…

如果有兴趣如何解决的话,请继续看:

修复版前的AXMLPrinter.jar内的代码存在一些问题,使用jadx-gui工具查看AXMLPrinter.jar内的代码结构:

如何修复AXMLPrinter内部处理逻辑没怎么看,在在这个issue里看到了作者的修正版代码:

github.com/bihe0832/An…

自己本地建了一个工程,将仓库里AXMLPrinter2_zixie这个下面的代码拷贝到自己的工程里。需要注意的是,AXMLPrinter2_zixie这个工程里没有test.AXMLPrinter这个类,这个类的话,直接使用原来的代码就行。(我是在Android Studio中建了一个java module),除了test包下的AXMLPrinter是从旧版的AXMLPrinter.jar中拷贝出来的以外,其他包下的代码都是来自仓库中。

接下来就可以打包了,不过打包前,需要注意的是,AndroidStudio打出来的jar包,其MANIFEST.MF中,没有指定主类,所以在执行以下语句时,会报错没有指定主类。

java -jar AXMLPrinter.jar XX.xml

所以需要在axmlprinter这个java module的build.gradle中如下配置:

apply plugin: 'java-library'
dependencies {    
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

////////////////////////主要是配置这一段代码
jar{    
    manifest.attributes(            
        'Main-Class':"test.AXMLPrinter"    
    )
}
/////////////////////////////////////////

sourceCompatibility = "7"targetCompatibility = "7"

配置完后,这样打出来的jar包,其内部的MANIFEST.MF就会带有执行主类的信息。

如何打包:

分别执行build和jar任务,然后在工程目录里axmlprinter/build/libs下就会生成一个jar包。拿这个jar包再次执行java -jar时,就不会再报错,而且有内容。