无效的UTF-8 字符串在Android上引发的问题

广告也精彩

前言

最近在调试多媒体时,出现特别奇怪的问题,也就是扫描磁盘中文件时被中断了,之前都是好的。

记录于此,方便自己查阅。

好记性不如烂笔头

正文

部分异常日志如下。

 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
 Abort message: 'java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0'
     r0  00000000  r1  00002d6a  r2  00000006  r3  00000008
     r4  00002cff  r5  00002d6a  r6  8f3a879c  r7  0000010c
     r8  00000000  r9  acb906e0  r10 0000000a  r11 aca1f84e
     ip  8f3a8738  sp  8f3a8788  lr  aff37e49  pc  aff2fc96

 backtrace:
     #00 pc 0001cc96  /system/lib/libc.so (abort+58)
     #01 pc 0034dc9f  /system/lib/libart.so (art::Runtime::Abort(char const*)+910)
     #02 pc 000071b3  /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
     #03 pc 0023218f  /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1214)
     #04 pc 002322e7  /system/lib/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list)+58)
     #05 pc 000c3f77  /system/lib/libart.so (art::(anonymous namespace)::ScopedCheck::AbortF(char const*, ...)+42)
     #06 pc 000c3e77  /system/lib/libart.so (art::(anonymous namespace)::ScopedCheck::CheckNonHeapValue(char, art::(anonymous namespace)::JniValueType)+938)
     #07 pc 000c20f5  /system/lib/libart.so (art::(anonymous namespace)::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::(anonymous namespace)::JniValueType*)+624)
     #08 pc 000ba295  /system/lib/libart.so (art::(anonymous namespace)::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+488)
     #09 pc 00014f77  /system/lib/libopenjdk.so (Java_java_io_UnixFileSystem_list0+310)

上面是系统内部保存的AEE日志。

查看网上相关内容后,说是[无效的UTF-8字符串]导致的问题。(具体看文末)

最后debug发现,是Android系统中的一个接口异常了。

代码中有遍历目录中的文件,但如果当前目录中存在奇怪的或者说无效的UTF-8字符串就会出现如上的问题。

 File file = new File(path);
    if ( file.exists()) {
        File[] files = file.listFiles();
    }

然而我的目录下存在如下文件

-rw-rw---- 1 root sdcard_rw 122403851 2021-05-26 14:26 任然-飞鸟
-rw-rw---- 1 root sdcard_rw 108228882 2021-05-26 14:28 梦然-\345

这两个其实是我push到内置sdcard中的视频文件,但由于环境问题,导致push后的文件变了。

梦然-少年.mp4
任然-飞鸟和蝉.mp4

查看完整的异常日志,中也发现

runtime.cc:558]   at java.io.File.list(File.java:1131)
runtime.cc:566] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0
runtime.cc:566]     string: '梦然-少▒'
runtime.cc:566]     input: '0xe6 0xa2 0xa6 0xe7 0x84 0xb6 0x2d 0xe5 0xb0 0x91 0xe5'
runtime.cc:566] "Thread-3" prio=5 tid=16 Runnable

从上面可以看出[梦然-少\345]这个遍历时就异常了。

怎么解决这个问题

看网上说有人反馈了这个bug( https://code.google.com/p/android/issues/detail?id=25386 ) 这个是2016年左右的,但我2021年还能复现。

由于无法FQ,抱歉,我看不到。

这里记录一下,只是让自己知道原因,已经如何分析问题。

参考文章

  1. 无效的 UTF-8 字符串在移动端引发的问题

广告也精彩
版权声明:125la.com站长 发表于 2021年11月15日 下午7:01 。
转载请注明: 无效的UTF-8 字符串在Android上引发的问题 | 125啦读书导航

相关文章

广告也精彩

暂无评论

暂无评论...
广告也精彩