问题
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