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.希望大家遇到問題不要着急,一步步來,總會解決的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章