Manar Abu Talib

60 papers B 2C 6Journal 30Unranked 21
YearRankTypeTitle / Venue / Authors
2026 J jnl
Clust. Comput.
Ayad Turky, Basma Alsaid, Manar Abu Talib, Qassim Nasir, Omnia Abu Waraga, Takua Mokhamed
2026 J jnl
Neural Comput. Appl.
Manar Abu Talib, Basma Alsaid, Ayad Turky, Qassim Nasir, Takua Mokhamed
2026 J jnl
Expert Syst. Appl.
Manar Abu Talib, Iman Ibrahim, Manar Anwer Abusirdaneh
2025 conf
ICAIIC
Manar Abu Talib, Sohail Abbas, Qassim Nasir, Essa Basaeed, Mohammed Al-Haidary
2025 C conf
DeSE
Huda AlGhussein, Abdullah Mustafa, Manar Abu Talib, Mohammed Azzeh, Ali Bou Nassif
2025 J jnl
J. Inf. Telecommun.
Sohail Abbas, Manar Abu Talib, Qasim Nasir, Omar Belal, Mohammed Al-Haidary, Ibtihal Ahmed
2025 J jnl
Intell. Syst. Appl.
Fatima Mohamad Dakalbab, Ayush Kumar, Manar Abu Talib, Qassim Nasir
2025 conf
BCCA
Sohail Abbas, Manar Abu Talib, Mohammad Adel Moufti, Ahmad Ziad Nouh Allan, Takua Mokhamed
2025 B conf
IWCMC
Manar Abu Talib, Anissa M. Bettayeb, Al Zahraa Sobhe Altayasinah, Fatima Mohamad Dakalbab
2025 J jnl
Multim. Tools Appl.
Manar Abu Talib, Qassim Nasir, Ali Bou Nassif, Norah Ba Fadhl, Omar Mohamed Gouda
2025 J jnl
Ecol. Informatics
Hiba Moideen, Manar Abu Talib, Nabil Mansour, Shaher Bano Mirza, Ali Bou Nassif, Simon Zerisenay Ghebremeskel, Fouad Lamghari, Yaman Afadar, Takua Mokhamed
2025 J jnl
Frontiers Comput. Sci.
Yasmeen Saleh, Manar Abu Talib, Qassim Nasir, Fatima Mohamad Dakalbab
2025 J jnl
Int. J. Mach. Learn. Cybern.
Bassel Soudan, Sohail Abbas, Ahmed Kubba, Omnia Abu Waraga, Manar Abu Talib, Qassim Nasir
2025 C conf
DeSE
Ahmed Ammar Kubba, Manar Abu Talib, Jibran Sualeh Muhammad, Ali Bou Nassif, Abdalla Sayed Mohamed, Darko Castven, Jens U. Marquardt
2024 J jnl
BMC Medical Informatics Decis. Mak.
Manar Abu Talib, Yaman Afadar, Qassim Nasir, Ali Bou Nassif, Haytham Hijazi, Ahmad Hasasneh
2024 conf
IS
Noora Alkharji, Hessa Almazrouei, Shaikha Alzaabi, Ali Bou Nassif, Mariame Elsalhy, Manar Abu Talib
2024 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Fatima Mohamad Dakalbab, Manar Abu Talib, Qassim Nasir, Tracy Saroufil
2024 J jnl
Educ. Inf. Technol.
Mohamed Al-Hemairy, Manar Abu Talib, Ather Khalil, Ahsan Zulfiqar, Takua Mohamed
2024 J jnl
Energy Inform.
Qassim Nasir, Manar Abu Talib, Muhammad Arbab Arshad, Tracy Ishak, Romaissa Berrim, Basma Alsaid, Youssef Badway, Omnia Abu Waraga
2024 C conf
DeSE
Noora Alkharji, Hessa Almazrouei, Shaikha Alzaabi, Ali Bou Nassif, Mariame Elsalhy, Manar Abu Talib
2024 B conf
IWCMC
Bayan Mahfood, Ayad Turky, Manar Abu Talib, Chaouki Ghenai
2024 conf
BCCA
Takua Mokhamed, Omnia Abu Waraga, Mohamed Al-Hemairy, Manar Abu Talib
2024 conf
ICCA
Fatima Alnaqbi, Reem Alnaqbi, Fatima Mohamad Dakalbab, Homaiza Saud Ahmad, Manar Abu Talib, Qassim Nasir
2024 J jnl
Trans. Emerg. Telecommun. Technol.
Sohail Abbas, Manar Abu Talib, Ibtihal Ahmed, Omar Belal
2024 conf
IS
Mariame Elsalhy, Manar Abu Talib, Sohail Abbas, Qassim Nasir
2024 J jnl
Neural Comput. Appl.
Manar Abu Talib, Ali Bou Nassif, Mohammad Azzeh, Yaser Alesh, Yaman Afadar
2024 C conf
DeSE
Mariam Alalili, Mohammed Bin Ali, Qassim Nasir, Manar Abu Talib
2024 J jnl
Int. J. Inf. Sec.
Sohail Abbas, Manar Abu Talib, Qassim Nasir, Sally Idhis, Mariam M. Alaboudi, Ali Mohamed
2024 conf
ICCA
Qassim Nasir, Sally Idhis, Manar Abu Talib
2024 J jnl
e Informatica Softw. Eng. J.
Mohammad Azzeh, Ali Bou Nassif, Manar Abu Talib, Hajra Iqbal
2024 conf
BCCA
Ahmad Ziad Nouh Allan, Asil M. Y. Albahnasawi, Takua Mokhamed, Sohail Abbas, Mohammad Adel Moufti, Manar Abu Talib
2024 conf
ICEED
Anissa M. Bettayeb, Manar Abu Talib, Razan I. Omer, Fatima Mohamad Dakalbab
2023 conf
ICSPIS
Mohamed Aly, Salma Fadaaq, Omnia Abu Waraga, Qassim Nasir, Manar Abu Talib
2023 J jnl
Eng. Appl. Artif. Intell.
Manar Abu Talib, Mohamed Abdallah, Abdulrahman Abdeljaber, Omnia Abu Waraga
2023 conf
ICR
Fatima Mohamad Dakalbab, Manar Abu Talib, Qassim Nasir
2023 J jnl
Sensors
Takua Mokhamed, Manar Abu Talib, Mohammad Moufti, Sohail Abbas, Faheem Khan
2022 J jnl
Comput. Secur.
Manar Abu Talib, Qassim Nasir, Ali Bou Nassif, Takua Mokhamed, Nafisa Ahmed, Bayan Mahfood
2022 conf
ICCCV
Seba Al Mokdad, Anas Al Houria, Manar Abu Talib, Mohammad Moufti, Ahmed Bouridane, Qassim Nasir
2022 J jnl
Artif. Intell. Medicine
Ali Bou Nassif, Manar Abu Talib, Qassim Nasir, Yaman Afadar, Omar Elgendy
2022 J jnl
CoRR
Ali Bou Nassif, Manar Abu Talib, Qassim Nasir, Yaman Afadar, Omar Elgendy
2022 J jnl
Adv. Eng. Informatics
Mohamed Abdallah, Manar Abu Talib, Mariam Hosny, Omnia Abu Waraga, Qassim Nasir, Muhammad Arbab Arshad
2022 J jnl
Sensors
Ali Bou Nassif, Qassim Nasir, Manar Abu Talib, Omar Mohamed Gouda
2022 conf
ICR
Rawhi Alrae, Manar Abu Talib, Qassim Nasir
2021 conf
IoTaIS
Dina J. Hejji, Manar Abu Talib, Ali Bou Nassif, Qassim Nasir, Ahmed Bouridane
2021 J jnl
Educ. Inf. Technol.
Manar Abu Talib, Anissa M. Bettayeb, Razan I. Omer
2021 ed.
ArabWIC
Manar Abu Talib, Laila Benhlima, Kaoutar El Maghraoui
2021 J jnl
Sensors
Sohail Abbas, Manar Abu Talib, Afaf Ahmed, Faheem Khan, Shabir Ahmad, Do-Hyeun Kim
2021 conf
ArabWIC
Asmaa Seyam, Ali Bou Nassif, Manar Abu Talib, Qassim Nasir, Bushra Al Blooshi
2021 conf
ArabWIC
Abdalkarim R. M. Seyam, Ali Bou Nassif, Qassim Nasir, Bushra Al Blooshi, Manar Abu Talib
2021 conf
CCCI
Youssef Mansour, Hamdan Hammad, Omnia Abu Waraga, Manar Abu Talib
2021 C conf
ISNCC
Alshaimaa Al Naqbi, Sheikha Salem Alyieliely, Manar Abu Talib, Qassim Nasir, Maamar Bettayeb, Chaouki Ghenai
2021 conf
ArabWIC
Meriem Bettayeb, Qassim Nasir, Manar Abu Talib
2021 C conf
DeSE
Omnia Abu Waraga, Abdulrahman Abdeljaber, Manar Abu Talib, Mohamed Abdallah
2021 J jnl
IEEE Access
Ali Bou Nassif, Manar Abu Talib, Qassim Nasir, Fatima Mohamad Dakalbab
2021 conf
ICSPIS
Mohammed Al-Haidary, Mhd Alaa Ajlouni, Manar Abu Talib, Sohail Abbas, Qassim Nasir, Essa Basaeed
2021 J jnl
Sensors
Haytham Hijazi, Manar Abu Talib, Ahmad Hasasneh, Ali Bou Nassif, Nafisa Ahmed, Qassim Nasir
2020 J jnl
Int. J. Syst. Assur. Eng. Manag.
Rawhi Alrae, Qassim Nasir, Manar Abu Talib
2020 conf
ICSPIS
Marwa Chendeb El Rai, Hussain Al-Ahmad, Omar Mohamed Gouda, Dina J. Jamal, Manar Abu Talib, Qassim Nasir
2020 J jnl
Int. J. Syst. Assur. Eng. Manag.
Ahmed Alketbi, Qassim Nasir, Manar Abu Talib
2020 conf
ICRAI
Mariam M. Alaboudi, Manar Abu Talib, Qassim Nasir
redb/extractors/decompiler/DecompileAPK.py
← Index redb/extractors/decompiler/DecompileAPK.py python
"""APK Code Analysis Extractor.

Decompiles and disassembles APK DEX bytecode at the method level,
producing per-method content and reference records analogous to
the Binary Ninja code_binja_* tables.

Uses androguard + JADX + apktool to replicate Binary Ninja analysis
depth for Android applications.
"""

import gc
import hashlib
import inspect
import logging
import os
import threading
import time
from datetime import datetime, timezone
from typing import Any, Dict, Optional

from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer
from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor


class DecompileAPK(Extractor):
    """APK code analysis extractor — produces multi-table ClickHouse export.

    Follows the same pattern as DecompileBinja for consistency.
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
        decompile_modules=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            known_benign=known_benign,
            known_malicious=known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.analysis_results = None
        self.analyzer = None
        self.filetype = filetype or "apk"
        self.decompile_modules = decompile_modules or {"all"}

        try:
            self.APK_DECOMPILE_TIMEOUT = int(
                os.getenv("APK_DECOMPILE_TIMEOUT", "600")
            )
        except ValueError:
            self.log.warning(
                "Invalid APK_DECOMPILE_TIMEOUT value, using default of 600 seconds"
            )
            self.APK_DECOMPILE_TIMEOUT = 600

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def calculate_md5(self, input_str):
        """Calculate MD5 hash of a string."""
        return hashlib.md5(input_str.encode("utf-8")).hexdigest()

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            if self.analyzer:
                self.analyzer.cleanup()
                self.analyzer = None
            gc.collect()
        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    def analyze_apk(self) -> Optional[Dict[str, Any]]:
        """Run APK code analysis and return results."""
        self.log.debug("Starting APK code analysis")
        try:
            self.analyzer = APKCodeAnalyzer(
                filepath=self.filepath,
                timeout=self.APK_DECOMPILE_TIMEOUT,
                log=self.log,
                decompile_modules=self.decompile_modules,
            )
            results = self.analyzer.extract()
            return results
        except Exception as e:
            self.log.error(f"Error in APK code analysis: {e}")
            import traceback
            self.log.error(f"Traceback: {traceback.format_exc()}")
            return None
        finally:
            self.cleanup_run()

    def extract(self):
        """Extract and process all analysis results.

        Uses daemon thread with timeout, same pattern as DecompileBinja.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        extraction_completed = False
        extraction_result = False
        extraction_error = None

        def do_extraction():
            nonlocal extraction_completed, extraction_result, extraction_error
            try:
                results = self.analyze_apk()
                if not results:
                    extraction_result = False
                else:
                    self.analysis_results = results
                    self.analysis_results["sha256"] = self.sha256
                    self.analysis_results["sha1"] = self.sha1
                    self.analysis_results["md5"] = self.md5
                    extraction_result = True
            except Exception as e:
                extraction_error = e
                extraction_result = False
            finally:
                extraction_completed = True

        extraction_thread = threading.Thread(target=do_extraction)
        extraction_thread.daemon = True
        extraction_thread.start()

        start_time = time.time()
        while (
            not extraction_completed
            and (time.time() - start_time) < self.APK_DECOMPILE_TIMEOUT
        ):
            time.sleep(1)

        if not extraction_completed:
            self.log.error(
                f"APK extraction timed out after {self.APK_DECOMPILE_TIMEOUT} seconds"
            )
            self.cleanup_run()
            return None

        if extraction_error:
            self.log.error(f"Error in APK extraction: {extraction_error}")
            return None

        return self.analysis_results if extraction_result else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)
            export = {"multi_table": True}

            # Table 1: Decompiled method content
            if self.analysis_results.get("decompiled_content"):
                export["decompiled_content"] = {
                    "table": "code_apk_decompiled_methods_content",
                    "data": [
                        [
                            f["decompiled_method_hash"],
                            f["decompiled_method"],
                            f.get("decompiled_method_type", "UNKNOWN"),
                            1 if f.get("decompiled_has_string_encryption") else 0,
                            1 if f.get("decompiled_has_reflection_calls") else 0,
                            1 if f.get("decompiled_excessive_goto_count") else 0,
                            now,
                        ]
                        for f in self.analysis_results["decompiled_content"]
                    ],
                    "column_names": [
                        "decompiled_method_hash",
                        "decompiled_method",
                        "decompiled_method_type",
                        "decompiled_has_string_encryption",
                        "decompiled_has_reflection_calls",
                        "decompiled_excessive_goto_count",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5)",
                        "UInt8",
                        "UInt8",
                        "UInt8",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 2: Decompiled method references
            if self.analysis_results.get("decompiled_refs"):
                export["decompiled_refs"] = {
                    "table": "code_apk_decompiled_methods_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["decompiled_method_hash"],
                            f.get("smali_method_hash"),
                            f.get("decompiled_class_name", ""),
                            f.get("decompiled_method_name", ""),
                            f.get("decompiled_method_signature", ""),
                            f.get("decompiled_method_prototype", ""),
                            f.get("functions_caller", []),
                            f.get("functions_call", []),
                            now,
                        ]
                        for f in self.analysis_results["decompiled_refs"]
                    ],
                    "column_names": [
                        "sha256",
                        "decompiled_method_hash",
                        "smali_method_hash",
                        "decompiled_class_name",
                        "decompiled_method_name",
                        "decompiled_method_signature",
                        "decompiled_method_prototype",
                        "functions_caller",
                        "functions_call",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "String",
                        "String",
                        "Array(String)",
                        "Array(String)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 3: Smali method content
            if self.analysis_results.get("smali_content"):
                export["smali_content"] = {
                    "table": "code_apk_smali_methods_content",
                    "data": [
                        [
                            f["smali_method_hash"],
                            f["smali_method"],
                            f.get("smali_method_type", "UNKNOWN"),
                            f.get("smali_instructions_count", 0),
                            f.get("smali_register_count", 0),
                            1 if f.get("smali_has_string_encryption") else 0,
                            1 if f.get("smali_has_reflection_calls") else 0,
                            1 if f.get("smali_excessive_goto_count") else 0,
                            f.get("smali_flattened_score", 0.0),
                            f.get("smali_mba_score", 0.0),
                            now,
                        ]
                        for f in self.analysis_results["smali_content"]
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "smali_method",
                        "smali_method_type",
                        "smali_instructions_count",
                        "smali_register_count",
                        "smali_has_string_encryption",
                        "smali_has_reflection_calls",
                        "smali_excessive_goto_count",
                        "smali_flattened_score",
                        "smali_mba_score",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5)",
                        "UInt32",
                        "UInt16",
                        "UInt8",
                        "UInt8",
                        "UInt8",
                        "Float64",
                        "Float64",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 4: Smali method references
            if self.analysis_results.get("smali_refs"):
                export["smali_refs"] = {
                    "table": "code_apk_smali_methods_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["smali_method_hash"],
                            f.get("decompiled_method_hash"),
                            f.get("smali_class_name", ""),
                            f.get("smali_method_name", ""),
                            f.get("smali_method_signature", ""),
                            now,
                        ]
                        for f in self.analysis_results["smali_refs"]
                    ],
                    "column_names": [
                        "sha256",
                        "smali_method_hash",
                        "decompiled_method_hash",
                        "smali_class_name",
                        "smali_method_name",
                        "smali_method_signature",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "String",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 5: Method similarity metrics (content-based fuzzy matching)
            if self.analysis_results.get("similarity_metrics"):
                export["method_similarity_metrics"] = {
                    "table": "code_apk_method_similarity_metrics",
                    "data": [
                        [
                            f["smali_method_hash"],
                            f.get("ssdeep_smali"),
                            f.get("tlsh_smali"),
                            f.get("ssdeep_smali_normalized"),
                            f.get("tlsh_smali_normalized"),
                            f.get("minhash", []),
                            now,
                        ]
                        for f in self.analysis_results["similarity_metrics"]
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "ssdeep_smali",
                        "tlsh_smali",
                        "ssdeep_smali_normalized",
                        "tlsh_smali_normalized",
                        "minhash",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 5b: CFG method features (structural/topological)
            if self.analysis_results.get("cfg"):
                export["cfg_methods"] = {
                    "table": "code_apk_cfg_methods",
                    "data": [
                        [
                            cfg["smali_method_hash"],
                            cfg["cfg_topology_hash"],
                            cfg["block_count"],
                            cfg["edge_count"],
                            cfg.get("cfg_instructions_count", 0),
                            cfg.get("call_count", 0),
                            cfg["cyclomatic_complexity"],
                            cfg.get("loop_count", 0),
                            cfg.get("max_depth", 0),
                            cfg.get("max_fan_out", 0),
                            cfg.get("md_index_topdown", 0),
                            cfg.get("md_index_bottomup", 0),
                            cfg.get("prime_product_smali", 0),
                            cfg.get("cfg_feature_tlsh"),
                            cfg.get("wl_minhash", []),
                            cfg.get("bb_features", []),
                            cfg.get("cfg_adjacency", []),
                            now,
                        ]
                        for cfg in self.analysis_results["cfg"]
                        if cfg is not None
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "cfg_topology_hash",
                        "block_count",
                        "edge_count",
                        "cfg_instructions_count",
                        "call_count",
                        "cyclomatic_complexity",
                        "loop_count",
                        "max_depth",
                        "max_fan_out",
                        "md_index_topdown",
                        "md_index_bottomup",
                        "prime_product_smali",
                        "cfg_feature_tlsh",
                        "wl_minhash",
                        "bb_features",
                        "cfg_adjacency",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(16)",
                        "UInt16",
                        "UInt16",
                        "UInt32",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt64",
                        "UInt64",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(Array(UInt16))",
                        "Array(UInt32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 6: Strings — reuse code_binja_strings_raw for cross-format correlation
            # DEX strings are MUTF-8; string_raw = string since no encoding difference
            if self.analysis_results.get("strings"):
                export["strings_raw"] = {
                    "table": "code_binja_strings_raw",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            s["string"],
                            s["string"],  # string_raw = string (MUTF-8 decoded to UTF-8)
                            s.get("string_encoding", "UTF8"),
                            s.get("string_offset", 0),
                            s.get("string_length", len(s["string"])),
                            s.get("string_length", len(s["string"])),  # string_raw_length = string_length
                            s.get("string_entropy", 0.0),
                        ]
                        for s in self.analysis_results["strings"]
                    ],
                    "column_names": [
                        "sha256",
                        "string",
                        "string_raw",
                        "string_encoding",
                        "string_offset",
                        "string_length",
                        "string_raw_length",
                        "string_entropy",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "LowCardinality(String)",
                        "UInt64",
                        "UInt32",
                        "UInt32",
                        "Float32",
                    ],
                }

            # Table 7: Analysis errors
            if self.analysis_results.get("analysis_errors"):
                export["analysis_errors"] = {
                    "table": "code_apk_analysis_errors",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f.get("class_name"),
                            f.get("method_name"),
                            f.get("error_location", "unknown"),
                            f.get("error_message", ""),
                            f.get("error_type", "unknown"),
                            self.calculate_md5(
                                f"{f.get('error_message', '')}"
                                f"{f.get('class_name', '')}"
                                f"{f.get('method_name', '')}"
                                f"{f.get('error_location', 'unknown')}"
                            ),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results["analysis_errors"]
                    ],
                    "column_names": [
                        "sha256",
                        "class_name",
                        "method_name",
                        "error_location",
                        "error_message",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            return export

        return None

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.APK_DECOMPILED.value

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass