尝试将 logcat 保存到 Android 11 中的文件

Posted

技术标签:

【中文标题】尝试将 logcat 保存到 Android 11 中的文件【英文标题】:Trying to save logcat to file in Android 11 【发布时间】:2021-12-22 05:07:30 【问题描述】:

我试图将 logcat 的内容保存到文件中,但在 android 11 中失败。这就是我所拥有的:

private static final String APP_DIRECTORY = Environment.getExternalStorageDirectory() + "/MYAPPFOLDER";
private static final String LOGS_FOLDER = "/logs";
private static final String FLAVOR_FOLDER = "/" + BuildConfig.FLAVOR;

private static final int MAX_HOURS_IN_STORAGE = 360;

private static final int MAX_MB_IN_STORAGE = 100;

private static final int LOG_FILES_TO_SEND = 4;

private static Process process;

@Inject
public LogRegisterImpl() 


@Override
public void initLogRegister() throws ExternalMediaNotWritableException 

    checkExternalStorageWritable();

    if (process == null) 

        File appDirectory = new File(APP_DIRECTORY);
        File logDirectory = new File(appDirectory + LOGS_FOLDER);
        File flavorDirectory = new File(logDirectory + FLAVOR_FOLDER);
        // create app folder
        if (!appDirectory.exists()) 
            appDirectory.mkdirs();
        
        // create log folder
        if (!logDirectory.exists()) 
            logDirectory.mkdirs();
        

        // create flavor folder
        if (!flavorDirectory.exists()) 
            flavorDirectory.mkdirs();
        
        ArrayList fileList = getAllFilesInDir(flavorDirectory);
        for (Object f : fileList) 
            deleteIfOlder((File) f, System.currentTimeMillis());
        

        File logFile = new File(flavorDirectory, "log_" + DateUtils.getFileDate(new Date()) + "_" + BuildConfig.VERSION_NAME + "_" + BuildConfig.FLAVOR);

        // clear the previous logcat and then write the new one to the file
        try 
            Runtime.getRuntime().exec("logcat -c");
            process = Runtime.getRuntime().exec("logcat -v time -r " + 1024 * MAX_MB_IN_STORAGE + " -f " + logFile + " " + BuildConfig.APPLICATION_ID );
         catch (IOException e) 
            e.printStackTrace();
        

    

我的 file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="my_files" path="/" />
<external-path name="logs" path="MYAPPFOLDER" />
</paths>

和文件提供者:

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="$applicationId.provider"
            android:exported="false"
            android:grantUriPermissions="true">
        <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
    </provider>

我调试过,logFile对象不为null,但是进程没有往文件里写任何东西,文件也没有创建。

我正在使用具有 API 30 的模拟器。

【问题讨论】:

if (!appDirectory.exists()) appDirectory.mkdirs(); Change to if (!appDirectory.exists()) if ( !appDirectory.mkdirs() ) Toast( .. sorry could not create directory..); return; 这样做会导致所有对 mkdirs() 的调用。 and the file is not created. 并没有创建目录? 【参考方案1】:

私有静态最终字符串 APP_DIRECTORY = Environment.getExternalStorageDirectory() + "/MYAPPFOLDER";

您无法使用 sdk 30 设备在外部存储的根目录中创建文件夹。

改为:

 private static final String APP_DIRECTORY = 
       Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + "/MYAPPFOLDER";

【讨论】:

以上是关于尝试将 logcat 保存到 Android 11 中的文件的主要内容,如果未能解决你的问题,请参考以下文章

Android - 将 logcat 保存到文件并限制文件大小

如何把android开发的时候把LogCat里的内容复制出来?如果不能复制,要是转储到文件中请说明详细步骤?

怎么把eclipse logcat保存到本地

使用 logcat Android Studio 记录错误

将 system.out 重定向到 logcat [重复]

eclipse android Logcat 未显示“已保存的过滤器”面板