问题

TIM 4.0.98 在 Android 16(crDroid)上启动后报"无法存储文件,请检查SD卡状态",无法加载图片及缓存文件。

根因

Android 16 存在 bug,应用安装后 /storage/emulated/0/Android/data/<包名>/ 目录不会自动创建。TIM 的 NTKernel(C++ 层)直接拼路径写文件,没有经过 getExternalFilesDir() 这个 Java API,因此没有触发系统自动创建目录,导致所有文件写入返回 EIO(error -5)。

关键日志

W ContextImpl: Failed to ensure /storage/emulated/0/Android/data/com.tencent.tim/cache
E NTKernel: CreateTempDir Fail. error:-5 path=/storage/emulated/0/Android/data/com.tencent.tim/Tencent/Tim/chatpic/Temp
E NTKernel: CreateFileDir Fail. error:-5 path=/storage/emulated/0/Android/data/com.tencent.tim/Tencent/Tim/chatpic/chatraw/a29
E NTKernel: fail to create directory:/storage/emulated/0/Android/data/com.tencent.tim/Tencent/Tim/chatpic/Temp(-5)

临时解决方案

获取 TIM 的 uid:

su -c "stat -c %u /data/data/com.tencent.tim"

手动创建目录并设置正确属主(将 10499 替换为实际 uid):

su -c "mkdir -p /storage/emulated/0/Android/data/com.tencent.tim/cache && \
mkdir -p /storage/emulated/0/Android/data/com.tencent.tim/files && \
chown -R 10499:10499 /storage/emulated/0/Android/data/com.tencent.tim && \
chmod -R 771 /storage/emulated/0/Android/data/com.tencent.tim"

备注(个人见解)

  • 此问题为 Android 16 上游 bug,非 crDroid 特有,原生 Pixel 设备同样可复现
  • 其他经过 Java API(getExternalFilesDir())创建目录的 app 不受影响
  • TIM 未针对 Android 16 做适配,且测试范围基本限于国内厂商 ROM