Vinayak Naik

63 papers A* 1A 1B 7C 4Misc 20Journal 12Unranked 17
YearRankTypeTitle / Venue / Authors
2026 Misc conf
COMSNETS
Saumya Mathkar, Pinki, Vinayak Naik
2025 conf
TMA
Aditya Bhat, Vaibhav Ganatra, Aniket Shaha, Balakrishnan Chandrasekaran, Vinayak Naik
2025 Misc conf
COMSNETS
Saumya Mathkar, Shreya Aiyer, Yashovardhan Bapat, Pinki, Arnab K. Paul, Vinayak Naik
2025 Misc conf
COMSNETS
Vibha Patil, Vinayak Naik
2024 J jnl
Energy Inform.
Keshav Kaushik, Vinayak Naik
2024 Misc conf
COMSNETS
Keshav Kaushik, Vinayak Naik
2024 J jnl
Int. J. Ad Hoc Ubiquitous Comput.
Ankita Dewan, Venkata M. V. Gunturi, Vinayak Naik
2023 conf
ICOIN
Keshav Kaushik, Prabhutva Agrawal, Vinayak Naik
2023 conf
EI.A
Keshav Kaushik, Vinayak Naik
2023 Misc conf
COMSNETS
Saumya Mathkar, Prakhar Karsh, Udit Baluja, Surjya Ghosh, Sougata Sen, Vinayak Naik
2023 conf
BuildSys
Keshav Kaushik, Vinayak Naik
2023 conf
DCOSS-IoT
Sonia Soubam, Dipyaman Banerjee, Vinayak Naik
2023 conf
ICAART (Revised Selected Paper)
Ruturaj Godse, Shikha Bhat, Shruti Mestry, Vinayak Naik
2023 Misc conf
COMSNETS
Keshav Kaushik, Vinayak Naik
2023 B conf
e-Science
Keshav Kaushik, Vinayak Naik
2023 Misc conf
COMSNETS
Priyam Loganathan, Dhruv Rauthan, Animesh Trivedi, Vinayak Naik
2023 conf
ICAART (1)
Shikha Bhat, Ruturaj Godse, Shruti Mestry, Vinayak Naik
2022 B conf
CCGRID
Yash Jangir, Rohan Kumar, Nrupesh Surya U, Manik Mahajan, Vinayak Naik
2022 J jnl
CoRR
Rohan Kumar, Dhruv Nagpal, Vinayak Naik, Dipanjan Chakraborty
2022 B conf
MobiHoc
Rohan Kumar, Dhruv Nagpal, Vinayak Naik, Dipanjan Chakraborty
2021 J jnl
CoRR
Dheryta Jaisinghani, Vinayak Naik, Rajesh Balan, Archan Misra, Youngki Lee
2021 J jnl
CoRR
Vinayak Naik, Anish Arora
2021 conf
SmartWorld/SCALCOM/UIC/ATC/IOP/SCI
Ankita Dewan, Venkata M. V. Gunturi, Vinayak Naik, Kousik Kumar Dutta
2021 conf
PerCom Workshops
Shrehal Bohra, Vinayak Naik, Varun Yeligar
2020 B conf
MASS
Dheryta Jaisinghani, Naman Gupta, Mukulika Maity, Vinayak Naik
2020 Misc conf
COMSNETS
Syesha Girdher, Anubha Gupta, Snehlata Jaswal, Vinayak Naik
2020 Misc conf
COMSNETS
Syesha Girdher, Anubha Gupta, Snehlata Jaswal, Vinayak Naik
2020 J jnl
Proc. Priv. Enhancing Technol.
Piyush Kumar Sharma, Devashish Gosain, Himanshu Sagar, Chaitanya Kumar, Aneesh Dogra, Vinayak Naik, Hrishikesh B. Acharya, Sambuddho Chakravarty
2020 Misc conf
COMSNETS
Kanchanjot Kaur Phokela, Vinayak Naik
2019 C conf
MoMM
Ankita Dewan, Venkata M. V. Gunturi, Vinayak Naik, Kartik Vishwakarma, Shrehal Bohra
2019 Misc conf
COMSNETS
Sanat Sarangi, Vinayak Naik, Swagatam Bose Choudhury, Prachin Jain, Vinay Kosgi, Rahul Sharma, Prakruti Bhatt, Srinivasu Pappula
2019 Misc conf
COMSNETS
Anupama Balotra, Mukulika Maity, Vinayak Naik
2019 conf
ISEC
Parjanya Vyas, Bhagyesh V. Patil, Shubham Singh, Vinayak Naik
2019 C conf
WOWMOM
Harish Fulara, Gursimran Singh, Dheryta Jaisinghani, Mukulika Maity, Tanmoy Chakraborty, Vinayak Naik
2018 Misc conf
COMSNETS
Aanchal Mongia, Venkata M. V. Gunturi, Vinayak Naik
2018 A* conf
MobiCom
Dheryta Jaisinghani, Gursimran Singh, Harish Fulara, Mukulika Maity, Vinayak Naik
2018 C conf
MobiQuitous
Dheryta Jaisinghani, Rajesh Krishna Balan, Vinayak Naik, Archan Misra, Youngki Lee
2018 J jnl
CoRR
Dheryta Jaisinghani, Vinayak Naik, Sanjit K. Kaul, Rajesh Balan, Sumit Roy
2018 Misc conf
COMSNETS
Varun Jain, Mansi Goel, Mukulika Maity, Vinayak Naik, Ramachandran Ramjee
2018 conf
COMSNETS (Extended Selected Papers)
Garima Chikara, Ruchika Banerjee, Vinayak Naik, A. Venkata Subramanyam, Kuntal Dey
2018 Misc conf
COMSNETS
Ruchika Banerjee, Garima Chikara, Vinayak Naik, A. Venkata Subramanyam, Kuntal Dey
2018 Misc conf
COMSNETS
Dilnashin Anwar, Prince Garg, Vinayak Naik, Anubha Gupta, Akshay Kumar
2017 Misc conf
COMSNETS
Naman Gupta, Vinayak Naik, Srishti Sengupta
2017 conf
NCC
Geetali Tyagi, Shweta Sood, Vinayak Naik, Rizwana Ahmad
2017 conf
NCC
Dheryta Jaisinghani, Vinayak Naik, Sanjit K. Kaul, Sumit Roy
2017 Misc conf
COMSNETS
Megha Vij, Vinayak Naik, Venkata M. V. Gunturi
2016 C conf
MobiQuitous
Rohit Mehra, Vinayak Naik, Rahul Purandare, Kapish Malik
2016 Misc conf
COMSNETS
Karan Grover, Vinayak Naik
2016 J jnl
Tiny Trans. Comput. Sci.
Chaitanya Kumar, Vinayak Naik
2015 B conf
WiOpt
Dheryta Jaisinghani, Vinayak Naik, Sanjit Krishnan Kaul, Sumit Roy
2014 conf
MOBILESoft
Shaifali Gupta, Rashi Garg, Nikita Jain, Vinayak Naik, Sanjit Krishnan Kaul
2014 conf
MOBILESoft
Samit Anwer, Aniya Aggarwal, Rahul Purandare, Vinayak Naik
2014 Misc conf
COMSNETS
Niranth Amogh, Vinayak Naik, T. V. Prabhakar
2014 conf
IC3
Vartika Srivastava, Vinayak Naik, Anuradha Gupta
2013 J jnl
CoRR
Judith Bishop, Nikolai Tillmann, Arno Puder, Vinayak Naik
2009 ch.
Guide to Wireless Sensor Networks
Hongwei Zhang, Vinayak Naik
2007 J jnl
IEEE Trans. Mob. Comput.
Vinayak Naik, Anish Arora, Prasun Sinha, Hongwei Zhang
2006 conf
IPSN
Emre Ertin, Anish Arora, Rajiv Ramnath, Vinayak Naik, Sandip Bapat, Vinod Kulathumani, Mukundan Sridharan, Hongwei Zhang, Hui Cao, Mikhail Nesterenko
2005 B conf
RTCSA
Anish Arora, Rajiv Ramnath, Emre Ertin, Prasun Sinha, Sandip Bapat, Vinayak Naik, Vinod Kulathumani, Hongwei Zhang, Hui Cao, Mukundan Sridharan, Santosh Kumar, Nick Seddon, Chris Anderson, Ted Herman, Nishank Trivedi, Chen Zhang, Mikhail Nesterenko, Romil Shah, Sandeep S. Kulkarni, Mahesh Aramugam, Limin Wang, Mohamed G. Gouda, Young-ri Choi, David E. Culler, Prabal Dutta, Cory Sharp, Gilman Tolle, Mike Grimmer, Bill Ferriera, Ken Parker
2005 B conf
DCOSS
Anish Arora, Rajiv Ramnath, Prasun Sinha, Emre Ertin, Sandip Bapat, Vinayak Naik, Vinod Kulathumani, Hongwei Zhang, Mukundan Sridharan, Santosh Kumar, Hui Cao, Nick Seddon, Chris Anderson, Ted Herman, Chen Zhang, Nishank Trivedi, Mohamed G. Gouda, Young-ri Choi, Mikhail Nesterenko, Romil Shah, Sandeep S. Kulkarni, Mahesh Aramugam, Limin Wang, David E. Culler, Prabal Dutta, Cory Sharp, Gilman Tolle, Mike Grimmer, Bill Ferriera, Ken Parker
2005 A conf
RTSS
Vinayak Naik, Anish Arora, Prasun Sinha, Hongwei Zhang
2004 J jnl
Comput. Networks
Anish Arora, Prabal Dutta, Sandip Bapat, Vinod Kulathumani, Hongwei Zhang, Vinayak Naik, Vineet Mittal, Hui Cao, Murat Demirbas, Mohamed G. Gouda, Young-ri Choi, Ted Herman, Sandeep S. Kulkarni, Umamaheswaran Arumugam, Mikhail Nesterenko, Adnan Vora, Mark Miyashita
2003 J jnl
IEEE Distributed Syst. Online
Vinayak Naik, Anish Arora, Sandip Bapat, Mohamed G. Gouda
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