问题说明
测试文件管理器的时候遇到到一个诡异的问题,新建目录输入了比较长的目录名,目录创建成功(File.mkdir返回true),但是一刷新文件管理器就挂了。之后再也进不了文件管理器,都是闪退。换了好几个文件管理器测试,如:ES,MIUI,OI。问题依旧。adb log 输出的信息如下,没有多少帮助。
03-20 17:38:48.969 F/<unknown>( 6020): stack corruption detected: aborted 03-20 17:38:48.999 W/InputDispatcher( 1366): channel '417e1c48 com.metago.astro/com.metago.astro.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8 03-20 17:38:48.999 E/InputDispatcher( 1366): channel '417e1c48 com.metago.astro/com.metago.astro.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 03-20 17:38:48.999 W/InputDispatcher( 1366): Attempted to unregister already unregistered input channel '417e1c48 com.metago.astro/com.metago.astro.MainActivity (server)' 03-20 17:38:48.999 I/WindowManager( 1366): WINDOW DIED Window{417e1c48 com.metago.astro/com.metago.astro.MainActivity paused=false} 03-20 17:38:49.009 D/Zygote ( 1181): Process 6020 exited cleanly (127) 03-20 17:38:49.009 E/JavaBinder( 1366): !!! FAILED BINDER TRANSACTION !!! 03-20 17:38:49.009 I/ActivityManager( 1366): Process com.metago.astro (pid 6020) has died. 03-20 17:38:49.019 W/ActivityManager( 1366): Force removing ActivityRecord{418ad088 com.metago.astro/.MainActivity}: app died, no saved state
问题分析
由于测试的文件管理器都是同样的现象,怀疑是目录名太长引起的。于是写了一个测试程序,得到如下结果。
- 4.2.2 File.mkdir 目录名的允许的最大中文字符数为85
- 4.1.2 File.mkdir 目录名的允许的最大中文字符数为255,但是如果存在大于或等于90个中文字符的目录,在调用 File.list 的时候程序会挂掉
- 4.0.4 File.mkdir 目录名的允许的最大中文字符数为255,但是如果存在大于或等于106个中文字符的目录,在调用 File.list 的时候程序会挂掉
结论
4.2.2 貌似修复了此问题,限制允许创建目录名的最大长度为85,能够创建成功的目录都不会引起调用 File.list 程序崩溃。因此,文件管理器也在UI层限制用户输入文件名最大长度为85。