【问题标题】:java.lang.VerifyError on an obfuscated Android library混淆的 Android 库上的 java.lang.VerifyError
【发布时间】:2019-09-23 07:16:27
【问题描述】:

对于较少数量的设备,我们遇到了一个奇怪的异常,显然该类由于某个方法而未验证。不幸的是,我们无法在我们的设备上重现这一点,并且堆栈跟踪来自 Fabric。

堆栈跟踪如下:

Fatal Exception: java.lang.VerifyError: Verifier rejected class com.example.library.-$$Lambda$d$QOXAMJpwehT8fF2Hmjjy5XM7Qx4: void com.example.library.-$$Lambda$d$QOXAMJpwehT8fF2Hmjjy5XM7Qx4.run(): [0xFFFFFFFF] wide register index out of range (15+1 >= 10) (declaration of 'com.example.library.-$$Lambda$d$QOXAMJpwehT8fF2Hmjjy5XM7Qx4' appears in /data/app/com.example.myapp-1/base.apk)
   at com.example.library.MyLibrary.initialize + 317(MyLibrary.java:317)
   at com.example.myapp.MyApp.onCreate + 152(MyApp.java:152)
   at android.app.Instrumentation.callApplicationOnCreate + 1024(Instrumentation.java:1024)
   at android.app.ActivityThread.handleBindApplication + 5581(ActivityThread.java:5581)
   at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(XposedBridge.java)
   at de.robv.android.xposed.XposedBridge.handleHookedMethod + 360(XposedBridge.java:360)
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java)
   at android.app.ActivityThread.-wrap2(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage + 1579(ActivityThread.java:1579)
   at android.os.Handler.dispatchMessage + 102(Handler.java:102)
   at android.os.Looper.loop + 154(Looper.java:154)
   at android.app.ActivityThread.main + 6300(ActivityThread.java:6300)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 887(ZygoteInit.java:887)
   at com.android.internal.os.ZygoteInit.main + 777(ZygoteInit.java:777)
   at de.robv.android.xposed.XposedBridge.main + 107(XposedBridge.java:107)

MyLibrary.java:317 中的代码如下所示:

executeOnBackground(() -> {
    // some code
}

函数定义如下:

private static void executeOnBackground(Runnable runnable) {
    executeOnBackground(true, runnable);
}

内部称之为:

private static void executeOnBackground(boolean forcePost, Runnable runnable) {
    if (runnable == null)
        return;

    if (isOnMainThread() || forcePost)
        getNextBackgroundHandler().post(runnable);
    else
        runnable.run();
}

请注意,堆栈跟踪在到达函数之前就结束了,所以我认为问题出在 lambda 函数中?还是在定义中?我不知道如何解决这个问题,但这是我们现在遇到的最常见的错误。它发生在随机设备上,Android OS 版本无关紧要。因此,如果有人可以提供帮助或提供一些反馈,我将不胜感激。谢谢。

【问题讨论】:

    标签: android proguard android-library android-r8


    【解决方案1】:

    分析堆栈跟踪表明 XPosed 似乎处于活动状态,这是一个挂钩框架。如果您仅在某些设备上遇到此错误,则可能是因为您的某些用户试图挂钩您的应用程序并修改相应类 MyLibrary 中的代码。

    【讨论】:

    • 您认为这里的问题是用户在操纵代码吗?如果是这样,那么我可以说如果他们遇到异常,那是他们的错,对吗?或者有没有办法防止异常发生,而无需将代码包装在 try-catch 中?而且我还假设代码将在另一个位置而不是开头抛出异常。
    • 您可以做一件事来验证这是否是应用程序的问题或有人试图修改它,是提取类com.example.library.-$$Lambda$d$QOXAMJpwehT8fF2Hmjjy5XM7Qx4run 方法的dex 代码,以查看如果那里有任何可疑之处。一个简单的方法是使用 apktool (ibotpeaches.github.io/Apktool) 并运行 apktool d --no-res <apkname>.apk。然后在<apkname>/smali/com/example/library/-$$Lambda$d$QOXAMJpwehT8fF2Hmjjy5XM7Qx4.smali中找到代码。如果可能的话,您可以与 sgjesse@google.com 分享该代码,我可以看看。
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 2013-04-11
    • 2013-07-26
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2018-11-28
    相关资源
    最近更新 更多