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.希望大家遇到问题不要着急,一步步来,总会解决的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值