繁体   English   中英

Android - 使用存储访问框架加速文件删除

[英]Android - speed up file deletion using Storage Access Framework

由于 Android 11 在没有 SAF 的情况下无法使用公共位置的文件进行操作。 在过去,我实现了两种选择来处理 android 上的文件,如果文件不在 sdcard 上,那么我使用标准 c++ api,非常快捷。 如果位于 sdcard 上,那么我使用 SAF API - 我使用 JNI 调用 java 方法。 它工作得很好,因为如果有人需要快速访问,那么文件就放在内部存储上,如果有人用完空间,那么以性能为代价,最好是 sdcard 上的存储空间。 然而 Android 11 改变了一切,第一选择被杀死。 我无法将文件放入私人文件夹,因为在卸载过程中被删除。 我的问题是关于文件删除,因为在我的情况下这是最大的速度瓶颈。 刚才我这样删除文件:

使用 SAF:DocumentsContract.deleteDocument

与标准 c++ API:取消链接

虽然取消链接几乎不需要时间,但 SAF 需要 150 毫秒来删除只有几 kB 的小文件。

此比较已在私人文件夹中的 sdcard 上进行了测试,在其中我具有完全访问权限的取消链接和在 DocumentsContract.deleteDocument 的公共文件夹中。

DocumentsContract.deleteDocument 是如何使用 SAF 删除文件的唯一方法,还是有更快的方法可以恢复性能损失?

编辑:

我添加更多信息。 我植根并添加了 sdcard 修复程序,所以我现在可以直接写入 sdcard。 我的应用程序是模拟器,我不删除大文件夹,这不是我的情况,模拟器在这里和那里删除各种小文件。 这是真实的日志以及我如何使用它:

标准 c++ IO api

unlink(file);

SAF api c++

jstring string=jvmEnv->NewStringUTF(file);
int result = jvmEnv->CallIntMethod( jvmCallbackThread, JavaDeleteFile, string);
jvmEnv->DeleteLocalRef(string);

java

public int callbackDeleteFile(String path) {
    return SAFUtils.delete(path);
}

public static int delete(String path)
{
    try {            
        Uri uri = pathsCache.get(path);
        if (uri == null) {
            buildUri(path, true);
            uri = Uri.parse(builder1.toString());
            pathsCache.put(path, uri);
        }

        if (DocumentsContract.deleteDocument(resolver, uri)) {
            return 0;
        }
    } catch(Exception e) {
        e.printStackTrace();
    }

    return -1;
}

在 java 端我获取/构建 uri,之后我调用 DocumentContract,uri 操作大约需要 1ms,瓶颈是 DocumentContract.deleteDocument

2019-10-03 09:20:29.478 before uri get/build
2019-10-03 09:20:29.478 after uri get/build
2019-10-03 09:20:29.674 after DocumentContract.deleteDocument

使用 SAF 记录:

SAF 日志的意思是,从 c++ 跳转到 java,调用 DocumentContract.deleteDocument 并返回到 c++

2019-10-03 08:19:10.039 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/RAW10.ALF, before delete
2019-10-03 08:19:10.253 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/RAW10.ALF, after delete

2019-10-03 08:19:10.254 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/RAW10.MOD, before delete
2019-10-03 08:19:10.475 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/RAW10.MOD, after delete

2019-10-03 08:19:12.602 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/LOC_GODS.DAT, before delete
2019-10-03 08:19:12.786 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/LOC_GODS.DAT, after delete

2019-10-03 08:19:12.829 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/UNP.$$$, before delete
2019-10-03 08:19:12.990 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/UNP.$$$, after delete

2019-10-03 08:19:13.076 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/LOC_DEIT.DAT, before delete
2019-10-03 08:19:13.221 : SAF DeleteFile /storage/0000-0000/TEST/TEMP/LOC_DEIT.DAT, after delete

取消链接登录

纯c++侧

2019-10-03 08:58:03.008 : UNLINK /storage/0000-0000/TEST/TEMP/RAW10.ALF, before unlink
2019-10-03 08:58:03.009 : UNLINK /storage/0000-0000/TEST/TEMP/RAW10.ALF, after unlink

2019-10-03 08:58:03.010 : UNLINK /storage/0000-0000/TEST/TEMP/RAW10.MOD, before unlink
2019-10-03 08:58:03.010 : UNLINK /storage/0000-0000/TEST/TEMP/RAW10.MOD, after unlink

2019-10-03 08:58:05.084 : UNLINK /storage/0000-0000/TEST/TEMP/LOC_GODS.DAT, before unlink
2019-10-03 08:58:05.085 : UNLINK /storage/0000-0000/TEST/TEMP/LOC_GODS.DAT, after unlink

2019-10-03 08:58:05.099 : UNLINK /storage/0000-0000/TEST/TEMP/UNP.$$$, before unlink
2019-10-03 08:58:05.099 : UNLINK /storage/0000-0000/TEST/TEMP/UNP.$$$, after unlink

2019-10-03 08:58:05.116 : UNLINK /storage/0000-0000/TEST/TEMP/LOC_DEIT.DAT, before unlink
2019-10-03 08:58:05.116 : UNLINK /storage/0000-0000/TEST/TEMP/LOC_DEIT.DAT, after unlink

使用文件 class(在 Java 中)一个包含 200.jpg 文件的文件夹,每个文件大约 2.5MB 会在 5 秒内被删除。

使用 DocumentsContract 可以在 10 秒内完成。 (每个文件 50 毫秒)

请给出删除大文件夹的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM