diff --git a/static/app/views/preprod/buildDetails/main/buildDetailsMainContent.tsx b/static/app/views/preprod/buildDetails/main/buildDetailsMainContent.tsx
index 3d0c93cb54ceb2..21efc78a8706b8 100644
--- a/static/app/views/preprod/buildDetails/main/buildDetailsMainContent.tsx
+++ b/static/app/views/preprod/buildDetails/main/buildDetailsMainContent.tsx
@@ -211,6 +211,30 @@ export function BuildDetailsMainContent(props: BuildDetailsMainContentProps) {
const missingDsymBinaries =
buildDetailsData?.app_info?.apple_app_info?.missing_dsym_binaries;
+ const missingProguardMapping =
+ buildDetailsData?.app_info?.android_app_info?.has_proguard_mapping === false;
+
+ const getAlertMessage = () => {
+ if (missingDsymBinaries && missingDsymBinaries.length > 0) {
+ if (missingDsymBinaries?.length === 1) {
+ return t(
+ 'Missing debug symbols for some binaries (%s). Those binaries will not have a detailed breakdown.',
+ missingDsymBinaries[0]
+ );
+ }
+ return t(
+ 'Missing debug symbols for some binaries (%s and others). Those binaries will not have a detailed breakdown.',
+ missingDsymBinaries[0]
+ );
+ }
+
+ if (missingProguardMapping) {
+ return t('Missing proguard mapping. Dex will not have a detailed breakdown.');
+ }
+
+ return undefined;
+ };
+
// Filter data based on search query and categories
const filteredRoot = filterTreemapElement(
appSizeData.treemap.root,
@@ -234,7 +258,7 @@ export function BuildDetailsMainContent(props: BuildDetailsMainContentProps) {
root={filteredTreemapData.root}
searchQuery={searchQuery || ''}
unfilteredRoot={appSizeData.treemap.root}
- missingDsymBinaries={missingDsymBinaries}
+ alertMessage={getAlertMessage()}
onSearchChange={value => setSearchQuery(value || undefined)}
/>
) : (
@@ -249,7 +273,7 @@ export function BuildDetailsMainContent(props: BuildDetailsMainContentProps) {
root={filteredTreemapData.root}
searchQuery={searchQuery || ''}
unfilteredRoot={appSizeData.treemap.root}
- missingDsymBinaries={missingDsymBinaries}
+ alertMessage={getAlertMessage()}
onSearchChange={value => setSearchQuery(value || undefined)}
/>
) : (
diff --git a/static/app/views/preprod/components/visualizations/appSizeTreemap.tsx b/static/app/views/preprod/components/visualizations/appSizeTreemap.tsx
index 8c5feae4473308..22439a4219908f 100644
--- a/static/app/views/preprod/components/visualizations/appSizeTreemap.tsx
+++ b/static/app/views/preprod/components/visualizations/appSizeTreemap.tsx
@@ -22,7 +22,7 @@ import {filterTreemapElement} from 'sentry/views/preprod/utils/treemapFiltering'
interface AppSizeTreemapProps {
root: TreemapElement | null;
searchQuery: string;
- missingDsymBinaries?: string[];
+ alertMessage?: string;
onSearchChange?: (query: string) => void;
unfilteredRoot?: TreemapElement;
}
@@ -30,12 +30,12 @@ interface AppSizeTreemapProps {
function FullscreenModalContent({
unfilteredRoot,
initialSearch,
- missingDsymBinaries,
+ alertMessage,
onSearchChange,
}: {
initialSearch: string;
unfilteredRoot: TreemapElement;
- missingDsymBinaries?: string[];
+ alertMessage?: string;
onSearchChange?: (query: string) => void;
}) {
const [localSearch, setLocalSearch] = useState(initialSearch);
@@ -74,7 +74,7 @@ function FullscreenModalContent({
@@ -83,7 +83,7 @@ function FullscreenModalContent({
export function AppSizeTreemap(props: AppSizeTreemapProps) {
const theme = useTheme();
- const {root, searchQuery, unfilteredRoot, missingDsymBinaries, onSearchChange} = props;
+ const {root, searchQuery, unfilteredRoot, alertMessage, onSearchChange} = props;
const appSizeCategoryInfo = getAppSizeCategoryInfo(theme);
const renderingContext = useContext(ChartRenderingContext);
const isFullscreen = renderingContext?.isFullscreen ?? false;
@@ -314,24 +314,9 @@ export function AppSizeTreemap(props: AppSizeTreemapProps) {
},
};
- const hasMissingDsyms = missingDsymBinaries && missingDsymBinaries.length > 0;
-
- const getBinariesMessage = () => {
- if (missingDsymBinaries?.length === 1) {
- return t(
- 'Missing debug symbols for some binaries (%s). Those binaries will not have a detailed breakdown.',
- missingDsymBinaries[0]
- );
- }
- return t(
- 'Missing debug symbols for some binaries (%s and others). Those binaries will not have a detailed breakdown.',
- missingDsymBinaries![0]
- );
- };
-
return (
- {hasMissingDsyms && {getBinariesMessage()}}
+ {alertMessage && {alertMessage}}
) : (
@@ -387,7 +372,7 @@ export function AppSizeTreemap(props: AppSizeTreemapProps) {
),
diff --git a/static/app/views/preprod/types/buildDetailsTypes.ts b/static/app/views/preprod/types/buildDetailsTypes.ts
index 46185384b570ab..41cdccea695152 100644
--- a/static/app/views/preprod/types/buildDetailsTypes.ts
+++ b/static/app/views/preprod/types/buildDetailsTypes.ts
@@ -9,6 +9,7 @@ export interface BuildDetailsApiResponse {
}
export interface BuildDetailsAppInfo {
+ android_app_info?: AndroidAppInfo | null;
app_id?: string | null;
apple_app_info?: AppleAppInfo | null;
artifact_type?: BuildDetailsArtifactType | null;
@@ -26,6 +27,10 @@ interface AppleAppInfo {
missing_dsym_binaries?: string[];
}
+interface AndroidAppInfo {
+ has_proguard_mapping?: boolean;
+}
+
export interface BuildDetailsVcsInfo {
base_ref?: string | null;
base_repo_name?: string | null;