| 
8 | 8 | from ..artifacts.android.zipped_aab import ZippedAAB  | 
9 | 9 | from ..artifacts.android.zipped_apk import ZippedAPK  | 
10 | 10 | from ..artifacts.artifact import AndroidArtifact  | 
11 |  | -from ..models.android import AndroidAnalysisResults, AndroidAppInfo  | 
 | 11 | +from ..insights.common import DuplicateFilesInsight  | 
 | 12 | +from ..insights.insight import InsightsInput  | 
 | 13 | +from ..models.android import AndroidAnalysisResults, AndroidAppInfo, AndroidInsightResults  | 
12 | 14 | from ..models.common import FileAnalysis, FileInfo  | 
13 | 15 | from ..models.treemap import FILE_TYPE_TO_TREEMAP_TYPE, TreemapType  | 
14 | 16 | from ..utils.file_utils import calculate_file_hash  | 
 | 
25 | 27 | class AndroidAnalyzer:  | 
26 | 28 |     """Analyzer for Android apps (.apk, .aab files)."""  | 
27 | 29 | 
 
  | 
 | 30 | +    def __init__(  | 
 | 31 | +        self,  | 
 | 32 | +        skip_insights: bool = False,  | 
 | 33 | +    ) -> None:  | 
 | 34 | +        """Args:  | 
 | 35 | +        skip_insights: Skip insights generation for faster analysis  | 
 | 36 | +        """  | 
 | 37 | +        self.skip_insights = skip_insights  | 
 | 38 | + | 
28 | 39 |     def analyze(self, artifact: AndroidArtifact) -> AndroidAnalysisResults:  | 
29 | 40 |         manifest_dict = artifact.get_manifest().model_dump()  | 
30 | 41 |         start_time = time.time()  | 
@@ -61,13 +72,26 @@ def analyze(self, artifact: AndroidArtifact) -> AndroidAnalysisResults:  | 
61 | 72 | 
 
  | 
62 | 73 |         treemap = treemap_builder.build_file_treemap(file_analysis)  | 
63 | 74 | 
 
  | 
 | 75 | +        insights: AndroidInsightResults | None = None  | 
 | 76 | +        if not self.skip_insights:  | 
 | 77 | +            logger.info("Generating insights from analysis results")  | 
 | 78 | +            insights_input = InsightsInput(  | 
 | 79 | +                app_info=app_info,  | 
 | 80 | +                file_analysis=file_analysis,  | 
 | 81 | +                treemap=treemap,  | 
 | 82 | +            )  | 
 | 83 | +            insights = AndroidInsightResults(  | 
 | 84 | +                duplicate_files=DuplicateFilesInsight().generate(insights_input),  | 
 | 85 | +            )  | 
 | 86 | + | 
64 | 87 |         analysis_duration = time.time() - start_time  | 
65 | 88 |         return AndroidAnalysisResults(  | 
66 | 89 |             generated_at=datetime.now(timezone.utc),  | 
67 | 90 |             analysis_duration=analysis_duration,  | 
68 | 91 |             app_info=app_info,  | 
69 | 92 |             treemap=treemap,  | 
70 | 93 |             file_analysis=file_analysis,  | 
 | 94 | +            insights=insights,  | 
71 | 95 |         )  | 
72 | 96 | 
 
  | 
73 | 97 |     def _get_file_analysis(self, apks: list[APK]) -> FileAnalysis:  | 
@@ -114,7 +138,7 @@ def _get_file_analysis(self, apks: list[APK]) -> FileAnalysis:  | 
114 | 138 |                             size=merged_size,  | 
115 | 139 |                             file_type=file_type,  | 
116 | 140 |                             treemap_type=treemap_type,  | 
117 |  | -                            # Intentionally igoring hash of merged file  | 
 | 141 | +                            # Intentionally ignoring hash of merged file  | 
118 | 142 |                             hash_md5="",  | 
119 | 143 |                         )  | 
120 | 144 |                         path_to_file_info[relative_path] = merged_file_info  | 
 | 
0 commit comments