Skip to content

Commit beba014

Browse files
authored
Add internal API to retrieve Android scope data (#2814)
1 parent 3baa73f commit beba014

File tree

69 files changed

+2076
-778
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+2076
-778
lines changed

sentry-android-core/api/sentry-android-core.api

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ public final class io/sentry/android/core/BuildInfoProvider {
128128
public fun isEmulator ()Ljava/lang/Boolean;
129129
}
130130

131+
public final class io/sentry/android/core/ContextUtils {
132+
}
133+
131134
public class io/sentry/android/core/CurrentActivityHolder {
132135
public fun clearActivity ()V
133136
public fun getActivity ()Landroid/app/Activity;
@@ -148,6 +151,15 @@ public final class io/sentry/android/core/CurrentActivityIntegration : android/a
148151
public fun register (Lio/sentry/IHub;Lio/sentry/SentryOptions;)V
149152
}
150153

154+
public final class io/sentry/android/core/DeviceInfoUtil {
155+
public fun <init> (Landroid/content/Context;Lio/sentry/android/core/SentryAndroidOptions;)V
156+
public fun collectDeviceInformation (ZZ)Lio/sentry/protocol/Device;
157+
public static fun getInstance (Landroid/content/Context;Lio/sentry/android/core/SentryAndroidOptions;)Lio/sentry/android/core/DeviceInfoUtil;
158+
public fun getOperatingSystem ()Lio/sentry/protocol/OperatingSystem;
159+
public fun getSideLoadedInfo ()Lio/sentry/android/core/ContextUtils$SideLoadedInfo;
160+
public static fun resetInstance ()V
161+
}
162+
151163
public abstract class io/sentry/android/core/EnvelopeFileObserverIntegration : io/sentry/Integration, java/io/Closeable {
152164
public fun <init> ()V
153165
public fun close ()V
@@ -160,6 +172,13 @@ public abstract interface class io/sentry/android/core/IDebugImagesLoader {
160172
public abstract fun loadDebugImages ()Ljava/util/List;
161173
}
162174

175+
public final class io/sentry/android/core/InternalSentrySdk {
176+
public fun <init> ()V
177+
public static fun captureEnvelope ([B)Lio/sentry/protocol/SentryId;
178+
public static fun getCurrentScope ()Lio/sentry/Scope;
179+
public static fun serializeScope (Landroid/content/Context;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/Scope;)Ljava/util/Map;
180+
}
181+
163182
public final class io/sentry/android/core/LoadClass {
164183
public fun <init> ()V
165184
public fun isClassAvailable (Ljava/lang/String;Lio/sentry/ILogger;)Z

sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,11 +517,12 @@ private void mergeUser(final @NotNull SentryBaseEvent event) {
517517

518518
private void setSideLoadedInfo(final @NotNull SentryBaseEvent event) {
519519
try {
520-
final Map<String, String> sideLoadedInfo =
521-
ContextUtils.getSideLoadedInfo(context, options.getLogger(), buildInfoProvider);
520+
final ContextUtils.SideLoadedInfo sideLoadedInfo =
521+
ContextUtils.retrieveSideLoadedInfo(context, options.getLogger(), buildInfoProvider);
522522

523523
if (sideLoadedInfo != null) {
524-
for (final Map.Entry<String, String> entry : sideLoadedInfo.entrySet()) {
524+
final @NotNull Map<String, String> tags = sideLoadedInfo.asTags();
525+
for (Map.Entry<String, String> entry : tags.entrySet()) {
525526
event.setTag(entry.getKey(), entry.getValue());
526527
}
527528
}

sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
44
import static android.content.Context.ACTIVITY_SERVICE;
5+
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
56

67
import android.annotation.SuppressLint;
78
import android.app.ActivityManager;
@@ -15,17 +16,47 @@
1516
import android.util.DisplayMetrics;
1617
import io.sentry.ILogger;
1718
import io.sentry.SentryLevel;
19+
import io.sentry.protocol.App;
1820
import java.io.BufferedReader;
1921
import java.io.File;
2022
import java.io.FileReader;
2123
import java.io.IOException;
2224
import java.util.HashMap;
2325
import java.util.List;
2426
import java.util.Map;
27+
import org.jetbrains.annotations.ApiStatus;
2528
import org.jetbrains.annotations.NotNull;
2629
import org.jetbrains.annotations.Nullable;
2730

28-
final class ContextUtils {
31+
@ApiStatus.Internal
32+
public final class ContextUtils {
33+
34+
static class SideLoadedInfo {
35+
private final boolean isSideLoaded;
36+
private final @Nullable String installerStore;
37+
38+
public SideLoadedInfo(final boolean isSideLoaded, final @Nullable String installerStore) {
39+
this.isSideLoaded = isSideLoaded;
40+
this.installerStore = installerStore;
41+
}
42+
43+
public boolean isSideLoaded() {
44+
return isSideLoaded;
45+
}
46+
47+
public @Nullable String getInstallerStore() {
48+
return installerStore;
49+
}
50+
51+
public @NotNull Map<String, String> asTags() {
52+
final Map<String, String> data = new HashMap<>();
53+
data.put("isSideLoaded", String.valueOf(isSideLoaded));
54+
if (installerStore != null) {
55+
data.put("installerStore", installerStore);
56+
}
57+
return data;
58+
}
59+
}
2960

3061
private ContextUtils() {}
3162

@@ -187,8 +218,8 @@ static boolean isForegroundImportance(final @NotNull Context context) {
187218
return defaultVersion;
188219
}
189220

190-
@SuppressWarnings("deprecation")
191-
static @Nullable Map<String, String> getSideLoadedInfo(
221+
@SuppressWarnings({"deprecation"})
222+
static @Nullable SideLoadedInfo retrieveSideLoadedInfo(
192223
final @NotNull Context context,
193224
final @NotNull ILogger logger,
194225
final @NotNull BuildInfoProvider buildInfoProvider) {
@@ -202,20 +233,10 @@ static boolean isForegroundImportance(final @NotNull Context context) {
202233

203234
// getInstallSourceInfo requires INSTALL_PACKAGES permission which is only given to system
204235
// apps.
236+
// if it's installed via adb, system apps or untrusted sources
237+
// could be amazon, google play etc - or null in case of sideload
205238
final String installerPackageName = packageManager.getInstallerPackageName(packageName);
206-
207-
final Map<String, String> sideLoadedInfo = new HashMap<>();
208-
209-
if (installerPackageName != null) {
210-
sideLoadedInfo.put("isSideLoaded", "false");
211-
// could be amazon, google play etc
212-
sideLoadedInfo.put("installerStore", installerPackageName);
213-
} else {
214-
// if it's installed via adb, system apps or untrusted sources
215-
sideLoadedInfo.put("isSideLoaded", "true");
216-
}
217-
218-
return sideLoadedInfo;
239+
return new SideLoadedInfo(installerPackageName == null, installerPackageName);
219240
}
220241
} catch (IllegalArgumentException e) {
221242
// it'll never be thrown as we are querying its own App's package.
@@ -324,4 +345,37 @@ static boolean isForegroundImportance(final @NotNull Context context) {
324345
return null;
325346
}
326347
}
348+
349+
// we perform an if-check for that, but lint fails to recognize
350+
@SuppressLint("NewApi")
351+
static void setAppPackageInfo(
352+
final @NotNull PackageInfo packageInfo,
353+
final @NotNull BuildInfoProvider buildInfoProvider,
354+
final @NotNull App app) {
355+
app.setAppIdentifier(packageInfo.packageName);
356+
app.setAppVersion(packageInfo.versionName);
357+
app.setAppBuild(ContextUtils.getVersionCode(packageInfo, buildInfoProvider));
358+
359+
if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN) {
360+
final Map<String, String> permissions = new HashMap<>();
361+
final String[] requestedPermissions = packageInfo.requestedPermissions;
362+
final int[] requestedPermissionsFlags = packageInfo.requestedPermissionsFlags;
363+
364+
if (requestedPermissions != null
365+
&& requestedPermissions.length > 0
366+
&& requestedPermissionsFlags != null
367+
&& requestedPermissionsFlags.length > 0) {
368+
for (int i = 0; i < requestedPermissions.length; i++) {
369+
String permission = requestedPermissions[i];
370+
permission = permission.substring(permission.lastIndexOf('.') + 1);
371+
372+
final boolean granted =
373+
(requestedPermissionsFlags[i] & REQUESTED_PERMISSION_GRANTED)
374+
== REQUESTED_PERMISSION_GRANTED;
375+
permissions.put(permission, granted ? "granted" : "not_granted");
376+
}
377+
}
378+
app.setPermissions(permissions);
379+
}
380+
}
327381
}

0 commit comments

Comments
 (0)