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

Android  代码片段  2021年11月15日 pm7:01发布3年前 (2021)更新 91es.com站长
128 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、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

张晓风:经济学的旁听生

“什么是经济学呢?”他站在讲台上,戴眼镜,灰西装,声音平静,典型的中年学者。台下坐的是大学一年级的学生,而我,是置身在这二百人大教室里偷偷旁听的一个。从一开学我就昂奋起来,因为在课表上看见要开一门《社会科学概论》的课程,包括四位教授来设“政治”“法律”“经济”“人类学”四个讲座。想起可以重新做学...

Java多线程编程核心技术的笔记之1

1、什么是进程,线程和多线程1. 进程在百度百科中的定义是进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.程序是指令,数据以及组织形式的描述,进程是程序的实体.我们可以把win系统中运行的一个exe程序看做一个...

wordpress设置固定链接后不能访问

前言我用的是nginx服务器,用的是WordPress博客系统。在wordpress后台固定链接后,导致文章无法访问。记录一下,方便自己查阅。正文找到nginx.conf#每个人的可能不一样/etc/nginx/nginx.conf新增配置,在server{}中server{ ...

Files中启动自己的播放器

前言记录一下点击Android Files文件管理器中多媒体文件拉起我们自己写的播放器。流水账,没啥可看的,跳过吧。正文流水账而已,记录一下,方便自己查阅。只需要在AndroidMainfest.xml中的Activity中配置如下隐藏内容!评论可看后才能查看!评论可看audio/*...

Windows软件开机多个

前言有时候软件需要多开,只开一个操作不方便,比如Notepad++进行日志查询时,多开一个可以拖入其他更多的文件,因此想是开启多个界面。正文百度和谷歌后发现真的有人这么干,如下。找到一个Notepad++的快捷方式(桌面或启动菜单中)属性,选中"Shortcut"(快捷键) Tab,编辑 T...

Android Studio‘Library projects cannot set applicationId’

前言Library projects cannot set applicationId. applicationId is set to 'com.biumall.usercenter' in default config.摘抄于此,方便自己查阅。正文动态配置module时,当前设置为l...