V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
redsonic
V2EX  ›  Android

android 4.2.1 MTK JB2 源码编译跑起来遇到奇葩问题

  •  
  •   redsonic · 2016-11-25 12:23:41 +08:00 · 8708 次点击
    这是一个创建于 2922 天前的主题,其中的信息可能已经有所发展或是发生改变。

    拿 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 了还是不行,现在没有其他思路了,希望大伙帮我出出主意。

    7 条回复    2016-11-28 11:02:24 +08:00
    jtnwm
        1
    jtnwm  
       2016-11-25 12:48:13 +08:00 via iPhone
    也许是 SELinux 的问题,不太清楚。
    nicevar
        2
    nicevar  
       2016-11-25 13:05:46 +08:00
    同意楼上,我有一次在创维的电视上遇到的就是这个问题
    redsonic
        3
    redsonic  
    OP
       2016-11-25 13:15:19 +08:00
    @nicevar
    @jtnwm
    这个我想到了,但 4.2.1 好像默认不开 selinux ,也没有 setenforce 这个工具。不过我再扒扒代码看看,毕竟这是 MTK 魔改过的
    redsonic
        4
    redsonic  
    OP
       2016-11-25 17:16:09 +08:00
    @nicevar
    @jtnwm
    确定没有开 selinux , SELinux.isSELinuxEnabled()返回 0 。现在感觉非常迷茫
    nicevar
        5
    nicevar  
       2016-11-28 09:27:54 +08:00
    @redsonic 之前没仔细看你的描述, adb shell 进去是可以访问的应该不是 selinux 的问题,是 apk 程序读取权限的问题,是一直都是这样吗?会不会是你在启动应用进去看的时候 sd 刚好是正在扫描处于锁定状态呢?
    nicevar
        6
    nicevar  
       2016-11-28 09:37:30 +08:00
    还想起来一点,你用应用直接读取 /sdcard 这个可以吗?不行再测试一下 Environment.getExternalStorageDirectory().getAbsolutePath()的值,我以前有个应用发现在联想的手机上出现过 /storage/sdcard0 打开报错的问题,但是联想自己的文件管理器能打开,具体什么原因没有深入过
    redsonic
        7
    redsonic  
    OP
       2016-11-28 11:02:24 +08:00
    @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 的,但总感觉这是在挑战我的常识。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1040 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:54 · PVG 04:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.