拿 MTK JB2(android 4.2.1)源码包编译出来的卡刷,然后“设置”中发现内置存储空间和外置 sd 卡可用空间都为 0 ,其他任何应用也反映可用空间 0 。但 adb shell 进去均可正常访问, df 也显示正常。
看了看 /etc/permissions/platform.xml 是正常的, sdcard_rw media_rw 都在。无奈只有简单调试了一下,我在“设置”->"存储"的代码加了log:
private void measureApproximateStorage(IMediaContainerService imcs) {
/*final String path = mVolume != null ? mVolume.getPath()
: Environment.getDataDirectory().getPath();*/
final String path;
if(mVolume != null) {
path = mVolume.getPath();
} else {
if(FeatureOption.MTK_SHARED_SDCARD) {
path = Environment.getLegacyExternalStorageDirectory().getPath();
} else {
path = Environment.getDataDirectory().getPath();
}
}
Log.d(TAG, "measureApproximateStorage, path is " + path);
try {
final long[] stats = imcs.getFileSystemStats(path);
mTotalSize = stats[0];
mAvailSize = stats[1];
Log.d(TAG, "total size:" + mTotalSize + " path:" + path);
} catch (Exception e) {
Log.w(TAG, "Problem in container service", e);
}
sendInternalApproximateUpdate();
}
结果:
D/StorageMeasurement( 1454): ## total size:2142347264 path:/data
D/StorageMeasurement( 1454): ## total size:0 path:/storage/sdcard1
D/StorageMeasurement( 1454): ## total size:0 path:/storage/sdcard0
再往下追踪直到 native 层: libcore/luni/src/main/native/libcore_io_Posix.cpp ,我也加了 log
static jobject Posix_statfs(JNIEnv* env, jobject, jstring javaPath) {
ScopedUtfChars path(env, javaPath);
if (path.c_str() == NULL) {
return NULL;
}
struct statfs sb;
int rc = TEMP_FAILURE_RETRY(statfs(path.c_str(), &sb));
ALOGE("[My Debug]##path:%s blocks:%llu rc:%d uid:%d gid:%d", path.c_str(), sb.f_blocks, rc, getuid(), getgid());
if (rc == -1) {
throwErrnoException(env, "statfs");
return NULL;
}
return makeStructStatFs(env, sb);
}
结果:
E/Posix ( 1524): [My Debug]## path:/storage/sdcard1 blocks:0 rc:0 uid:10018 gid:10018
E/Posix ( 1524): [My Debug]## path:/storage/sdcard0 blocks:0 rc:0 uid:10018 gid:10018
我觉得很可能还是权限问题,就把 /storage/sdcard1 和 0 都 mount -o fmask=0000,dmask=0000 这样 /storage/sdcard0 和 1 权限就是 777 了,试了一下还是不行。
另外,如果 APP 打开这些存储设备会有 log :
I/DefContainer-JNI( 1884): error opening: /storage/sdcard0: Permission denied
I/DefContainer-JNI( 1884): error opening: /storage/sdcard1: Permission denied
代码在 frameworks/base/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
static jlong native_measureDirectory(JNIEnv* env, jobject clazz, jstring directory) {
jlong ret = 0L;
const char* path = env->GetStringUTFChars(directory, NULL);
if (path == NULL) {
return ret;
}
int dirfd = open(path, O_DIRECTORY, O_RDONLY);
if (dirfd < 0) {
ALOGI("error opening: %s: %s", path, strerror(errno));
} else {
ret = calculate_dir_size(dirfd);
close(dirfd);
}
env->ReleaseStringUTFChars(directory, path);
return ret;
}
看来就是调用底层的系统 API 访问文件没权限,但文件系统都已经 777 了还是不行,现在没有其他思路了,希望大伙帮我出出主意。
1
jtnwm 2016-11-25 12:48:13 +08:00 via iPhone
也许是 SELinux 的问题,不太清楚。
|
2
nicevar 2016-11-25 13:05:46 +08:00
同意楼上,我有一次在创维的电视上遇到的就是这个问题
|
3
redsonic OP |
4
redsonic OP |
5
nicevar 2016-11-28 09:27:54 +08:00
@redsonic 之前没仔细看你的描述, adb shell 进去是可以访问的应该不是 selinux 的问题,是 apk 程序读取权限的问题,是一直都是这样吗?会不会是你在启动应用进去看的时候 sd 刚好是正在扫描处于锁定状态呢?
|
6
nicevar 2016-11-28 09:37:30 +08:00
还想起来一点,你用应用直接读取 /sdcard 这个可以吗?不行再测试一下 Environment.getExternalStorageDirectory().getAbsolutePath()的值,我以前有个应用发现在联想的手机上出现过 /storage/sdcard0 打开报错的问题,但是联想自己的文件管理器能打开,具体什么原因没有深入过
|
7
redsonic OP @nicevar 一直都是这样。 在 vold 加了调试, fsck_msdos 返回都是正常。我还改了 vold 的代码,让他挂载 ext4 文件系统的 sdcard , shell 访问正常,可 android 还是可用空间 0 。 Environment.getExternalStorageDirectory().getAbsolutePath() 我这边返回的是 /storage/sdcard0 。
总的说现在问题描述是 android 层调用底层系统 api 访问挂载的 /storage/sdcard0 ,/storage/sdcard1 没有权限,但访问其他挂载的比如 /data 没有问题, shell 访问任何文件都没有问题。 内核 mtk 没动过,只是加了几个设备驱动,没发现和文件系统有关系的。 我不是职业搞 android 的,但总感觉这是在挑战我的常识。 |