- 28,932 files - Full Java source code - Smali files - Resources Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
253 lines
11 KiB
Java
253 lines
11 KiB
Java
package com.google.firebase.crashlytics.ndk;
|
|
|
|
import android.app.ActivityManager;
|
|
import android.app.ApplicationExitInfo;
|
|
import android.content.Context;
|
|
import android.os.Build;
|
|
import androidx.work.impl.utils.ForceStopRunnable$$ExternalSyntheticApiModelOutline1;
|
|
import com.google.firebase.crashlytics.internal.Logger;
|
|
import com.google.firebase.crashlytics.internal.common.CommonUtils;
|
|
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
|
|
import com.google.firebase.crashlytics.internal.model.StaticSessionData;
|
|
import com.google.firebase.crashlytics.internal.persistence.FileStore;
|
|
import com.google.firebase.crashlytics.ndk.SessionFiles;
|
|
import java.io.BufferedWriter;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStreamWriter;
|
|
import java.nio.charset.Charset;
|
|
import java.util.ArrayList;
|
|
import java.util.Base64;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.zip.GZIPOutputStream;
|
|
|
|
/* loaded from: classes3.dex */
|
|
public class CrashpadController {
|
|
public static final Charset UTF_8 = Charset.forName("UTF-8");
|
|
public final Context context;
|
|
public final FileStore fileStore;
|
|
public final NativeApi nativeApi;
|
|
|
|
public CrashpadController(Context context, NativeApi nativeApi, FileStore fileStore) {
|
|
this.context = context;
|
|
this.nativeApi = nativeApi;
|
|
this.fileStore = fileStore;
|
|
}
|
|
|
|
public boolean initialize(String str, String str2, long j, StaticSessionData staticSessionData) {
|
|
File nativeSessionDir = this.fileStore.getNativeSessionDir(str);
|
|
if (nativeSessionDir == null) {
|
|
return false;
|
|
}
|
|
try {
|
|
if (!this.nativeApi.initialize(nativeSessionDir.getCanonicalPath(), this.context.getAssets())) {
|
|
return false;
|
|
}
|
|
writeBeginSession(str, str2, j);
|
|
writeSessionApp(str, staticSessionData.appData());
|
|
writeSessionOs(str, staticSessionData.osData());
|
|
writeSessionDevice(str, staticSessionData.deviceData());
|
|
return true;
|
|
} catch (IOException e) {
|
|
Logger.getLogger().e("Error initializing Crashlytics NDK", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public boolean hasCrashDataForSession(String str) {
|
|
SessionFiles.NativeCore nativeCore = getFilesForSession(str).nativeCore;
|
|
return nativeCore != null && nativeCore.hasCore();
|
|
}
|
|
|
|
public SessionFiles getFilesForSession(String str) {
|
|
File nativeSessionDir = this.fileStore.getNativeSessionDir(str);
|
|
File file = new File(nativeSessionDir, "pending");
|
|
Logger.getLogger().v("Minidump directory: " + file.getAbsolutePath());
|
|
File singleFileWithExtension = getSingleFileWithExtension(file, ".dmp");
|
|
Logger logger = Logger.getLogger();
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("Minidump file ");
|
|
sb.append((singleFileWithExtension == null || !singleFileWithExtension.exists()) ? "does not exist" : "exists");
|
|
logger.v(sb.toString());
|
|
SessionFiles.Builder builder = new SessionFiles.Builder();
|
|
if (nativeSessionDir != null && nativeSessionDir.exists() && file.exists()) {
|
|
builder.nativeCore(getNativeCore(str, file)).metadataFile(getSingleFileWithExtension(nativeSessionDir, ".device_info")).sessionFile(new File(nativeSessionDir, "session.json")).appFile(new File(nativeSessionDir, "app.json")).deviceFile(new File(nativeSessionDir, "device.json")).osFile(new File(nativeSessionDir, "os.json"));
|
|
}
|
|
return builder.build();
|
|
}
|
|
|
|
public final SessionFiles.NativeCore getNativeCore(String str, File file) {
|
|
return new SessionFiles.NativeCore(getSingleFileWithExtension(file, ".dmp"), getApplicationExitInfo(str));
|
|
}
|
|
|
|
public final CrashlyticsReport.ApplicationExitInfo getApplicationExitInfo(String str) {
|
|
if (Build.VERSION.SDK_INT >= 31) {
|
|
return getNativeCrashApplicationExitInfo(str);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public final CrashlyticsReport.ApplicationExitInfo getNativeCrashApplicationExitInfo(String str) {
|
|
List historicalProcessExitReasons;
|
|
historicalProcessExitReasons = ((ActivityManager) this.context.getSystemService("activity")).getHistoricalProcessExitReasons(null, 0, 0);
|
|
File sessionFile = this.fileStore.getSessionFile(str, "start-time");
|
|
return getRelevantApplicationExitInfo(sessionFile == null ? System.currentTimeMillis() : sessionFile.lastModified(), historicalProcessExitReasons);
|
|
}
|
|
|
|
public final CrashlyticsReport.ApplicationExitInfo getRelevantApplicationExitInfo(long j, List list) {
|
|
int reason;
|
|
long timestamp;
|
|
ArrayList arrayList = new ArrayList();
|
|
Iterator it = list.iterator();
|
|
while (it.hasNext()) {
|
|
ApplicationExitInfo m = ForceStopRunnable$$ExternalSyntheticApiModelOutline1.m(it.next());
|
|
reason = m.getReason();
|
|
if (reason == 5) {
|
|
timestamp = m.getTimestamp();
|
|
if (timestamp >= j) {
|
|
arrayList.add(m);
|
|
}
|
|
}
|
|
}
|
|
if (arrayList.isEmpty()) {
|
|
return null;
|
|
}
|
|
return convertApplicationExitInfoToModel(ForceStopRunnable$$ExternalSyntheticApiModelOutline1.m(arrayList.get(0)));
|
|
}
|
|
|
|
public void writeBeginSession(String str, String str2, long j) {
|
|
writeSessionJsonFile(this.fileStore, str, SessionMetadataJsonSerializer.serializeBeginSession(str, str2, j), "session.json");
|
|
}
|
|
|
|
public void writeSessionApp(String str, StaticSessionData.AppData appData) {
|
|
writeSessionJsonFile(this.fileStore, str, SessionMetadataJsonSerializer.serializeSessionApp(appData.appIdentifier(), appData.versionCode(), appData.versionName(), appData.installUuid(), appData.deliveryMechanism(), appData.developmentPlatformProvider().getDevelopmentPlatform(), appData.developmentPlatformProvider().getDevelopmentPlatformVersion()), "app.json");
|
|
}
|
|
|
|
public void writeSessionOs(String str, StaticSessionData.OsData osData) {
|
|
writeSessionJsonFile(this.fileStore, str, SessionMetadataJsonSerializer.serializeSessionOs(osData.osRelease(), osData.osCodeName(), osData.isRooted()), "os.json");
|
|
}
|
|
|
|
public void writeSessionDevice(String str, StaticSessionData.DeviceData deviceData) {
|
|
writeSessionJsonFile(this.fileStore, str, SessionMetadataJsonSerializer.serializeSessionDevice(deviceData.arch(), deviceData.model(), deviceData.availableProcessors(), deviceData.totalRam(), deviceData.diskSpace(), deviceData.isEmulator(), deviceData.state(), deviceData.manufacturer(), deviceData.modelClass()), "device.json");
|
|
}
|
|
|
|
public static void writeSessionJsonFile(FileStore fileStore, String str, String str2, String str3) {
|
|
writeTextFile(new File(fileStore.getNativeSessionDir(str), str3), str2);
|
|
}
|
|
|
|
public static void writeTextFile(File file, String str) {
|
|
BufferedWriter bufferedWriter;
|
|
BufferedWriter bufferedWriter2 = null;
|
|
try {
|
|
bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), UTF_8));
|
|
} catch (IOException unused) {
|
|
} catch (Throwable th) {
|
|
th = th;
|
|
}
|
|
try {
|
|
bufferedWriter.write(str);
|
|
CommonUtils.closeOrLog(bufferedWriter, "Failed to close " + file);
|
|
} catch (IOException unused2) {
|
|
bufferedWriter2 = bufferedWriter;
|
|
CommonUtils.closeOrLog(bufferedWriter2, "Failed to close " + file);
|
|
} catch (Throwable th2) {
|
|
th = th2;
|
|
bufferedWriter2 = bufferedWriter;
|
|
CommonUtils.closeOrLog(bufferedWriter2, "Failed to close " + file);
|
|
throw th;
|
|
}
|
|
}
|
|
|
|
public static File getSingleFileWithExtension(File file, String str) {
|
|
File[] listFiles = file.listFiles();
|
|
if (listFiles == null) {
|
|
return null;
|
|
}
|
|
for (File file2 : listFiles) {
|
|
if (file2.getName().endsWith(str)) {
|
|
return file2;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static CrashlyticsReport.ApplicationExitInfo convertApplicationExitInfoToModel(ApplicationExitInfo applicationExitInfo) {
|
|
int importance;
|
|
String processName;
|
|
int reason;
|
|
long timestamp;
|
|
int pid;
|
|
long pss;
|
|
long rss;
|
|
CrashlyticsReport.ApplicationExitInfo.Builder builder = CrashlyticsReport.ApplicationExitInfo.builder();
|
|
importance = applicationExitInfo.getImportance();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder importance2 = builder.setImportance(importance);
|
|
processName = applicationExitInfo.getProcessName();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder processName2 = importance2.setProcessName(processName);
|
|
reason = applicationExitInfo.getReason();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder reasonCode = processName2.setReasonCode(reason);
|
|
timestamp = applicationExitInfo.getTimestamp();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder timestamp2 = reasonCode.setTimestamp(timestamp);
|
|
pid = applicationExitInfo.getPid();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder pid2 = timestamp2.setPid(pid);
|
|
pss = applicationExitInfo.getPss();
|
|
CrashlyticsReport.ApplicationExitInfo.Builder pss2 = pid2.setPss(pss);
|
|
rss = applicationExitInfo.getRss();
|
|
return pss2.setRss(rss).setTraceFile(getTraceFileFromApplicationExitInfo(applicationExitInfo)).build();
|
|
}
|
|
|
|
public static String getTraceFileFromApplicationExitInfo(ApplicationExitInfo applicationExitInfo) {
|
|
InputStream traceInputStream;
|
|
try {
|
|
traceInputStream = applicationExitInfo.getTraceInputStream();
|
|
return convertInputStreamToString(traceInputStream);
|
|
} catch (IOException unused) {
|
|
Logger.getLogger().w("Failed to get input stream from ApplicationExitInfo");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static String convertInputStreamToString(InputStream inputStream) {
|
|
if (inputStream == null) {
|
|
return null;
|
|
}
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
byte[] bArr = new byte[8192];
|
|
while (true) {
|
|
int read = inputStream.read(bArr);
|
|
if (read != -1) {
|
|
byteArrayOutputStream.write(bArr, 0, read);
|
|
} else {
|
|
return zipAndEncode(byteArrayOutputStream.toByteArray());
|
|
}
|
|
}
|
|
}
|
|
|
|
public static String zipAndEncode(byte[] bArr) {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
try {
|
|
GZIPOutputStream gZIPOutputStream = new GZIPOutputStream(byteArrayOutputStream);
|
|
try {
|
|
gZIPOutputStream.write(bArr);
|
|
gZIPOutputStream.finish();
|
|
String encodeToString = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
|
|
gZIPOutputStream.close();
|
|
byteArrayOutputStream.close();
|
|
return encodeToString;
|
|
} finally {
|
|
}
|
|
} catch (Throwable th) {
|
|
try {
|
|
byteArrayOutputStream.close();
|
|
} catch (Throwable th2) {
|
|
th.addSuppressed(th2);
|
|
}
|
|
throw th;
|
|
}
|
|
}
|
|
}
|