From 93682b8d6b3b4b61779f35f4bc9ed950f9a5fbc5 Mon Sep 17 00:00:00 2001 From: Matthew Robertson Date: Mon, 10 Mar 2025 16:40:18 -0400 Subject: [PATCH 1/3] Read version control info from Android resource --- .../internal/common/CommonUtils.java | 11 ++++++++ .../common/CrashlyticsController.java | 28 +++++++++++-------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CommonUtils.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CommonUtils.java index b29863f66c5..a116cf55542 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CommonUtils.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CommonUtils.java @@ -69,6 +69,8 @@ public class CommonUtils { "com.google.firebase.crashlytics.build_ids_arch"; static final String BUILD_IDS_BUILD_ID_RESOURCE_NAME = "com.google.firebase.crashlytics.build_ids_build_id"; + static final String VERSION_CONTROL_INFO_RESOURCE_NAME = + "com.google.firebase.crashlytics.version_control_info"; // TODO: Maybe move this method into a more appropriate class. public static SharedPreferences getSharedPrefs(Context context) { @@ -525,6 +527,15 @@ public static List getBuildIdInfo(Context context) { return buildIdInfoList; } + @Nullable + public static String getVersionControlInfo(Context context) { + int id = getResourcesIdentifier(context, VERSION_CONTROL_INFO_RESOURCE_NAME, "string"); + if (id == 0) { + return null; + } + return context.getResources().getString(id); + } + public static void closeQuietly(Closeable closeable) { if (closeable != null) { try { diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java index b55a26678d4..f1694d2d857 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java @@ -48,6 +48,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -77,6 +78,8 @@ class CrashlyticsController { private static final String VERSION_CONTROL_INFO_FILE = "version-control-info.textproto"; private static final String META_INF_FOLDER = "META-INF/"; + private static final Charset UTF_8 = Charset.forName("UTF-8"); + private final Context context; private final DataCollectionArbiter dataCollectionArbiter; private final CrashlyticsFileMarker crashMarker; @@ -628,13 +631,22 @@ void saveVersionControlInfo() { } String getVersionControlInfo() throws IOException { + // Attempt to read from an Android string resource + String versionControlInfo = CommonUtils.getVersionControlInfo(context); + if (versionControlInfo != null) { + Logger.getLogger().d("Read version control info from string resource"); + return Base64.encodeToString(versionControlInfo.getBytes(UTF_8), 0); + } + + // Fallback to reading the file InputStream is = getResourceAsStream(META_INF_FOLDER + VERSION_CONTROL_INFO_FILE); - if (is == null) { - return null; + if (is != null) { + Logger.getLogger().d("Read version control info from file"); + return Base64.encodeToString(readResource(is), 0); } - Logger.getLogger().d("Read version control info"); - return Base64.encodeToString(readResource(is), 0); + Logger.getLogger().i("No version control information found"); + return null; } private InputStream getResourceAsStream(String resource) { @@ -644,13 +656,7 @@ private InputStream getResourceAsStream(String resource) { return null; } - InputStream is = classLoader.getResourceAsStream(resource); - if (is == null) { - Logger.getLogger().i("No version control information found"); - return null; - } - - return is; + return classLoader.getResourceAsStream(resource); } private static byte[] readResource(InputStream is) throws IOException { From adb3efe9a75c2fb9ea64134b34c650cd159760fb Mon Sep 17 00:00:00 2001 From: Matthew Robertson Date: Mon, 10 Mar 2025 16:53:13 -0400 Subject: [PATCH 2/3] Changelog --- firebase-crashlytics/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase-crashlytics/CHANGELOG.md b/firebase-crashlytics/CHANGELOG.md index a6e5e087b60..c0e6ddce86b 100644 --- a/firebase-crashlytics/CHANGELOG.md +++ b/firebase-crashlytics/CHANGELOG.md @@ -1,4 +1,5 @@ # Unreleased +* [changed] Internal changes to read version control info more efficiently [6754] * [fixed] Fixed NoSuchMethodError when getting process info on Android 13 [#6720] # 19.4.1 From 3831b526c9f1a7d0e2d8f1cb66a79fcdb22b906f Mon Sep 17 00:00:00 2001 From: Matthew Robertson Date: Tue, 11 Mar 2025 08:56:14 -0400 Subject: [PATCH 3/3] Use try with resources --- .../internal/common/CrashlyticsController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java index f1694d2d857..da28e8708db 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java @@ -639,10 +639,11 @@ String getVersionControlInfo() throws IOException { } // Fallback to reading the file - InputStream is = getResourceAsStream(META_INF_FOLDER + VERSION_CONTROL_INFO_FILE); - if (is != null) { - Logger.getLogger().d("Read version control info from file"); - return Base64.encodeToString(readResource(is), 0); + try (InputStream is = getResourceAsStream(META_INF_FOLDER + VERSION_CONTROL_INFO_FILE)) { + if (is != null) { + Logger.getLogger().d("Read version control info from file"); + return Base64.encodeToString(readResource(is), 0); + } } Logger.getLogger().i("No version control information found");