proguard的 Constructor returning without calling superclass constructor解决

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)

对比混淆前后

.method public constructor <init>()V
    .locals 0

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

    return-void
.end method

混淆后删除了super()

# direct methods
.method public constructor <init>()V
    .locals 0

    return-void

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

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

  -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>;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容