passself 2025-07-01 16:39 采纳率: 42.9%
浏览 11

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:39
    关注

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

    android ANR问题

    你遇到了 Android ANR (Application Not Responding) 问题,主要是因为在 JNI 中使用 dlopen 调用 XXSDK 中的符号,导致在低端手机上出现后台 ANR。

    解决方案:

    1. 检查 XXSDK 的实现:确保 XXSDK 的实现是线程安全的,避免在 JNI 中使用非线程安全的 API。
    2. 使用 dlopen 的正确方式:确保在 JNI 中使用 dlopen 的正确方式,避免在子线程中调用 dlopen
    3. 使用 System.loadLibrary:考虑使用 System.loadLibrary 来加载 XXSDK 的库,而不是使用 dlopen
    4. 检查 JNI 代码:检查 JNI 代码是否正确,避免在 JNI 中出现死锁或阻塞。
    5. 使用 Android Profiler:使用 Android Profiler 来分析 ANR 的原因,了解哪个线程或哪个方法导致了 ANR。

    核心代码:

    // 使用 System.loadLibrary 加载 XXSDK 的库
    System.loadLibrary("xxsdk");
    
    // 在 JNI 中使用 XXSDK 的符号
    JNIEXPORT void JNICALL Java_com_example_MainActivity_callXXSDK(JNIEnv *env, jobject thiz) {
        // ...
    }
    

    注意:以上代码只是一个示例,需要根据实际情况进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月1日