passself 2025-07-01 16:12 采纳率: 42.9%
浏览 6

android ANR

android提供了一个XXSDK 给业务调用,
在java 端开启了一个子线程调用 业务自己写的jni,在jni里面,使用dlopen调用 XXSDK中的符号,但是在很多低端手机上出现后台ANR,很奇怪,望解惑

ANR 有:

#00 pc 0x88e1c libc.so (syscall + 28) (BuildId: 21cd09af0ad2ccf35d6b8ba2d064b3c4)
#01 pc 0x22a29c libart.so (art::ConditionVariable::WaitHoldingLocks + 136) (BuildId: 4ccb65ae9ac5ad5da3af5a342d5b0b92)
#02 pc 0x73c008 libart.so (art::JNI<false>::FindClass + 1580) (BuildId: 4ccb65ae9ac5ad5da3af5a342d5b0b92)
#03 pc 0x127a1c libandroid_runtime.so (android::NativeDisplayEventReceiver::dispatchVsync + 92) (BuildId: 48ad9f7ce079268af4c97651d7141de3)
#04 pc 0xb7eb4 libgui.so (android::DisplayEventDispatcher::handleEvent + 276) (BuildId: 8220cdb9b03ace69cf4636b952eb9456)
#05 pc 0x18224 libutils.so (android::Looper::pollInner + 1060) (BuildId: 10aac5d4a671e4110bc00c9b69d83d8a)
#06 pc 0x17da0 libutils.so (android::Looper::pollOnce + 112) (BuildId: 10aac5d4a671e4110bc00c9b69d83d8a)
#07 pc 0x162d0c libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce + 44) (BuildId: 48ad9f7ce079268af4c97651d7141de3)
       at android.os.MessageQueue.nativePollOnce(Native method)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loopOnce(Looper.java:161)

#00 pc 0x4b50c libc.so (syscall + 28)
#01 pc 0x1b17a4 libart.so (art::ConditionVariable::WaitHoldingLocks(art::Thread*) + 148)
#02 pc 0x3a5654 libart.so (art::JNI<false>::CallObjectMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list) + 500)
#03 pc 0x4074 libnativehelper.so (_JNIEnv::CallObjectMethod(_jobject*, _jmethodID*, ...) + 124)
#04 pc 0xea2e8 libandroid_runtime.so (android::NativeDisplayEventReceiver::dispatchVsync(long, unsigned long, unsigned int) + 48)
#05 pc 0x8fd80 libgui.so (android::DisplayEventDispatcher::handleEvent(int, int, void*) + 160)
#06 pc 0x1a064 libutils.so (android::Looper::pollInner(int) + 916)
#07 pc 0x19c68 libutils.so (android::Looper::pollOnce(int, int*, int*, void**) + 112)
#08 pc 0x114a0c libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int) + 44)
       at android.os.MessageQueue.nativePollOnce(Native method)
       at android.os.MessageQueue.next(MessageQueue.java:335)

本来开启了线程不知道为何还会出现ANR

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-07-01 16:12
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    Android ANR问题

    你遇到的问题是,在 Android 中使用 XXSDK 的 JNI 代码在低端手机上出现后台 ANR(Application Not Responding),而且是在子线程中调用 XXSDK 的符号。

    ANR 是 Android Runtime 的一种错误,通常是因为应用程序在主线程中执行了太长时间的操作,导致用户界面不能响应。后台 ANR 则是指在子线程中执行的操作也会导致 ANR。

    在你的情况下,可能是 XXSDK 的 JNI 代码在子线程中执行了太长时间的操作,导致 ANR。以下是一些可能的解决方案:

    1. 优化 JNI 代码:尝试优化 XXSDK 的 JNI 代码,使其执行速度更快。
    2. 使用 Handler 处理子线程:使用 Handler 将子线程中的操作转移到主线程中,以避免 ANR。
    3. 使用 AsyncTask 或 Loader 处理子线程:使用 AsyncTask 或 Loader 将子线程中的操作转移到主线程中,以避免 ANR。
    4. 限制子线程的执行时间:使用 Thread.sleep() 或其他方法限制子线程的执行时间,以避免 ANR。

    以下是一个使用 Handler 处理子线程的示例代码:

    public class MyActivity extends AppCompatActivity {
        private Handler mHandler = new Handler();
    
        public void doSomething() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // XXSDK 的 JNI 代码
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            // 将子线程中的操作转移到主线程中
                        }
                    });
                }
            }).start();
        }
    }
    

    希望这些解决方案能够帮助你解决 ANR 问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月1日