package androidx.tracing; import android.annotation.SuppressLint; import android.util.Log; import androidx.annotation.NonNull; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public final class Trace { public static final String TAG = "Trace"; private static Method sAsyncTraceBeginMethod; private static Method sAsyncTraceEndMethod; private static Method sIsTagEnabledMethod; private static Method sTraceCounterMethod; private static long sTraceTagApp; private Trace() { } @SuppressLint({"NewApi"}) public static void beginAsyncSection(@NonNull String str, int i) { try { if (sAsyncTraceBeginMethod == null) { TraceApi29Impl.beginAsyncSection(str, i); return; } } catch (NoClassDefFoundError | NoSuchMethodError unused) { } beginAsyncSectionFallback(str, i); } private static void beginAsyncSectionFallback(@NonNull String str, int i) { try { if (sAsyncTraceBeginMethod == null) { sAsyncTraceBeginMethod = android.os.Trace.class.getMethod("asyncTraceBegin", Long.TYPE, String.class, Integer.TYPE); } sAsyncTraceBeginMethod.invoke(null, Long.valueOf(sTraceTagApp), str, Integer.valueOf(i)); } catch (Exception e) { handleException("asyncTraceBegin", e); } } public static void beginSection(@NonNull String str) { TraceApi18Impl.beginSection(str); } @SuppressLint({"NewApi"}) public static void endAsyncSection(@NonNull String str, int i) { try { if (sAsyncTraceEndMethod == null) { TraceApi29Impl.endAsyncSection(str, i); return; } } catch (NoClassDefFoundError | NoSuchMethodError unused) { } endAsyncSectionFallback(str, i); } private static void endAsyncSectionFallback(@NonNull String str, int i) { try { if (sAsyncTraceEndMethod == null) { sAsyncTraceEndMethod = android.os.Trace.class.getMethod("asyncTraceEnd", Long.TYPE, String.class, Integer.TYPE); } sAsyncTraceEndMethod.invoke(null, Long.valueOf(sTraceTagApp), str, Integer.valueOf(i)); } catch (Exception e) { handleException("asyncTraceEnd", e); } } public static void endSection() { TraceApi18Impl.endSection(); } private static void handleException(@NonNull String str, @NonNull Exception exc) { if (exc instanceof InvocationTargetException) { Throwable cause = exc.getCause(); if (cause instanceof RuntimeException) { throw ((RuntimeException) cause); } throw new RuntimeException(cause); } Log.v("Trace", "Unable to call " + str + " via reflection", exc); } @SuppressLint({"NewApi"}) public static boolean isEnabled() { try { if (sIsTagEnabledMethod == null) { return android.os.Trace.isEnabled(); } } catch (NoClassDefFoundError | NoSuchMethodError unused) { } return isEnabledFallback(); } private static boolean isEnabledFallback() { try { if (sIsTagEnabledMethod == null) { sTraceTagApp = android.os.Trace.class.getField("TRACE_TAG_APP").getLong(null); sIsTagEnabledMethod = android.os.Trace.class.getMethod("isTagEnabled", Long.TYPE); } return ((Boolean) sIsTagEnabledMethod.invoke(null, Long.valueOf(sTraceTagApp))).booleanValue(); } catch (Exception e) { handleException("isTagEnabled", e); return false; } } @SuppressLint({"NewApi"}) public static void setCounter(@NonNull String str, int i) { try { if (sTraceCounterMethod == null) { TraceApi29Impl.setCounter(str, i); return; } } catch (NoClassDefFoundError | NoSuchMethodError unused) { } setCounterFallback(str, i); } private static void setCounterFallback(@NonNull String str, int i) { try { if (sTraceCounterMethod == null) { sTraceCounterMethod = android.os.Trace.class.getMethod("traceCounter", Long.TYPE, String.class, Integer.TYPE); } sTraceCounterMethod.invoke(null, Long.valueOf(sTraceTagApp), str, Integer.valueOf(i)); } catch (Exception e) { handleException("traceCounter", e); } } }