Android项目混淆问题 Unknown verification type [48] in stack map frame

近期在打包Android工程的时候遇到了混淆问题,不混淆的情况下怎么样都是好的,混淆时候打包就有问题,报错如下:

[2018-09-19 13:14:49 - zplugin] Caused by: java.lang.RuntimeException: Unknown verification type [48] in stack map frame
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.createVerificationType(ProgramClassReader.java:1324)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.visitFullFrame(ProgramClassReader.java:896)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.attribute.preverification.FullFrame.accept(FullFrame.java:114)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.visitStackMapTableAttribute(ProgramClassReader.java:674)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.attribute.preverification.StackMapTableAttribute.accept(StackMapTableAttribute.java:71)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.visitCodeAttribute(ProgramClassReader.java:644)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:141)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.visitProgramMethod(ProgramClassReader.java:213)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:155)
[2018-09-19 13:14:49 - zplugin] 	at proguard.classfile.ProgramClass.accept(ProgramClass.java:430)
[2018-09-19 13:14:49 - zplugin] 	at proguard.io.ClassReader.read(ClassReader.java:91)

然后发现是sdk\tools\proguard\lib文件夹下proguard.jar中的一个类报了错,看了下proguard的源码,发现压根就没有type=48的,源码如下:

public static final int TOP_TYPE                = 0;
public static final int INTEGER_TYPE            = 1;
public static final int FLOAT_TYPE              = 2;
public static final int DOUBLE_TYPE             = 3;
public static final int LONG_TYPE               = 4;
public static final int NULL_TYPE               = 5;
public static final int UNINITIALIZED_THIS_TYPE = 6;
public static final int OBJECT_TYPE             = 7;
public static final int UNINITIALIZED_TYPE      = 8;

private VerificationType createVerificationType()
{
	int u1tag = dataInput.readUnsignedByte();

	switch (u1tag)
	{
		case VerificationType.INTEGER_TYPE:            return new IntegerType();
		case VerificationType.FLOAT_TYPE:              return new FloatType();
		case VerificationType.LONG_TYPE:               return new LongType();
		case VerificationType.DOUBLE_TYPE:             return new DoubleType();
		case VerificationType.TOP_TYPE:                return new TopType();
		case VerificationType.OBJECT_TYPE:             return new ObjectType();
		case VerificationType.NULL_TYPE:               return new NullType();
		case VerificationType.UNINITIALIZED_TYPE:      return new UninitializedType();
		case VerificationType.UNINITIALIZED_THIS_TYPE: return new UninitializedThisType();

		default: throw new RuntimeException("Unknown verification type ["+u1tag+"] in stack map frame");
	}
}

然后我去官网下载了一个最新的proguard工具,最新版本已经更新到6.0.3,看了下里面的源码,发现即使是最新的依旧也没有type = 48,看来只能按照网上老铁们提出来的修改proguard.classfile.ClassConstants中的ATTR_StackMapTable字段的值,将其从StackMapTable修改为dummy,如下图:

 然后我从6.0.3版本中拔出了源码,准备重新打包一个proguard.jar替换进去,应该就好了。在此之前我意图从proguard4.7的版本中重新打一个proguard.jar替换进去,因为我本地就是4.7的,最后发现不行,看来确实要最新的才行。

剩下就是打包源码的步骤了,因为我本地有fat_jar插件,所以打包一个jar包还是挺简单的,打包的时候发现源码中有地方报错,发现想要打包还需要引入ant.jar才行,然后我本地搜了一下,一般有使用过ant工具的都会有的,不过这个jar包只需要引用就行,不需要编译到proguard.jar包中。

不过使用fat_jar的时候,有个地方需要注意,需要设置一下主类才行:

 打包完成,重新编译打包项目发现还是不行,说是ProGuardTask找不到

BUILD FAILED
G:\adt-bundle\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140
702\sdk\tools\ant\build.xml:828: taskdef class proguard.ant.ProGuardTask cannot
be found
 using the classloader AntClassLoader[G:\adt-bundle\adt-bundle-windows-x86_64-20
140702\adt-bundle-windows-x86_64-20140702\sdk\tools\proguard\lib\proguard.jar]

找了之后,发现这部分源码被放到了另外一个地方,直接拿过来,包名路径放置正确,再次打包,果然可以了。

参考资料:

1.https://blog.csdn.net/xh2009cn/article/details/41012889

2.官方网站:https://sourceforge.net/projects/proguard/ 

3.下面附上修改过的jar包,你们可以替换下试试,有问题可以一起看看

链接:https://pan.baidu.com/s/15vqZ2S6hxQi2RP1BtSd-qw 密码:x9f0

4.希望大家遇到问题不要着急,一步步来,总会解决的

发布了15 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/HeartCircle/article/details/82840308