消除混淆文件不适用于此异常

时间:2019-05-23 23:03:53

标签: android obfuscation deobfuscation r8

我将反混淆文件上传到了控制台,但是...反混淆文件似乎在此异常下无法正常工作。我使用新的R8系统而不是proguard来混淆代码,因为我使用的是最后一个android studio,但这在proguard之前也发生过。我在Google Play开发者控制台中看到以下文字,可以看到很多例外情况:

java.lang.NullPointerException: 
  at com.myapp.Util.capitalize (Util.java)
  or                     .clearRAM (Util.java)
  or                     .firstCharToUpperCase (Util.java)
  or                     .formatSize (Util.java)
  or                     .getBenchmarkResultsMap (Util.java)
  or                     .getColorFromStyle (Util.java)
  or                     .getLocaleStringResource (Util.java)
  or                     .getStringList (Util.java)
  or                     .goToAppSettingsDialog (Util.java)
  or                     .persistInt (Util.java)
  or                     .persistString (Util.java)
  or                     .persistStringArrayList (Util.java)
  or                     .sendEmail (Util.java)
  or                     .share (Util.java)
  at com.myapp.SystemInfoHelper.getExternalSdCardTotalSize (SystemInfoHelper.java)
  or                     .getFormattedExternalSdCardSize (SystemInfoHelper.java)
  at com.myapp.SystemInfoStringBuilder.getSystemSummaryList (SystemInfoStringBuilder.java)
  at com.myapp.activities.MainActivity$5$1.run (MainActivity.java)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:145)
  at android.app.ActivityThread.main (ActivityThread.java:6134)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1399)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194)
  at de.robv.android.xposed.XposedBridge.main (XposedBridge.java:95)

如您所见,它没有告诉问题出在哪行或函数上,而是告诉了“ at,or,at,or”,而没有弄清楚崩溃在哪里。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

从元数据中删除行号时,堆栈跟踪将不包括它们,这会使查看问题发生的位置更加困难。您可以将--keepattributes LineNumberTable添加到R8配置中以保留它们。

不幸的是,这对您目前的状况没有帮助。 在这种情况下,我建议从以下开始:

com.myapp.SystemInfoStringBuilder.getSystemSummaryList

并确定是否调用:

com.myapp.SystemInfoHelper.getExternalSdCardTotalSize

com.myapp.SystemInfoHelper.getFormattedExternalSdCardSize

如果同时调用这两者(基于它可能使用的名称),则下一步将变得更加繁琐。

从该方法确定调用com.myapp.Util的哪些方法。 请注意,您还可以通过调查代码以确定它们是否确实会抛出NullPointerException来消除com.myapp.Util方法的某些长列表。

最后一个选择是用Kotlin进行编码,因为它将强制您明确地在给定变量或参数上允许使用空值。