简书链接:proguard的Constructorreturningwithoutcallingsuperclassconstructor
文章字数:121,阅读全文大约需要1分钟

1
2
3
4
java.lang.VerifyError: Verifier rejected class xxx: void xxx.<init>() failed to verify: void xxx.<init>(): [0x0] 

Constructor returning without calling superclass constructor (declaration of xxx' appears in /data/app/cn.qssq666.screendetection-2/base.apk)
at xxx.m.Ce.checkEmulatorxxx(Hl)

对比混淆前后

1
2
3
4
5
6
7
8
.method public constructor <init>()V
.locals 0

.line 9
invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

混淆后删除了super()

1
2
3
4
5
# direct methods
.method public constructor <init>()V
.locals 0

return-void

原因是我为了删除日志工具类使用了高级混淆手段assumenosideeffects
而这个东西不能写通配符{*};否则会出现误删,具体看下面的文章

https://sourceforge.net/p/proguard/bugs/716/?limit=25
解决办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-assumenosideeffects class java.io.PrintStream {
public *** println(...);
public *** print(...);
}
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String,int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}


-assumenosideeffects class qssq666.qssqtest.demo.test.Logs {

*** <fields>;
*** <methods>;
public static void writeLog(...);
public static String getLog(...);
public static void clear(...);
public static void writeErrorLog(...);
}
-assumenosideeffects class qssq666.qssqtest.demo.test.BuildConfig{
*** <fields>;
*** <methods>;
}

-assumenosideeffects class cn.qssq666.module.BuildConfig{
*** <fields>;
*** <methods>;
}

通配符改成 *** <fields>; *** <methods>;