Add Discord community version (64-bit only)

- Added realracing3-community.apk (71.57 MB)
- Removed 32-bit support (armeabi-v7a)
- Only includes arm64-v8a libraries
- Decompiled source code included
- Added README-community.md with analysis
This commit is contained in:
2026-02-18 15:48:36 -08:00
parent c19eb3d7ff
commit c080f0d97f
26930 changed files with 2529574 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
package com.google.firebase.crashlytics.internal.settings;
import com.google.firebase.crashlytics.internal.Logger;
import com.google.firebase.crashlytics.internal.common.CommonUtils;
import com.google.firebase.crashlytics.internal.persistence.FileStore;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class CachedSettingsIo {
public final File cachedSettingsFile;
public final File getSettingsFile() {
return this.cachedSettingsFile;
}
public CachedSettingsIo(FileStore fileStore) {
this.cachedSettingsFile = fileStore.getCommonFile("com.crashlytics.settings.json");
}
public JSONObject readCachedSettings() {
Throwable th;
FileInputStream fileInputStream;
JSONObject jSONObject;
Logger.getLogger().d("Checking for cached settings...");
FileInputStream fileInputStream2 = null;
try {
try {
File settingsFile = getSettingsFile();
if (settingsFile.exists()) {
fileInputStream = new FileInputStream(settingsFile);
try {
jSONObject = new JSONObject(CommonUtils.streamToString(fileInputStream));
fileInputStream2 = fileInputStream;
} catch (Exception e) {
e = e;
Logger.getLogger().e("Failed to fetch cached settings", e);
CommonUtils.closeOrLog(fileInputStream, "Error while closing settings cache file.");
return null;
}
} else {
Logger.getLogger().v("Settings file does not exist.");
jSONObject = null;
}
CommonUtils.closeOrLog(fileInputStream2, "Error while closing settings cache file.");
return jSONObject;
} catch (Throwable th2) {
th = th2;
CommonUtils.closeOrLog(null, "Error while closing settings cache file.");
throw th;
}
} catch (Exception e2) {
e = e2;
fileInputStream = null;
} catch (Throwable th3) {
th = th3;
CommonUtils.closeOrLog(null, "Error while closing settings cache file.");
throw th;
}
}
public void writeCachedSettings(long j, JSONObject jSONObject) {
FileWriter fileWriter;
Logger.getLogger().v("Writing settings to cache file...");
if (jSONObject != null) {
FileWriter fileWriter2 = null;
try {
try {
jSONObject.put("expires_at", j);
fileWriter = new FileWriter(getSettingsFile());
} catch (Throwable th) {
th = th;
}
} catch (Exception e) {
e = e;
}
try {
fileWriter.write(jSONObject.toString());
fileWriter.flush();
CommonUtils.closeOrLog(fileWriter, "Failed to close settings writer.");
} catch (Exception e2) {
e = e2;
fileWriter2 = fileWriter;
Logger.getLogger().e("Failed to cache settings", e);
CommonUtils.closeOrLog(fileWriter2, "Failed to close settings writer.");
} catch (Throwable th2) {
th = th2;
fileWriter2 = fileWriter;
CommonUtils.closeOrLog(fileWriter2, "Failed to close settings writer.");
throw th;
}
}
}
}

View File

@@ -0,0 +1,18 @@
package com.google.firebase.crashlytics.internal.settings;
import com.firemint.realracing.Platform;
import com.google.firebase.crashlytics.internal.common.CurrentTimeProvider;
import com.google.firebase.crashlytics.internal.settings.Settings;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class DefaultSettingsJsonTransform implements SettingsJsonTransform {
@Override // com.google.firebase.crashlytics.internal.settings.SettingsJsonTransform
public Settings buildFromJson(CurrentTimeProvider currentTimeProvider, JSONObject jSONObject) {
return defaultSettings(currentTimeProvider);
}
public static Settings defaultSettings(CurrentTimeProvider currentTimeProvider) {
return new Settings(currentTimeProvider.getCurrentTimeMillis() + 3600000, new Settings.SessionData(8, 4), new Settings.FeatureFlagData(true, false, false), 0, Platform.INTERNET_CONNECTION_DELAY, 10.0d, 1.2d, 60);
}
}

View File

@@ -0,0 +1,110 @@
package com.google.firebase.crashlytics.internal.settings;
import android.text.TextUtils;
import com.facebook.share.internal.ShareConstants;
import com.google.firebase.crashlytics.internal.Logger;
import com.google.firebase.crashlytics.internal.common.CrashlyticsCore;
import com.google.firebase.crashlytics.internal.network.HttpGetRequest;
import com.google.firebase.crashlytics.internal.network.HttpRequestFactory;
import com.google.firebase.crashlytics.internal.network.HttpResponse;
import com.ironsource.f5;
import com.ironsource.nb;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class DefaultSettingsSpiCall implements SettingsSpiCall {
public final Logger logger;
public final HttpRequestFactory requestFactory;
public final String url;
public boolean requestWasSuccessful(int i) {
return i == 200 || i == 201 || i == 202 || i == 203;
}
public DefaultSettingsSpiCall(String str, HttpRequestFactory httpRequestFactory) {
this(str, httpRequestFactory, Logger.getLogger());
}
public DefaultSettingsSpiCall(String str, HttpRequestFactory httpRequestFactory, Logger logger) {
if (str == null) {
throw new IllegalArgumentException("url must not be null.");
}
this.logger = logger;
this.requestFactory = httpRequestFactory;
this.url = str;
}
public HttpGetRequest createHttpGetRequest(Map map) {
return this.requestFactory.buildHttpGetRequest(this.url, map).header("User-Agent", "Crashlytics Android SDK/" + CrashlyticsCore.getVersion()).header("X-CRASHLYTICS-DEVELOPER-TOKEN", "470fa2b4ae81cd56ecbcda9735803434cec591fa");
}
@Override // com.google.firebase.crashlytics.internal.settings.SettingsSpiCall
public JSONObject invoke(SettingsRequest settingsRequest, boolean z) {
if (!z) {
throw new RuntimeException("An invalid data collection token was used.");
}
try {
Map queryParamsFor = getQueryParamsFor(settingsRequest);
HttpGetRequest applyHeadersTo = applyHeadersTo(createHttpGetRequest(queryParamsFor), settingsRequest);
this.logger.d("Requesting settings from " + this.url);
this.logger.v("Settings query params were: " + queryParamsFor);
return handleResponse(applyHeadersTo.execute());
} catch (IOException e) {
this.logger.e("Settings request failed.", e);
return null;
}
}
public JSONObject handleResponse(HttpResponse httpResponse) {
int code = httpResponse.code();
this.logger.v("Settings response code was: " + code);
if (requestWasSuccessful(code)) {
return getJsonObjectFrom(httpResponse.body());
}
this.logger.e("Settings request failed; (status: " + code + ") from " + this.url);
return null;
}
public final JSONObject getJsonObjectFrom(String str) {
try {
return new JSONObject(str);
} catch (Exception e) {
this.logger.w("Failed to parse settings JSON from " + this.url, e);
this.logger.w("Settings response " + str);
return null;
}
}
public final Map getQueryParamsFor(SettingsRequest settingsRequest) {
HashMap hashMap = new HashMap();
hashMap.put("build_version", settingsRequest.buildVersion);
hashMap.put("display_version", settingsRequest.displayVersion);
hashMap.put(ShareConstants.FEED_SOURCE_PARAM, Integer.toString(settingsRequest.source));
String str = settingsRequest.instanceId;
if (!TextUtils.isEmpty(str)) {
hashMap.put(f5.o, str);
}
return hashMap;
}
public final HttpGetRequest applyHeadersTo(HttpGetRequest httpGetRequest, SettingsRequest settingsRequest) {
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-GOOGLE-APP-ID", settingsRequest.googleAppId);
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-API-CLIENT-TYPE", "android");
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-API-CLIENT-VERSION", CrashlyticsCore.getVersion());
applyNonNullHeader(httpGetRequest, "Accept", nb.L);
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-DEVICE-MODEL", settingsRequest.deviceModel);
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-OS-BUILD-VERSION", settingsRequest.osBuildVersion);
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-OS-DISPLAY-VERSION", settingsRequest.osDisplayVersion);
applyNonNullHeader(httpGetRequest, "X-CRASHLYTICS-INSTALLATION-ID", settingsRequest.installIdProvider.getInstallIds().getCrashlyticsInstallId());
return httpGetRequest;
}
public final void applyNonNullHeader(HttpGetRequest httpGetRequest, String str, String str2) {
if (str2 != null) {
httpGetRequest.header(str, str2);
}
}
}

View File

@@ -0,0 +1,50 @@
package com.google.firebase.crashlytics.internal.settings;
/* loaded from: classes3.dex */
public class Settings {
public final int cacheDuration;
public final long expiresAtMillis;
public final FeatureFlagData featureFlagData;
public final double onDemandBackoffBase;
public final int onDemandBackoffStepDurationSeconds;
public final double onDemandUploadRatePerMinute;
public final SessionData sessionData;
public final int settingsVersion;
public boolean isExpired(long j) {
return this.expiresAtMillis < j;
}
public static class SessionData {
public final int maxCompleteSessionsCount;
public final int maxCustomExceptionEvents;
public SessionData(int i, int i2) {
this.maxCustomExceptionEvents = i;
this.maxCompleteSessionsCount = i2;
}
}
public static class FeatureFlagData {
public final boolean collectAnrs;
public final boolean collectBuildIds;
public final boolean collectReports;
public FeatureFlagData(boolean z, boolean z2, boolean z3) {
this.collectReports = z;
this.collectAnrs = z2;
this.collectBuildIds = z3;
}
}
public Settings(long j, SessionData sessionData, FeatureFlagData featureFlagData, int i, int i2, double d, double d2, int i3) {
this.expiresAtMillis = j;
this.sessionData = sessionData;
this.featureFlagData = featureFlagData;
this.settingsVersion = i;
this.cacheDuration = i2;
this.onDemandUploadRatePerMinute = d;
this.onDemandBackoffBase = d2;
this.onDemandBackoffStepDurationSeconds = i3;
}
}

View File

@@ -0,0 +1,8 @@
package com.google.firebase.crashlytics.internal.settings;
/* loaded from: classes3.dex */
public enum SettingsCacheBehavior {
USE_CACHE,
SKIP_CACHE_LOOKUP,
IGNORE_CACHE_EXPIRATION
}

View File

@@ -0,0 +1,152 @@
package com.google.firebase.crashlytics.internal.settings;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.android.gms.tasks.SuccessContinuation;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.google.android.gms.tasks.Tasks;
import com.google.firebase.crashlytics.internal.Logger;
import com.google.firebase.crashlytics.internal.common.CommonUtils;
import com.google.firebase.crashlytics.internal.common.CurrentTimeProvider;
import com.google.firebase.crashlytics.internal.common.DataCollectionArbiter;
import com.google.firebase.crashlytics.internal.common.DeliveryMechanism;
import com.google.firebase.crashlytics.internal.common.IdManager;
import com.google.firebase.crashlytics.internal.common.SystemCurrentTimeProvider;
import com.google.firebase.crashlytics.internal.network.HttpRequestFactory;
import com.google.firebase.crashlytics.internal.persistence.FileStore;
import java.util.Locale;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicReference;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class SettingsController implements SettingsProvider {
public final CachedSettingsIo cachedSettingsIo;
public final Context context;
public final CurrentTimeProvider currentTimeProvider;
public final DataCollectionArbiter dataCollectionArbiter;
public final AtomicReference settings;
public final SettingsJsonParser settingsJsonParser;
public final SettingsRequest settingsRequest;
public final SettingsSpiCall settingsSpiCall;
public final AtomicReference settingsTask;
public SettingsController(Context context, SettingsRequest settingsRequest, CurrentTimeProvider currentTimeProvider, SettingsJsonParser settingsJsonParser, CachedSettingsIo cachedSettingsIo, SettingsSpiCall settingsSpiCall, DataCollectionArbiter dataCollectionArbiter) {
AtomicReference atomicReference = new AtomicReference();
this.settings = atomicReference;
this.settingsTask = new AtomicReference(new TaskCompletionSource());
this.context = context;
this.settingsRequest = settingsRequest;
this.currentTimeProvider = currentTimeProvider;
this.settingsJsonParser = settingsJsonParser;
this.cachedSettingsIo = cachedSettingsIo;
this.settingsSpiCall = settingsSpiCall;
this.dataCollectionArbiter = dataCollectionArbiter;
atomicReference.set(DefaultSettingsJsonTransform.defaultSettings(currentTimeProvider));
}
public static SettingsController create(Context context, String str, IdManager idManager, HttpRequestFactory httpRequestFactory, String str2, String str3, FileStore fileStore, DataCollectionArbiter dataCollectionArbiter) {
String installerPackageName = idManager.getInstallerPackageName();
SystemCurrentTimeProvider systemCurrentTimeProvider = new SystemCurrentTimeProvider();
return new SettingsController(context, new SettingsRequest(str, idManager.getModelName(), idManager.getOsBuildVersionString(), idManager.getOsDisplayVersionString(), idManager, CommonUtils.createInstanceIdFrom(CommonUtils.getMappingFileId(context), str, str3, str2), str3, str2, DeliveryMechanism.determineFrom(installerPackageName).getId()), systemCurrentTimeProvider, new SettingsJsonParser(systemCurrentTimeProvider), new CachedSettingsIo(fileStore), new DefaultSettingsSpiCall(String.format(Locale.US, "https://firebase-settings.crashlytics.com/spi/v2/platforms/android/gmp/%s/settings", str), httpRequestFactory), dataCollectionArbiter);
}
@Override // com.google.firebase.crashlytics.internal.settings.SettingsProvider
public Task getSettingsAsync() {
return ((TaskCompletionSource) this.settingsTask.get()).getTask();
}
@Override // com.google.firebase.crashlytics.internal.settings.SettingsProvider
public Settings getSettingsSync() {
return (Settings) this.settings.get();
}
public Task loadSettingsData(Executor executor) {
return loadSettingsData(SettingsCacheBehavior.USE_CACHE, executor);
}
public Task loadSettingsData(SettingsCacheBehavior settingsCacheBehavior, Executor executor) {
Settings cachedSettingsData;
if (!buildInstanceIdentifierChanged() && (cachedSettingsData = getCachedSettingsData(settingsCacheBehavior)) != null) {
this.settings.set(cachedSettingsData);
((TaskCompletionSource) this.settingsTask.get()).trySetResult(cachedSettingsData);
return Tasks.forResult(null);
}
Settings cachedSettingsData2 = getCachedSettingsData(SettingsCacheBehavior.IGNORE_CACHE_EXPIRATION);
if (cachedSettingsData2 != null) {
this.settings.set(cachedSettingsData2);
((TaskCompletionSource) this.settingsTask.get()).trySetResult(cachedSettingsData2);
}
return this.dataCollectionArbiter.waitForDataCollectionPermission(executor).onSuccessTask(executor, new SuccessContinuation() { // from class: com.google.firebase.crashlytics.internal.settings.SettingsController.1
@Override // com.google.android.gms.tasks.SuccessContinuation
public Task then(Void r5) {
JSONObject invoke = SettingsController.this.settingsSpiCall.invoke(SettingsController.this.settingsRequest, true);
if (invoke != null) {
Settings parseSettingsJson = SettingsController.this.settingsJsonParser.parseSettingsJson(invoke);
SettingsController.this.cachedSettingsIo.writeCachedSettings(parseSettingsJson.expiresAtMillis, invoke);
SettingsController.this.logSettings(invoke, "Loaded settings: ");
SettingsController settingsController = SettingsController.this;
settingsController.setStoredBuildInstanceIdentifier(settingsController.settingsRequest.instanceId);
SettingsController.this.settings.set(parseSettingsJson);
((TaskCompletionSource) SettingsController.this.settingsTask.get()).trySetResult(parseSettingsJson);
}
return Tasks.forResult(null);
}
});
}
public final Settings getCachedSettingsData(SettingsCacheBehavior settingsCacheBehavior) {
Settings settings = null;
try {
if (!SettingsCacheBehavior.SKIP_CACHE_LOOKUP.equals(settingsCacheBehavior)) {
JSONObject readCachedSettings = this.cachedSettingsIo.readCachedSettings();
if (readCachedSettings != null) {
Settings parseSettingsJson = this.settingsJsonParser.parseSettingsJson(readCachedSettings);
if (parseSettingsJson != null) {
logSettings(readCachedSettings, "Loaded cached settings: ");
long currentTimeMillis = this.currentTimeProvider.getCurrentTimeMillis();
if (!SettingsCacheBehavior.IGNORE_CACHE_EXPIRATION.equals(settingsCacheBehavior) && parseSettingsJson.isExpired(currentTimeMillis)) {
Logger.getLogger().v("Cached settings have expired.");
}
try {
Logger.getLogger().v("Returning cached settings.");
settings = parseSettingsJson;
} catch (Exception e) {
e = e;
settings = parseSettingsJson;
Logger.getLogger().e("Failed to get cached settings", e);
return settings;
}
} else {
Logger.getLogger().e("Failed to parse cached settings data.", null);
}
} else {
Logger.getLogger().d("No cached settings data found.");
}
}
} catch (Exception e2) {
e = e2;
}
return settings;
}
public final void logSettings(JSONObject jSONObject, String str) {
Logger.getLogger().d(str + jSONObject.toString());
}
public final String getStoredBuildInstanceIdentifier() {
return CommonUtils.getSharedPrefs(this.context).getString("existing_instance_identifier", "");
}
public final boolean setStoredBuildInstanceIdentifier(String str) {
SharedPreferences.Editor edit = CommonUtils.getSharedPrefs(this.context).edit();
edit.putString("existing_instance_identifier", str);
edit.apply();
return true;
}
public boolean buildInstanceIdentifierChanged() {
return !getStoredBuildInstanceIdentifier().equals(this.settingsRequest.instanceId);
}
}

View File

@@ -0,0 +1,26 @@
package com.google.firebase.crashlytics.internal.settings;
import com.google.firebase.crashlytics.internal.Logger;
import com.google.firebase.crashlytics.internal.common.CurrentTimeProvider;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class SettingsJsonParser {
public final CurrentTimeProvider currentTimeProvider;
public SettingsJsonParser(CurrentTimeProvider currentTimeProvider) {
this.currentTimeProvider = currentTimeProvider;
}
public Settings parseSettingsJson(JSONObject jSONObject) {
return getJsonTransformForVersion(jSONObject.getInt("settings_version")).buildFromJson(this.currentTimeProvider, jSONObject);
}
public static SettingsJsonTransform getJsonTransformForVersion(int i) {
if (i == 3) {
return new SettingsV3JsonTransform();
}
Logger.getLogger().e("Could not determine SettingsJsonTransform for settings version " + i + ". Using default settings values.");
return new DefaultSettingsJsonTransform();
}
}

View File

@@ -0,0 +1,9 @@
package com.google.firebase.crashlytics.internal.settings;
import com.google.firebase.crashlytics.internal.common.CurrentTimeProvider;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public interface SettingsJsonTransform {
Settings buildFromJson(CurrentTimeProvider currentTimeProvider, JSONObject jSONObject);
}

View File

@@ -0,0 +1,10 @@
package com.google.firebase.crashlytics.internal.settings;
import com.google.android.gms.tasks.Task;
/* loaded from: classes3.dex */
public interface SettingsProvider {
Task getSettingsAsync();
Settings getSettingsSync();
}

View File

@@ -0,0 +1,28 @@
package com.google.firebase.crashlytics.internal.settings;
import com.google.firebase.crashlytics.internal.common.InstallIdProvider;
/* loaded from: classes3.dex */
public class SettingsRequest {
public final String buildVersion;
public final String deviceModel;
public final String displayVersion;
public final String googleAppId;
public final InstallIdProvider installIdProvider;
public final String instanceId;
public final String osBuildVersion;
public final String osDisplayVersion;
public final int source;
public SettingsRequest(String str, String str2, String str3, String str4, InstallIdProvider installIdProvider, String str5, String str6, String str7, int i) {
this.googleAppId = str;
this.deviceModel = str2;
this.osBuildVersion = str3;
this.osDisplayVersion = str4;
this.installIdProvider = installIdProvider;
this.instanceId = str5;
this.displayVersion = str6;
this.buildVersion = str7;
this.source = i;
}
}

View File

@@ -0,0 +1,8 @@
package com.google.firebase.crashlytics.internal.settings;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public interface SettingsSpiCall {
JSONObject invoke(SettingsRequest settingsRequest, boolean z);
}

View File

@@ -0,0 +1,40 @@
package com.google.firebase.crashlytics.internal.settings;
import com.firemint.realracing.Platform;
import com.google.firebase.crashlytics.internal.common.CurrentTimeProvider;
import com.google.firebase.crashlytics.internal.settings.Settings;
import org.json.JSONObject;
/* loaded from: classes3.dex */
public class SettingsV3JsonTransform implements SettingsJsonTransform {
@Override // com.google.firebase.crashlytics.internal.settings.SettingsJsonTransform
public Settings buildFromJson(CurrentTimeProvider currentTimeProvider, JSONObject jSONObject) {
Settings.SessionData buildSessionDataFrom;
int optInt = jSONObject.optInt("settings_version", 0);
int optInt2 = jSONObject.optInt("cache_duration", Platform.INTERNET_CONNECTION_DELAY);
double optDouble = jSONObject.optDouble("on_demand_upload_rate_per_minute", 10.0d);
double optDouble2 = jSONObject.optDouble("on_demand_backoff_base", 1.2d);
int optInt3 = jSONObject.optInt("on_demand_backoff_step_duration_seconds", 60);
if (jSONObject.has("session")) {
buildSessionDataFrom = buildSessionDataFrom(jSONObject.getJSONObject("session"));
} else {
buildSessionDataFrom = buildSessionDataFrom(new JSONObject());
}
return new Settings(getExpiresAtFrom(currentTimeProvider, optInt2, jSONObject), buildSessionDataFrom, buildFeatureFlagDataFrom(jSONObject.getJSONObject("features")), optInt, optInt2, optDouble, optDouble2, optInt3);
}
public static Settings.FeatureFlagData buildFeatureFlagDataFrom(JSONObject jSONObject) {
return new Settings.FeatureFlagData(jSONObject.optBoolean("collect_reports", true), jSONObject.optBoolean("collect_anrs", false), jSONObject.optBoolean("collect_build_ids", false));
}
public static Settings.SessionData buildSessionDataFrom(JSONObject jSONObject) {
return new Settings.SessionData(jSONObject.optInt("max_custom_exception_events", 8), 4);
}
public static long getExpiresAtFrom(CurrentTimeProvider currentTimeProvider, long j, JSONObject jSONObject) {
if (jSONObject.has("expires_at")) {
return jSONObject.optLong("expires_at");
}
return currentTimeProvider.getCurrentTimeMillis() + (j * 1000);
}
}