Native NE /system/bin/audioserver

本文详细解析了Android系统中AudioFlinger组件的Native异常(NE)问题,揭示了IAudioFlinger对象TimeCheck超时导致audioserver崩溃的根本原因。分析指出,system_server的异常引发了permission服务失效,AudioFlinger在尝试dump操作时未能在规定时间内找到permission服务,从而陷入了无限循环,最终触发了NE。解决方案建议在dump前检查permission服务状态,若服务不可用则直接返回,避免无限循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exception Class: Native (NE)
Exception Type: SIGABRT

Current Executing Process: 
pid: 32235, tid: 32271
/system/bin/audioserver

Backtrace: 
#00 pc 0001cca6 /system/lib/libc.so (abort+58)
#01 pc 00006ccd /system/lib/liblog.so (__android_log_assert+156)
#02 pc 0000e2ef /system/lib/libmedia_helper.so (android::TimeCheck::TimeCheckThread::threadLoop()+270)
#03 pc 0000c08b /system/lib/libutils.so (android::Thread::_threadLoop(void*)+166)
#04 pc 00063305 /system/lib/libc.so (__pthread_start(void*)+22)
#05 pc 0001de69 /system/lib/libc.so (__start_thread+24)

$** *** *** *** *** *** *** *** Exception *** *** *** *** *** *** *** **$


ABI: 'arm'
pid: 23403, tid: 23465, name: TimeCheckThread >>> /system/bin/audioserver <<<
signal 6 (SIGABRT), code --------, fault addr --------
r0 00000000 r1 00005ba9 r2 00000006 r3 00000008
r4 00005b6b r5 00005ba9 r6 a95404a4 r7 0000010c
r8 aac9d943 r9 aa69e2e8 sl 3b9aca00 fp 000fe000
ip ffffb6dc sp a9540490 lr aafece59 pc aafe4ca6 cpsr 200e0030

TimeCheck机制是audioserver里面用于binder in调用超时检测机制,对于audioserver binder in的call不能超过5s

另外一份log中的core-dump

#0 nanosleep () at bionic/libc/arch-arm/syscalls/nanosleep.S:9
No locals.
#1 0xab001244 in sleep (seconds=1) at bionic/libc/upstream-freebsd/lib/libc/gen/sleep.c:58
time_to_sleep =

{tv_sec = 1, tv_nsec = 0}
time_remaining =

{tv_sec = 0, tv_nsec = 847461}
#2 0xaa90d9e2 in android::checkPermission (permission=..., pid=1548, uid=1000) at frameworks/native/libs/binder/IServiceManager.cpp:121
binder =

{m_ptr = 0x0}
startTime = <error reading variable startTime (access outside bounds of object referenced via synthetic pointer)>
#3 0xaa9199d0 in android::PermissionCache::checkPermission (permission=..., pid=1548, uid=1000) at frameworks/native/libs/binder/PermissionCache.cpp:102
t = <optimized out>
granted = false
pc = @0xaa699e70: {<android::Singleton<android::PermissionCache>> = {static sLock = {mMutex = {__private = {0}}}, static sInstance = 0xaa699e70}, mLock = {mMutex = {__private = {0}}}, 
mPermissionNamesPool = {<android::SortedVectorImpl> = {<android::VectorImpl> = {_vptr$VectorImpl = 0xaa9371f0 <vtable for android::SortedVector<android::String16>+8>, mStorage = 0x0, mCount = 0, mFlags = 0, 
mItemSize = 4}, <No data fields>}, <No data fields>}, mCache = {<android::SortedVectorImpl> = {<android::VectorImpl> = { _vptr$VectorImpl = 0xaa93721c <vtable for android::SortedVector<android::PermissionCache::Entry>+8>, mStorage = 0x0, mCount = 0, mFlags = 0, mItemSize = 12}, <No data fields>}, <No data fields>}}
#4 0xaa976904 in android::AudioFlinger::dump (this=0xaa6be000, fd=17, args=...) at frameworks/av/services/audioflinger/AudioFlinger.cpp:486
No locals.
#5 0xaa976d00 in non-virtual thunk to android::AudioFlinger::dump(int, android::Vector<android::String16> const&) () at system/core/libutils/include/utils/Vector.h:251
android::kClientLockedString = "Client lock is taken\n"
android::sMediaLogServiceAsBinder = {m_ptr = 0x0}
android::kHardwareLockedString = "Hardware lock is taken\n"
android::audio_interfaces =

{0xaa9a91c1 "primary", 0xaa9a91c9 "a2dp", 0xaa9a91ce "usb"}
android::sMediaLogService =

{m_ptr = 0x0}
android::kNoEffectsFactory = "Effects Factory is absent\n"
_log_level = 1
android::kDeadlockedString = "AudioFlinger may be deadlocked\n"
FX_IID_AEC_ =

{timeLow = 2068386912, timeMid = 36173, timeHiAndVersion = 4576, clockSeq = 48481, node = "\000\002\245\325\305\033"}
FX_IID_NS_ =

{timeLow = 1488237152, timeMid = 36358, timeHiAndVersion = 4576, clockSeq = 43662, node = "\000\002\245\325\305\033"}
SL_IID_VISUALIZATION_ =

{timeLow = 3832227488, timeMid = 56797, timeHiAndVersion = 4571, clockSeq = 35581, node = "\000\002\245\325\305\033"}
android::sMediaLogOnce = 0
android::AudioFlinger::mScreenState = 0
android::AudioFlinger::mStandbyTimeInNsecs = 3000000000
android::gLock = {mMutex = {__private =

{0}
}}
android::gAudioFlinger =

{m_ptr = 0xaa6be000, m_refs = 0xaa698220}
#6 0xaa9043d8 in android::BBinder::onTransact (this=0xaa6be004, code=<optimized out>, data=..., reply=<optimized out>) at frameworks/native/libs/binder/Binder.cpp:226
fd = <optimized out>
argc = <optimized out>
args = {<android::VectorImpl> = {_vptr$VectorImpl = 0x8e623c08 <vtable for android::Vector<android::String16>+8>, mStorage = 0x0, mCount = 0, mFlags = 0, mItemSize = 4}, <No data fields>}
#7 0xaac893d6 in android::BnAudioFlinger::onTransact (this=<optimized out>, code=<optimized out>, data=..., reply=0xa9d06808, flags=<optimized out>) at frameworks/av/media/libaudioclient/IAudioFlinger.cpp:1473
check =

{static kDefaultTimeOutMs = 5000, mEndTimeNs = 18723149499422}
#8 0xaa9040fa in android::BBinder::transact (this=0xaa6be004, code=1598311760, data=..., reply=<optimized out>, flags=<optimized out>) at frameworks/native/libs/binder/Binder.cpp:129

IAudioFlinger checktime超时 NE:
查看SYS_ANDROID_LOG发现system_server发生NE:
03-08 19:55:14.580 920 938 D AES : ExceptionLog: notify aed, process:system_server pid:920 cause:system_server_crash 
查看audioserver的NE:
03-08 19:55:47.535 23538 23538 D AEE_AED : i, Cls, count, last_time, module 
03-08 19:55:47.535 23538 23538 D AEE_AED : ==================================================================== 
03-08 19:55:47.535 23538 23538 D AEE_AED : 0, 11, 2, 1520501970, system_server 
03-08 19:55:47.536 23538 23538 D AEE_AED : 7, 3, 1, 1520519147, /system/bin/audioserver

结论:IAudioFlinger对象TimeCheck超时引起audioserver NE,根因是system server NE导致“permission” service dead后AudioFlinger dump代码时在5s之内找不到“permission” service引起代码逻辑出现死循环导致超时。
解决方案:“permission” service dead后,在dump之前check service在不再,若不存在,就返回不去dump,避免在dumpAllowed()函数调用出现无限循环sleep导致超时。此方案来规避audioserver的NE。

frameworks/av/services/audioflinger/AudioFlinger.cpp
status_t AudioFlinger::dump(int fd, const Vector<String16>& args){
//add
    sp<IBinder> binder = defaultServiceManager()->checkService(String16("permission"));
    bool isPermissionServiceExist = binder != NULL ? true : false;
    if(!isPermissionServiceExist){
        ALOGI("checkService binder == NULL , permission Service not exist ");
        return UNEXPECTED_NULL;
    }
//add
if (!dumpAllowed()) {
        dumpPermissionDenial(fd, args);
} else {
// get state of hardware lock
        bool hardwareLocked = dumpTryLock(mHardwareLock);
        if (!hardwareLocked) {
            String8 result(kHardwareLockedString);
            write(fd, result.string(), result.size());
.....
.....

 }

}

 

C/C++: ld: error: found local symbol '_edata' in global part of symbol table in file D:/AndroidProject/Application_721_rknn/app_rknn_face_demp/src/main/jniLibs/arm64-v8a\librknn_sunchip.so 我编译出来的库为什么会出现这种情况,我的编译指令是: cmake_minimum_required(VERSION 3.4.1) project(RKFace VERSION 1.0.0) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 基本编译选项 set(CMAKE_C_FLAGS "-Wall -fPIC -O2") set(CMAKE_CXX_FLAGS "-Wall -fPIC -O2") # Android 平台配置 if(CMAKE_SYSTEM_NAME STREQUAL "Android") add_definitions(-DANDROID) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() # 包含目录 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ) # 源文件 set(main_source src/main.cc) # 库文件路径 set(LIBPATH ${CMAKE_CURRENT_SOURCE_DIR}/libs/android) # 链接库 set(LINKS ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so ) # Android 特定库 if(CMAKE_SYSTEM_NAME STREQUAL "Android") list(APPEND LINKS log c++_shared) endif() # 标准库 list(APPEND LINKS c m dl) # 生成可执行文件 add_executable(rkface.demo ${main_source}) # 链接库 target_link_libraries(rkface.demo ${LINKS}) # 设置安装目录为当前目录下的 install set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install) #生成库 add_library(rknn_sunchip SHARED src/rknn_sunchip.cc) target_include_directories(rknn_sunchip PRIVATE include) target_link_libraries(rknn_sunchip ${LINKS}) # 安装到ABI分层目录 install(TARGETS rknn_sunchip LIBRARY DESTINATION ${LIBPATH}/install/libs/${ANDROID_ABI} ) # 安装可执行文件到 install/bin install(TARGETS rkface.demo RUNTIME DESTINATION bin) # 安装库文件到 install/lib install(FILES ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so DESTINATION lib ) # 安装头文件到 install/include (如果需要) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ),编译脚本是:#!/bin/bash # 编译NVA库为Android .so文件的脚本(优化版本) # 使用方法: ./build_android_optimized.sh [目标ABI] # 检查参数 if [ $# -lt 1 ]; then echo "用法: $0 <目标ABI>" echo "例如: $0 arm64-v8a" echo "支持的ABI: armeabi-v7a, arm64-v8a" exit 1 fi # 参数设置 NDK_PATH=/home/share/work/YML/android-ndk-r19c SRC_PATH=./ TARGET_ABI=$1 BUILD_DIR="${SRC_PATH}/build_android_${TARGET_ABI}" API_LEVEL=24 # 可根据需要调整API级别 PROJECT_ROOT=$(pwd) THIRD_PARTY_PATH="${PROJECT_ROOT}/../000_3rdParty" # OPENCV_PATH="${THIRD_PARTY_PATH}/libopencv/opencv-android-sdk-build" OPENCV_PATH="${THIRD_PARTY_PATH}/libopencv/opencv_android_4.6.0/" # 检查NDK路径是否存在 if [ ! -d "$NDK_PATH" ]; then echo "错误: NDK路径不存在: $NDK_PATH" exit 1 fi # 检查目标ABI是否有效 case $TARGET_ABI in armeabi-v7a) ABI="armeabi-v7a" ARCH_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard" ;; arm64-v8a) ABI="arm64-v8a" ARCH_FLAGS="-march=armv8-a" ;; *) echo "错误: 不支持的ABI: $TARGET_ABI" echo "支持的ABI: armeabi-v7a, arm64-v8a" exit 1 ;; esac # 设置优化标志 - 与Linux版本一致 # 设置更保守的优化标志,避免过度优化导致的问题 OPT_FLAGS="-O2 -fno-strict-aliasing -fwrapv -fno-omit-frame-pointer" SECURITY_FLAGS="-fstack-protector-strong -D_FORTIFY_SOURCE=2" VISIBILITY_FLAGS="-fvisibility=hidden -fvisibility-inlines-hidden" # 移除可能导致问题的标志 # EXTRA_FLAGS="-fno-common" # 这个可能在Android上有问题 EXTRA_FLAGS="-fno-common -Wno-unused-command-line-argument" # Android特定的标志 ANDROID_FLAGS="-fPIC -fdata-sections -ffunction-sections" # 链接器标志 - 更保守的设置 LINKER_FLAGS="-Wl,--gc-sections,--as-needed,--no-undefined" # 组合所有标志 ALL_FLAGS="$ARCH_FLAGS $OPT_FLAGS $SECURITY_FLAGS $VISIBILITY_FLAGS $EXTRA_FLAGS $ANDROID_FLAGS" echo "====== 配置信息 ======" echo "NDK路径: $NDK_PATH" echo "源码路径: $SRC_PATH" echo "目标ABI: $TARGET_ABI" echo "构建目录: $BUILD_DIR" echo "API级别: $API_LEVEL" echo "第三方库路径: $THIRD_PARTY_PATH" echo "OpenCV库路径: $OPENCV_PATH" echo "编译优化标志: $ALL_FLAGS" echo "链接器标志: $LINKER_FLAGS" echo "======================" # 创建构建目录 mkdir -p $BUILD_DIR cd $BUILD_DIR # 设置CMake工具链文件路径 TOOLCHAIN_FILE="${NDK_PATH}/build/cmake/android.toolchain.cmake" if [ ! -f "$TOOLCHAIN_FILE" ]; then echo "错误: 无法找到Android CMake工具链文件: $TOOLCHAIN_FILE" exit 1 fi # API级别检查函数 check_api_compatibility() { case $TARGET_ABI in armeabi-v7a) MIN_API=24 ;; arm64-v8a) MIN_API=24 ;; esac if [ $API_LEVEL -lt $MIN_API ]; then echo "错误: OpenCV要求${TARGET_ABI}的最低API级别为${MIN_API}" exit 1 fi } # 在参数检查之后调用 check_api_compatibility # 设置OpenCV配置路径 OPENCV_CONFIG_LOCATIONS=( "${OPENCV_PATH}/sdk/native/jni/abi-${TARGET_ABI}" "${OPENCV_PATH}/sdk/native/jni" "${OPENCV_PATH}/sdk/native" "${OPENCV_PATH}/share/OpenCV" "${OPENCV_PATH}/lib/cmake/opencv4" ) OPENCV_CONFIG_PATH="" for location in "${OPENCV_CONFIG_LOCATIONS[@]}"; do if [ -f "${location}/OpenCVConfig.cmake" ]; then OPENCV_CONFIG_PATH="${location}" echo "找到OpenCV配置文件: ${location}/OpenCVConfig.cmake" break fi done if [ -z "$OPENCV_CONFIG_PATH" ]; then echo "警告: 无法找到OpenCVConfig.cmake文件, 请检查OpenCV路径" echo "将尝试继续配置,但可能会失败..." OPENCV_CONFIG_PATH="${OPENCV_PATH}" fi echo "使用OpenCV配置路径: $OPENCV_CONFIG_PATH" echo "使用CMake工具链文件: $TOOLCHAIN_FILE" # 运行CMake配置 echo "正在配置CMake..." export OpenCV_DIR=$OPENCV_CONFIG_PATH cmake -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_FILE \ -DANDROID_ABI=$ABI \ -DANDROID_PLATFORM=android-$API_LEVEL \ -DANDROID_STL=c++_shared \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="$ALL_FLAGS" \ -DCMAKE_CXX_FLAGS="$ALL_FLAGS" \ -DCMAKE_SHARED_LINKER_FLAGS="$LINKER_FLAGS" \ -DCMAKE_EXE_LINKER_FLAGS="$LINKER_FLAGS" \ -DOpenCV_DIR=$OPENCV_CONFIG_PATH \ -DBUILD_SHARED_LIBS=ON \ -DENABLE_LTO=OFF \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DANDROID_NATIVE_API_LEVEL=$API_LEVEL \ .. # 检查CMake配置是否成功 if [ $? -ne 0 ]; then echo "错误: CMake配置失败" # 提供调试信息 echo "" echo "======= 调试信息 =======" echo "请检查以下几点:" echo "1. OpenCV安装是否完整,确认OpenCV Android SDK路径是否正确" echo "2. 在CMakeLists.txt中,确认OpenCV_DIR路径设置正确" echo "3. 尝试手动查找OpenCVConfig.cmake位置:" echo " find $OPENCV_PATH -name OpenCVConfig.cmake -o -name opencv-config.cmake" echo "4. 确认opencv库对应的ABI版本是否存在:" if [ -d "${OPENCV_PATH}/sdk/native/libs/${ABI}" ]; then echo " ABI库文件存在: ${OPENCV_PATH}/sdk/native/libs/${ABI}" ls -la "${OPENCV_PATH}/sdk/native/libs/${ABI}" else echo " 警告: 没有找到对应ABI的OpenCV库: ${OPENCV_PATH}/sdk/native/libs/${ABI}" fi echo "========================" exit 1 fi # 编译 echo "正在编译..." cmake --build . --config Release -- -j$(nproc) # 检查编译是否成功 if [ $? -ne 0 ]; then echo "错误: 编译失败" exit 1 fi # 创建输出目录 INSTALL_DIR="${BUILD_DIR}/../../install" mkdir -p $INSTALL_DIR/lib/$ABI # 复制生成的库文件 echo "正在安装..." cmake --install . --prefix "$INSTALL_DIR" # 使用strip进一步精简库文件 echo "正在精简库文件..." find $INSTALL_DIR -name "*.so" -exec ${NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip --strip-all {} \; echo "编译完成!" echo "库文件位置: $INSTALL_DIR/lib/" ls -la $INSTALL_DIR/lib/ echo "头文件位置: $INSTALL_DIR/include/" ls -la $INSTALL_DIR/include/ echo "生成的库文件列表:" find $INSTALL_DIR -name "*.so" -o -name "*.a" # 显示库文件大小 echo "" echo "库文件大小信息:" find $INSTALL_DIR -name "*.so" -exec du -h {} \;
最新发布
06-08
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值