|
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