Files
rr3-apk/decompiled/sources/com/google/firebase/crashlytics/ndk/CrashpadController.java
Daniel Elliott f9d20bb3fc Add decompiled APK source code (JADX)
- 28,932 files
- Full Java source code
- Smali files
- Resources

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-18 14:52:23 -08:00

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;
}
}
}