Vaibhav Srivastava

137 papers A* 2A 1B 3C 22Misc 1Journal 83Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
Auton. Robots
Demetris Coleman, Shaunak D. Bopardikar, Vaibhav Srivastava, Xiaobo Tan
2026 J jnl
CoRR
Lai Wei, Andrew McDonald, Vaibhav Srivastava
2026 J jnl
CoRR
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2026 conf
HRI Companion
Khalaeb Richardson, Emily Maceri, Dong Hae Mangalindan, Vaibhav Srivastava, Ericka Rovira
2026 J jnl
ACM Trans. Hum. Robot Interact.
Dong Hae Mangalindan, Ericka Rovira, Vaibhav Srivastava
2025 J jnl
CoRR
Urmee Maitra, Ashish R. Hota, Vaibhav Srivastava
2025 C conf
ACC
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2025 J jnl
CoRR
Yu Mei, Xinyu Zhou, Shuyang Yu, Vaibhav Srivastava, Xiaobo Tan
2025 J jnl
Appl. Intell.
Varun Gupta, Vaibhav Srivastava, Ankit Yadav, Dinesh Kumar Vishwakarma, Narendra Kumar
2025 J jnl
CoRR
Qinshuang Wei, Vaibhav Srivastava, Vijay Gupta
2025 J jnl
CoRR
Anand Gokhale, Vaibhav Srivastava, Francesco Bullo
2025 J jnl
CoRR
Mohammad R. Hajidavalloo, Kaixiang Zhang, Vaibhav Srivastava, Zhaojian Li
2025 A* conf
ICRA
Dong Hae Mangalindan, Karthik Kandikonda, Ericka Rovira, Vaibhav Srivastava
2025 J jnl
CoRR
Dong Hae Mangalindan, Karthik Kandikonda, Ericka Rovira, Vaibhav Srivastava
2025 C conf
ACC
Dong Hae Mangalindan, Ashish R. Hota, Vaibhav Srivastava
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Amin Vahidi-Moghaddam, Kaixiang Zhang, Xunyuan Yin, Vaibhav Srivastava, Zhaojian Li
2025 J jnl
IEEE Control. Syst. Lett.
Piyush Gupta, Vaibhav Srivastava
2025 conf
CDC
Urmee Maitra, Ashish R. Hota, Vaibhav Srivastava
2025 J jnl
CoRR
Huanqing Wang, Kaixiang Zhang, Kyungjoon Lee, Yu Mei, Vaibhav Srivastava, Jun Sheng, Ziyou Song, Zhaojian Li
2024 J jnl
CoRR
Dong Hae Mangalindan, Vaibhav Srivastava
2024 B conf
RO-MAN
Dong Hae Mangalindan, Vaibhav Srivastava
2024 J jnl
IEEE Trans. Control. Netw. Syst.
Abhisek Satapathi, Narendra Kumar Dhar, Ashish R. Hota, Vaibhav Srivastava
2024 J jnl
CoRR
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2024 J jnl
PLoS Comput. Biol.
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2024 J jnl
IEEE Robotics Autom. Lett.
Huanqing Wang, Kaixiang Zhang, Kyungjoon Lee, Yu Mei, Keyi Zhu, Vaibhav Srivastava, Jun Sheng, Zhaojian Li
2024 J jnl
CoRR
Amin Vahidi-Moghaddam, Kaixiang Zhang, Xunyuan Yin, Vaibhav Srivastava, Zhaojian Li
2024 J jnl
IEEE Trans. Control. Netw. Syst.
Vishal Abhishek, Vaibhav Srivastava
2024 J jnl
Autom.
Piyush Gupta, Vaibhav Srivastava
2024 J jnl
CoRR
Dong Hae Mangalindan, Ericka Rovira, Vaibhav Srivastava
2023 J jnl
CoRR
Ethan Lau, Vaibhav Srivastava, Shaunak D. Bopardikar
2023 J jnl
IEEE Control. Syst. Lett.
Ethan Lau, Vaibhav Srivastava, Shaunak D. Bopardikar
2023 J jnl
IEEE Trans. Autom. Control.
Nan Li, Kaixiang Zhang, Zhaojian Li, Vaibhav Srivastava, Xiang Yin
2023 C conf
ACC
Demetris Coleman, Shaunak D. Bopardikar, Vaibhav Srivastava, Xiaobo Tan
2023 J jnl
CoRR
Piyush Gupta, Subir Biswas, Vaibhav Srivastava
2023 J jnl
IEEE Trans. Autom. Control.
Piyush Gupta, Shaunak D. Bopardikar, Vaibhav Srivastava
2023 conf
ICCCNT
Abhishek Bajpai, Vaibhav Srivastava, Shruti Yadav, Yash Sharma
2023 J jnl
CoRR
Ethan Lau, Vaibhav Srivastava, Shaunak D. Bopardikar
2023 C conf
ACC
Dong Hae Mangalindan, Ericka Rovira, Vaibhav Srivastava
2023 J jnl
CoRR
Piyush Gupta, Vaibhav Srivastava
2023 J jnl
IEEE Control. Syst. Lett.
Urmee Maitra, Ashish R. Hota, Vaibhav Srivastava
2023 C conf
ACC
Yu Mei, Preston Fairchild, Vaibhav Srivastava, Changyong Cao, Xiaobo Tan
2022 C conf
ACC
Shaunak D. Bopardikar, Vaibhav Srivastava
2022 J jnl
CoRR
Abhisek Satapathi, Narendra Kumar Dhar, Ashish R. Hota, Vaibhav Srivastava
2022 conf
CDC
Piyush Gupta, Vaibhav Srivastava
2022 J jnl
CoRR
Piyush Gupta, Vaibhav Srivastava
2022 C conf
ACC
Abhisek Satapathi, Narendra Kumar Dhar, Ashish R. Hota, Vaibhav Srivastava
2022 J jnl
CoRR
Abhisek Satapathi, Narendra Kumar Dhar, Ashish R. Hota, Vaibhav Srivastava
2022 J jnl
IEEE Trans. Control. Netw. Syst.
Yaofeng Desmond Zhong, Vaibhav Srivastava, Naomi Ehrich Leonard
2022 J jnl
CoRR
Vishal Abhishek, Vaibhav Srivastava
2022 J jnl
Biol. Cybern.
Zahra Aminzare, Vaibhav Srivastava
2022 J jnl
CoRR
Piyush Gupta, Vaibhav Srivastava
2022 C conf
ACC
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2022 J jnl
CoRR
Ankur Kamboj, Rajiv Ranganathan, Xiaobo Tan, Vaibhav Srivastava
2021 J jnl
CoRR
Connor J. Boss, Vaibhav Srivastava
2021 J jnl
CoRR
Nan Li, Kaixiang Zhang, Zhaojian Li, Vaibhav Srivastava, Xiang Yin
2021 J jnl
IEEE Trans. Autom. Control.
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2021 J jnl
Autom.
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2021 J jnl
IEEE Robotics Autom. Lett.
Connor J. Boss, Vaibhav Srivastava
2021 J jnl
CoRR
Connor J. Boss, Vaibhav Srivastava
2021 J jnl
IEEE Control. Syst. Lett.
Lai Wei, Vaibhav Srivastava
2021 C conf
ACC
Lai Wei, Vaibhav Srivastava
2021 A* conf
ICRA
Lai Wei, Andrew McDonald, Vaibhav Srivastava
2021 J jnl
CoRR
Lai Wei, Vaibhav Srivastava
2021 conf
ECC
Piyush Gupta, Vaibhav Srivastava
2021 conf
CCTA
Andrew McDonald, Lai Wei, Vaibhav Srivastava
2021 J jnl
CoRR
Andrew McDonald, Lai Wei, Vaibhav Srivastava
2021 J jnl
CoRR
Zahra Aminzare, Vaibhav Srivastava
2021 J jnl
CoRR
Lai Wei, Andrew McDonald, Vaibhav Srivastava
2021 C conf
ACC
Vishal Abhishek, Vaibhav Srivastava, Ranjan Mukherjee
2021 C conf
ACC
Connor J. Boss, Vishal Abhishek, Vaibhav Srivastava
2020 C conf
ACC
Yasir Khudhair Al-Nadawi, Hothaifa Al-Qassab, Daniel Kent, Su Pang, Vaibhav Srivastava, Hayder Radha
2020 J jnl
CoRR
Yasir Khudhair Al-Nadawi, Hothaifa Al-Qassab, Daniel Kent, Su Pang, Vaibhav Srivastava, Hayder Radha
2020 J jnl
CoRR
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2020 J jnl
IEEE Control. Syst. Lett.
Shaunak D. Bopardikar, Vaibhav Srivastava
2020 A conf
IROS
Lai Wei, Xiaobo Tan, Vaibhav Srivastava
2020 J jnl
CoRR
Lai Wei, Xiaobo Tan, Vaibhav Srivastava
2020 J jnl
CoRR
Yaofeng Desmond Zhong, Vaibhav Srivastava, Naomi Ehrich Leonard
2020 J jnl
CoRR
Lai Wei, Vaibhav Srivastava
2020 C conf
ACC
Connor J. Boss, Vaibhav Srivastava, Hassan K. Khalil
2020 J jnl
CoRR
Connor J. Boss, Vaibhav Srivastava, Hassan K. Khalil
2020 C conf
ACC
Vishal Abhishek, Vaibhav Srivastava
2020 J jnl
CoRR
Vishal Abhishek, Vaibhav Srivastava
2019 conf
CDC
Piyush Gupta, Shaunak D. Bopardikar, Vaibhav Srivastava
2019 conf
ECC
Khem Raj Ghusinga, Vaibhav Srivastava, Abhyudai Singh
2019 J jnl
CoRR
Piyush Gupta, Shaunak D. Bopardikar, Vaibhav Srivastava
2019 J jnl
CoRR
Vishal Abhishek, Vaibhav Srivastava
2019 conf
CDC
Zahra Aminzare, Philip Holmes, Vaibhav Srivastava
2019 C conf
ACC
Piyush Gupta, Vaibhav Srivastava
2018 J jnl
SIAM J. Appl. Dyn. Syst.
Zahra Aminzare, Vaibhav Srivastava, Philip Holmes
2018 Misc conf
ICASSP
Paul Reverdy, Vaibhav Srivastava
2018 J jnl
IEEE Trans. Control. Netw. Syst.
Rebecca Gray, Alessio Franci, Vaibhav Srivastava, Naomi Ehrich Leonard
2018 C conf
ACC
Lai Wei, Vaibhav Srivastava
2018 J jnl
CoRR
Lai Wei, Vaibhav Srivastava
2018 conf
CDC
Lai Wei, Vaibhav Srivastava
2018 J jnl
CoRR
Lai Wei, Vaibhav Srivastava
2018 conf
CDC
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2017 C conf
ACC
Vaibhav Srivastava, Naomi Ehrich Leonard
2017 C conf
ACC
Anthony J. Savas, Vaibhav Srivastava, Naomi Ehrich Leonard
2017 conf
CDC
Sarah Huiyi Cen, Vaibhav Srivastava, Naomi Ehrich Leonard
2017 conf
CDC
Yaofeng Desmond Zhong, Vaibhav Srivastava, Naomi Ehrich Leonard
2017 J jnl
IEEE Trans. Autom. Control.
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2016 J jnl
CoRR
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2016 conf
CDC
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2016 conf
ECC
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2015 conf
NIPS
Michael Shvartsman, Vaibhav Srivastava, Jonathan D. Cohen
2015 J jnl
CoRR
Vaibhav Srivastava, Paul Reverdy, Naomi Ehrich Leonard
2015 J jnl
CoRR
Peter Landgren, Vaibhav Srivastava, Naomi Ehrich Leonard
2015 C conf
ACC
Vaibhav Srivastava, Naomi Ehrich Leonard
2015 J jnl
CoRR
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2014 J jnl
BMC Bioinform.
Erik K. Malm, Vaibhav Srivastava, Gustav Sundqvist, Vincent Bulone
2014 conf
ECC
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2014 J jnl
Autom.
Vaibhav Srivastava, Ruggero Carli, Cédric Langbort, Francesco Bullo
2014 J jnl
CoRR
Vaibhav Srivastava, Naomi Ehrich Leonard
2014 J jnl
IEEE Trans. Control. Netw. Syst.
Vaibhav Srivastava, Naomi Ehrich Leonard
2014 J jnl
SIAM J. Control. Optim.
Luca Carlone, Vaibhav Srivastava, Francesco Bullo, Giuseppe Carlo Calafiore
2014 conf
AuCC
Hamid Emadi, Vaibhav Srivastava, Umesh Vaidya, Sourabh Bhattacharya
2014 J jnl
Eur. J. Oper. Res.
Vaibhav Srivastava, Francesco Bullo
2014 J jnl
Proc. IEEE
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2014 conf
CDC
Vaibhav Srivastava, Paul Reverdy, Naomi Ehrich Leonard
2013 J jnl
CoRR
Vaibhav Srivastava, Amit Surana, Miguel P. Eckstein, Francesco Bullo
2013 J jnl
CoRR
Paul Reverdy, Vaibhav Srivastava, Naomi Ehrich Leonard
2013 conf
Allerton
Vaibhav Srivastava, Paul Reverdy, Naomi Ehrich Leonard
2013 conf
CDC
Vaibhav Srivastava, Naomi Ehrich Leonard
2013 J jnl
Int. J. Robotics Res.
Vaibhav Srivastava, Fabio Pasqualetti, Francesco Bullo
2012 C conf
ACC
Vaibhav Srivastava, Amit Surana, Francesco Bullo
2012 J jnl
CoRR
Vaibhav Srivastava, Fabio Pasqualetti, Francesco Bullo
2011 conf
NetGCoop
Luca Carlone, Vaibhav Srivastava, Francesco Bullo, Giuseppe Carlo Calafiore
2011 conf
CDC/ECC
Vaibhav Srivastava, Kurt Plarre, Francesco Bullo
2011 conf
CDC/ECC
Vaibhav Srivastava, Francesco Bullo
2011 J jnl
J. Nonlinear Sci.
Vaibhav Srivastava, Jeff Moehlis, Francesco Bullo
2011 J jnl
IEEE Trans. Signal Process.
Vaibhav Srivastava, Kurt Plarre, Francesco Bullo
2011 conf
CDC/ECC
Vaibhav Srivastava, Francesco Bullo
2011 C conf
ACC
Vaibhav Srivastava, Ruggero Carli, Cédric Langbort, Francesco Bullo
2010 C conf
ACC
Vaibhav Srivastava, Jeff Moehlis, Francesco Bullo
2009 J jnl
CoRR
Vaibhav Srivastava, Kurt Plarre, Francesco Bullo
2008 B conf
ARES
Ananda Swarup Das, Jitu Kumar Keshri, Kannan Srinathan, Vaibhav Srivastava
2007 B conf
MDM
Ananda Swarup Das, Kannan Srinathan, Ritesh Kumar Tiwari, Vaibhav Srivastava
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