Xian Chen

101 papers A 1B 4C 2Journal 62Unranked 30
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Xian Chen, Yili Jiang, Jiaqi Huang, Sohan Gyawali, Fangtian Zhong, Yi Qian
2026 J jnl
IEEE Trans. Learn. Technol.
Jie Cao, Shuman Wang, Xian Chen, Christian Schunn
2026 J jnl
Theor. Comput. Sci.
Jingyi Liu, Xian Chen, Yicheng Zheng, Jian-Xin Wang, Feng Shi
2025 J jnl
CoRR
Julian Bäumler, Louis Blöcher, Lars-Joel Frey, Xian Chen, Markus Bayer, Christian Reuter
2025 J jnl
J. Supercomput.
Juan Huang, Yanhua Zhong, Xian Chen
2025 J jnl
Int. J. Softw. Informatics
Haiyang Xu, Hailong Liu, Xian Chen, Lei Wang, Ke Jin, Shufeng Hou, Zhanhuai Li
2025 J jnl
CoRR
Mingfu Liang, Xi Liu, Rong Jin, Boyang Liu, Qiuling Suo, Qinghai Zhou, Song Zhou, Laming Chen, Hua Zheng, Zhiyuan Li, Shali Jiang, Jiyan Yang, Xiaozhen Xia, Fan Yang, Yasmine Badr, Ellie Wen, Shuyu Xu, Hansey Chen, Zhengyu Zhang, Jade Nie, Chunzhi Yang, Zhichen Zeng, Weilin Zhang, Xingliang Huang, Qianru Li, Shiquan Wang, Evelyn Lyu, Wenjing Lu, Rui Zhang, Wenjun Wang, Jason Rudy, Mengyue Hang, Kai Wang, Yinbin Ma, Shuaiwen Wang, Sihan Zeng, Tongyi Tang, Xiaohan Wei, Longhao Jin, Jamey Zhang, Marcus Chen, Jiayi Zhang, Angie Huang, Chi Zhang, Zhengli Zhao, Jared Yang, Qiang Jin, Xian Chen, Amit Anand Amlesahwaram, Lexi Song, Liang Luo, Yuchen Hao, Nan Xiao, Yavuz Yetim, Luoshang Pan, Gaoxiang Liu, Yuxi Hu, Yuzhen Huang, Jackie Xu, Rich Zhu, Xin Zhang, Yiqun Liu, Hang Yin, Yuxin Chen, Buyun Zhang, Xiaoyi Liu, Xingyuan Wang, Wenguang Mao, Zhijing Li, Qin Huang, Chonglin Sun, Shupin Mao, Benjamin Au, Jingzheng Qin, Peggy Yao, Jae-Woo Choi, Bin Gao, Ernest Wang, Lei Zhang, Wen-Yen Chen, Ted Lee, Jay Zha, Yi Meng, Alex Gong, Edison Gao, Alireza Vahdatpour, Yiping Han, Yantao Yao, Toshinari Kureha, Shuo Chang, Musharaf Sultan, John Bocharov, Sagar Chordia, Xiaorui Gan, Peng Sun, Rocky Liu, Bo Long, Wenlin Chen, Santanu Kolay, Huayu Li
2025 J jnl
CoRR
Jie Cao, Chloe Qianhui Zhao, Xian Chen, Shuman Wang, Christian Schunn, Kenneth R. Koedinger, Jionghao Lin
2025 conf
AIED (2)
Jie Cao, Chloe Qianhui Zhao, Xian Chen, Shuman Wang, Christian Schunn, Kenneth R. Koedinger, Jionghao Lin
2025 conf
ACM Southeast Regional Conference
Haoran Pei, Xian Chen, Yili Jiang, Feng Wang, Linan Huang
2025 J jnl
CoRR
Xian Chen, Rong Qu, Jing Dong, Ruibin Bai, Yaochu Jin
2025 B conf
WALCOM
Jingyi Liu, Xian Chen, Yicheng Zheng, Jianxin Wang, Feng Shi
2025 J jnl
Int. J. Game Theory
Qingda Wei, Xian Chen
2025 J jnl
Expert Syst. Appl.
Xingyu Lu, Xiang Zhou, Shengli Gan, Xi He, Xian Chen, Yunpeng Xiao, Yanbing Liu
2024 J jnl
IEEE Access
Chi Chen, Xian Chen, Aiju Lin
2024 J jnl
Comput. Biol. Medicine
Fei Jiang, Tsunahiko Hirano, Chenyang Liang, Guangzhi Zhang, Kazuto Matsunaga, Xian Chen
2024 conf
MOST
Xian Chen, Yili Jiang, Jiaqi Huang, Sohan Gyawali
2024 J jnl
SIAM J. Control. Optim.
Xian Chen, Qingda Wei
2024 J jnl
IEEE Access
Na Lei, Jipeng Cui, Jicheng Han, Xian Chen, Youfu Tang
2024 J jnl
Sensors
Zhenliang Jiang, Yiqian Lin, Xian Chen, Shanghui Li, Peichen Cai, Yun Que
2023 J jnl
J. Optim. Theory Appl.
Qingda Wei, Xian Chen
2023 J jnl
Sensors
Liang Yan, Lei Li, Xuejiao Mu, Hao Wang, Xian Chen, Hyoseop Shin
2023 J jnl
Reliab. Eng. Syst. Saf.
Weikai Wang, Xian Chen
2023 J jnl
SIAM J. Control. Optim.
Xian Chen, Qingda Wei
2023 J jnl
Medical Biol. Eng. Comput.
Fei Jiang, Itsuo Sakuramoto, Norihiro Nishida, Yoshikatsu Onomoto, Junji Ohgi, Xian Chen
2022 J jnl
J. Comput. Phys.
Fei Jiang, Haihu Liu, Xian Chen, Takeshi Tsuji
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Xian Chen, Kun Huang, Hai Jiang
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Xian Chen, Hai Jiang
2022 J jnl
IEICE Trans. Inf. Syst.
Xian Chen, Xi Deng, Chensen Huang, Hyoseop Shin
2022 J jnl
Complex Intell. Syst.
Hao Wang, Xiao Peng, Yihang Xiao, Zhengquan Xu, Xian Chen
2022 J jnl
Math. Methods Oper. Res.
Qingda Wei, Xian Chen
2022 J jnl
Expert Syst. Appl.
Liying Hu, Xian Chen, Gongde Guo, Lifei Chen
2022 J jnl
CoRR
Weikai Wang, Xian Chen
2021 J jnl
Comput. Phys. Commun.
Fei Jiang, Kazuki Matsumura, Junji Ohgi, Xian Chen
2021 J jnl
Oper. Res. Lett.
Qingda Wei, Xian Chen
2021 conf
EITCE
Jinyang Chen, Jing Yang, Xian Chen, Xiaojie Meng
2021 J jnl
Dyn. Games Appl.
Qingda Wei, Xian Chen
2021 conf
ICEIT
Xian Chen, Feng Hu, Jun Lai, Chunmei Tao, Hyoseop Shin
2021 J jnl
J. Syst. Archit.
Boyu Gao, Zhiguo Chen, Xian Chen, Huawei Tu, Feiran Huang
2020 conf
ECML/PKDD (3)
Junyang Chen, Zhiguo Gong, Wei Wang, Xiao Dong, Wei Wang, Weiwen Liu, Cong Wang, Xian Chen
2020 conf
EMBC
Xian Chen, Bohua Liu, Wei Pang, Xuexin Duan
2019 J jnl
Comput. Math. Methods Medicine
Norihiro Nishida, Junji Ohgi, Fei Jiang, Saki Ito, Yasuaki Imajo, Hidenori Suzuki, Masahiro Funaba, Daisuke Nakashima, Takashi Sakai, Xian Chen
2019 J jnl
SIAM J. Control. Optim.
Qingda Wei, Xian Chen
2019 J jnl
Comput. Ind. Eng.
Liuxin Chen, Xian Chen, Matthew F. Keblis, Gen Li
2019 J jnl
Dyn. Games Appl.
Qingda Wei, Xian Chen
2018 conf
WAC
Ken'ichi Morooka, Shoko Miyauchi, Xian Chen, Ryo Kurazume
2018 conf
ISBDAI
Qingpeng Chen, Jiwen Chen, Yanhua Zhao, Chen Wang, Xian Chen
2018 J jnl
J. Comput. Chem.
Xian Chen, Jian Song, Zhe-Ning Chen, Tan Jin, Fengqin Long, Hua Xie, Yisong Zheng, Wei Zhuang, Lu Zhang
2017 J jnl
IEEE Syst. J.
Xian Chen, Wenzhi Chen, Zhongyong Lu, Peng Long, Shuiqiao Yang, Zonghui Wang
2017 J jnl
Discret. Event Dyn. Syst.
Qingda Wei, Xian Chen
2017 J jnl
Inf. Syst. E Bus. Manag.
Xian Chen, Hyoseop Shin, Hyang-Won Lee
2017 J jnl
Concurr. Comput. Pract. Exp.
Xian Chen, Wenzhi Chen, Zhongyong Lu, Yu Zhang, Rui Chang, Mohammad Mehedi Hassan, Abdulhameed Alelaiwi, Yang Xiang
2016 J jnl
Oper. Res. Lett.
Qingda Wei, Xian Chen
2016 J jnl
IEEE Trans. Mob. Comput.
Ruofan Jin, Bing Wang, Wei Wei, Xiaolan Zhang, Xian Chen, Yaakov Bar-Shalom, Peter Willett
2015 J jnl
Oper. Res. Lett.
Qingda Wei, Xian Chen
2015 conf
ICA3PP (2)
Xian Chen, Wenzhi Chen, Zhongyong Lu
2015 J jnl
IEEE Trans. Parallel Distributed Syst.
Alexander Russell, Sudarshan Vasudevan, Bing Wang, Wei Zeng, Xian Chen, Wei Wei
2015 conf
KES-IDT
Junzo Watada, Xian Chen
2014 J jnl
BMC Bioinform.
Ying Wang, Ying Zhou, Linfeng Li, Xian Chen, Yuting Liu, Zhiming Ma, Shuhua Xu
2014 B conf
ICPADS
Xian Chen, Wenzhi Chen, Shuiqiao Yang, Zhongyong Lu, Zonghui Wang
2014 J jnl
Ad Hoc Networks
Wei Zeng, Jordan Cote, Xian Chen, Yoo-Ah Kim, Wei Wei, Kyoungwon Suh, Bing Wang, Zhijie Jerry Shi
2014 conf
PACIS
Xian Chen, Stephen Shaoyi Liao, Wei Dong, Yang Dai, Xiaolu Yang
2014 conf
RecSys Posters
Xian Chen, Hyoseop Shin
2014 J jnl
J. Appl. Math.
Li Luo, Chun-rong Qin, Shi-jun Tang, Xian Chen, Hui-li Guo
2014 J jnl
Kybernetika
Qingda Wei, Xian Chen
2013 conf
ICITST
Xian Chen, Meilian Chen, Hyoseop Shin, Eun Yi Kim
2013 conf
EMBC
Ken'ichi Morooka, Yousuke Nakasuka, Ryo Kurazume, Xian Chen, Tsutomu Hasegawa, Makoto Hashizume
2013 conf
CBD
Xian Chen, Wenzhi Chen, Peng Long, Zhongyong Lu, Zonghui Wang
2013 C conf
IPCCC
Xian Chen, Lester Lipsky, Kyoungwon Suh, Bing Wang, Wei Wei
2013 J jnl
J. Intell. Inf. Syst.
Xian Chen, Hyoseop Shin
2012 conf
Image-Guided Procedures
Ken'ichi Morooka, Tomoyuki Taguchi, Xian Chen, Ryo Kurazume, Makoto Hashizume, Tsutomu Hasegawa
2012 J jnl
Ad Hoc Networks
Xian Chen, Yoo-Ah Kim, Bing Wang, Wei Wei, Zhijie Jerry Shi, Yuan Song
2012 conf
DASFAA Workshops
Xian Chen, Hyoseop Shin, Minsoo Lee
2012 A conf
Internet Measurement Conference
Xian Chen, Ruofan Jin, Kyoungwon Suh, Bing Wang, Wei Wei
2012 J jnl
Comput. Commun.
Xian Chen, Yoo-Ah Kim, Bing Wang, Yuan Song, Hieu Dinh, Guanling Chen
2011 B conf
MobiHoc
Wei Zeng, Sudarshan Vasudevan, Xian Chen, Bing Wang, Alexander Russell, Wei Wei
2010 J jnl
J. Comput. Chem.
Dong-Sheng Cao, Yi-Zeng Liang, Qing-Song Xu, Hong-Dong Li, Xian Chen
2010 conf
ICDM Workshops
Xian Chen, Hyoseop Shin
2010 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Xian Chen, Bing Wang, Kyoungwon Suh, Wei Wei
2009 conf
WASA
Yuan Song, Xian Chen, Yoo-Ah Kim, Bing Wang, Guanling Chen
2008 conf
WoSQ@ICSE
Xian Chen, Paul G. Sorenson
2008 conf
MICCAI (2)
Ken'ichi Morooka, Xian Chen, Ryo Kurazume, Seiichi Uchida, Kenji Hara, Yumi Iwashita, Makoto Hashizume
2007 conf
ICEIS (3)
Xian Chen, Paul G. Sorenson, John Willson
2007 conf
LSMS (2)
Minghui Wu, Xian Chen, Fanwei Zhu, Jing Ying
2007 conf
IEEE SCW
Xian Chen, Paul G. Sorenson, John Willson
2007 J jnl
Medical Biol. Eng. Comput.
Chee-Kong Chui, Etsuko Kobayashi, Xian Chen, Toshiaki Hisada, Ichiro Sakuma
2006 J jnl
Adv. Complex Syst.
Christian V. Forst, Lawrence Cabusora, Kwasi G. Mawuenyega, Xian Chen
2006 J jnl
Medical Biol. Eng. Comput.
Fuziansyah Bachtar, Xian Chen, Toshiaki Hisada
2006 conf
ICAT Workshops
Xian Chen, Nailiang Zhao, Gaoqi He, Lin Zhang, Zhigeng Pan
2004 conf
ICESS
Huifeng Wu, Jing Ying, Xian Chen, Minghui Wu, Changyun Li
2004 B conf
ICIP
Xian-Sheng Hua, Xian Chen, HongJiang Zhang
2003 conf
IS4TH
Ichiro Sakuma, Yosuke Nishimura, Chee-Kong Chui, Etsuko Kobayashi, Hiroshi Inada, Xian Chen, Toshiaki Hisada
2002 J jnl
Proc. IEEE
Olaf M. Lubeck, Christopher M. Sewell, Sheng Gu, Xian Chen, D. Michael Cai
2001 J jnl
Nucleic Acids Res.
Fadi Abdi, E. Morton Bradbury, Norman Doggett, Xian Chen
1997 book
Automatic parallelization for a class of regular computation.
Graham M. Megson, Xian Chen
1997 J jnl
IEEE Wirel. Commun.
Peter J. Brown, John D. Bovey, Xian Chen
1996 conf
Solving Combinatorial Optimization Problems in Parallel
Graham M. Megson, Lucia Rapanotti, Xian Chen
1995 J jnl
IEEE Trans. Parallel Distributed Syst.
Xian Chen, Graham M. Megson
1995 conf
IPPS
Graham M. Megson, Xian Chen
1995
Xian Chen
1994 C conf
PDP
Graham M. Megson, Xian Chen
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