From 1b65e0c01b92f48c84af5f78c9116d09429454cb Mon Sep 17 00:00:00 2001 From: Ryan Brooks Date: Thu, 30 Oct 2025 16:23:13 -0700 Subject: [PATCH] Wire up frontend for Android proguard mapping missing --- .../main/buildDetailsMainContent.tsx | 28 +++++++++++++++-- .../visualizations/appSizeTreemap.tsx | 31 +++++-------------- .../views/preprod/types/buildDetailsTypes.ts | 5 +++ 3 files changed, 39 insertions(+), 25 deletions(-) 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;