试图了解 Firebase Android Crashlytics Sdk 源代码

问题描述

我正在研究 Firebase Crashlytics Android SDK 源代码。我想学习如何更好地处理 File 和 multiThreading 的写入。 在研究期间,我发现了这个实用程序类:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.google.firebase.crashlytics.internal.common;

import com.google.firebase.crashlytics.internal.Logger;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

public final class ExecutorUtils {
    private static final long DEFAULT_TERMINATION_TIMEOUT = 2L;

    private ExecutorUtils() {
    }

    public static ExecutorService buildSingleThreadExecutorService(String name) {
        ThreadFactory threadFactory = getNamedThreadFactory(name);
        ExecutorService executor = Executors.newSingleThreadExecutor(threadFactory);
        addDelayedShutdownHook(name,executor);
        return executor;
    }

    public static ScheduledExecutorService buildSingleThreadScheduledExecutorService(String name) {
        ThreadFactory threadFactory = getNamedThreadFactory(name);
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(threadFactory);
        addDelayedShutdownHook(name,executor);
        return executor;
    }

    public static final ThreadFactory getNamedThreadFactory(final String threadNameTemplate) {
        final AtomicLong count = new AtomicLong(1L);
        return new ThreadFactory() {
            public Thread newThread(final Runnable runnable) {
                Thread thread = Executors.defaultThreadFactory().newThread(new BackgroundPriorityRunnable() {
                    public void onRun() {
                        runnable.run();
                    }
                });
                thread.setName(threadNameTemplate + count.getAndIncrement());
                return thread;
            }
        };
    }

    private static final void addDelayedShutdownHook(String serviceName,ExecutorService service) {
        addDelayedShutdownHook(serviceName,service,2L,TimeUnit.SECONDS);
    }

    public static final void addDelayedShutdownHook(final String serviceName,final ExecutorService service,final long terminationTimeout,final TimeUnit timeUnit) {
        Runtime.getRuntime().addShutdownHook(new Thread(new BackgroundPriorityRunnable() {
            public void onRun() {
                try {
                    Logger.getLogger().d("Executing shutdown hook for " + serviceName);
                    service.shutdown();
                    if (!service.awaitTermination(terminationTimeout,timeUnit)) {
                        Logger.getLogger().d(serviceName + " did not shut down in the allocated time. Requesting immediate shutdown.");
                        service.shutdownNow();
                    }
                } catch (InterruptedException var2) {
                    Logger.getLogger().d(String.format(Locale.US,"Interrupted while waiting for %s to shut down. Requesting immediate shutdown.",serviceName));
                    service.shutdownNow();
                }

            }
        },"Crashlytics Shutdown Hook for " + serviceName));
    }
}

和这个 Runnable 实现:

package com.google.firebase.crashlytics.internal.common;

import android.os.Process;

public abstract class BackgroundPriorityRunnable implements Runnable {
    public BackgroundPriorityRunnable() {
    }

    public final void run() {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
        this.onRun();
    }

    protected abstract void onRun();
}

我不明白 BackgroundPriorityRunnable。方法Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);是什么意思?如果他们没有将线程优先级设置为 Thread_priority_background 会发生什么?

另一个我不明白的函数是 addDelayedShutdownHook。它有什么作用 ?为什么要使用它?

我不知道 stackOverflow 是不是正确的地方,但我不知道在哪里可以帮助我理解这段代码:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...