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

Android  代码片段  2021年11月15日 pm7:01发布3年前 (2021)更新 91es.com站长
103 0 0

前言

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

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

好记性不如烂笔头

正文

部分异常日志如下。

 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 字符串在移动端引发的问题

 历史上的今天

  1. 2019: 柴静:真相常流失于涕泪交加中(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Android Socket之服务端封装

前言之前记录了Android中Socket的简单使用,也就是对数据的简单收发操作。这简单的对SocketServer进行封装。记录于此,方便自己查阅。正文SocketServer服务端一般不需要我们写,大多数是作为客户端去绑定其他的,比如Tbox。但服务端跟客户端差不多,因此也一起整理一下...

徐志摩 :偶然

我是天空里的一片云,偶尔投影在你的波心──你不必讶异,更无须欢喜──在转瞬间消灭了踪影。 你我相逢在黑夜的海上,你有你的,我有我的,方向;你记得也好,最好你忘掉在这交会时互放的光亮!

[摘]PCM文件转WAV文件

一、WAV和PCM的区别和联系在Android平台上要进行音频编辑操作(比如裁剪,插入,合成等),通常都是需要将音频文件解码为WAV格式的音频文件或者PCM文件。那么WAV和PCM之间有什么关系,这里有必要了解一下。PCM(Pulse Code Modulation—-脉码调制录音)。所谓PC...

[摘]System.exit(0)和System.exit(1)区别

原作者解释得很清晰明,因此摘抄于此。关于System.exit(status)System.exit(status)源码说明如下:System.java/** * Terminates the currently running Java Virtual Machine. The * ...

Android NDK 部分版本下载

本文摘抄《NDK各版本下载》以便自己下载https://dl.google.com/android/repository/android-ndk-r17b-windows-x86.ziphttps://dl.google.com/android/repository/android-nd...

ListView的item中当文本出现阿拉伯语时会显示怪异

前言测试反馈有些歌曲名字中如果存在阿拉伯语,列表显示时就出现显示右边怪异的问题。总所周知,阿拉伯语显示在右边的。比如עברית_xi bo lai yu.mp3العربية_a la bo yu.mp3فارسی_bo si yu.mp3显示如下 a la ...