Wei Hou

120 papers A 2B 7C 10Misc 5Journal 75Unranked 20
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neurocomputing
Wei Hou, Xianxing Liu, Linxiao Li, Chunling Fu
2026 J jnl
CoRR
Xingting Li, Yifan Xie, Han Liu, Wei Hou, Guangyu Chen, Shoujie Li, Wenbo Ding
2026 J jnl
IEEE Internet Things J.
Yanqin Ma, Wei Hou, Yuanwei Zhou, Yulong Huang, Yonghua Xie, Hao Ma, Jinhui Zhang
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Wei Hou, Jixian Zhang, Zihao Peng, Ulrich Walz
2025 J jnl
Int. J. Digit. Earth
Junzhi Liu, Bin Zhang, Yefeng Que, Shaoyi Tian, Wanhong Yang, Wei Hou
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xueqing Wang, Wei Hou, Shou Feng, Nan Su, Chunhui Zhao, Wei Li, Ran Tao
2025 J jnl
Knowl. Inf. Syst.
Dongsheng Duan, Cunchi Lv, Cheng Zhang, Wei Hou, Lei Shi, Yangxi Li, Xiaofang Zhao
2025 J jnl
SIAM J. Sci. Comput.
Wei Hou, Tim Colonius
2025 J jnl
Biomed. Signal Process. Control.
Zhentao Hu, Yihan Wang, Shuo Zhang, Yanyang Li, Wei Hou
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Wei Hou, Haomeng Wu, Di Wu, Yulin Shen, Ze Liu, Lili Zhang, Jicai Li
2024 A conf
ICCAD
Xiaohui Liu, Xintong Li, Xiaofei Wang, Shupeng Tai, Wei Hou, Yaran Zhang, Meiling Yue
2024 J jnl
IEEE Signal Process. Lett.
Wei Hou, Wenxuan Wang, Yiming Yan, Di Wu, Qingyu Xia
2024 J jnl
Comput. Aided Civ. Infrastructure Eng.
Youshui Miao, Hao Kang, Wei Hou, Yang Liu, Yixin Zhang, Cheng Wang
2024 J jnl
J. Comput. Phys.
Wei Hou, Tim Colonius
2024 J jnl
Data Min. Knowl. Discov.
Dongsheng Duan, Cheng Zhang, Lingling Tong, Jie Lu, Cunchi Lv, Wei Hou, Yangxi Li, Xiaofang Zhao
2024 J jnl
Neural Comput. Appl.
Zhentao Hu, Wei Hou, Xianxing Liu
2024 J jnl
CoRR
Wei Hou, Tim Colonius
2024 J jnl
Remote. Sens.
Yiming Yan, Mengyuan Wang, Nan Su, Wei Hou, Chunhui Zhao, Wenxuan Wang
2024 J jnl
Softw. Pract. Exp.
Gul Aftab Ahmed, James Vincent Patten, Yuanhua Han, Guoxian Lu, Wei Hou, David Gregg, Jim Buckley, Muslim Chochlov
2024 J jnl
Trans. Inst. Meas. Control
Zhentao Hu, Liuyang Tian, Wei Hou, Linlin Yang
2024 J jnl
BMC Medical Informatics Decis. Mak.
Shumeng Zhu, Baoping Zhang, Qian Tian, Ao Li, Zhe Liu, Wei Hou, Wenzhe Zhao, Xin Huang, Yao Xiao, Yiming Wang, Rui Wang, Yuhang Li, Jian Yang, Chao Jin
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Qingyu Xia, Yiming Yan, Wei Hou, Baoyu Ge, Nan Su, Shou Feng, Chunhui Zhao
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jiayue He, Nan Su, Congan Xu, Yanping Liao, Yiming Yan, Chunhui Zhao, Wei Hou, Shou Feng
2023 J jnl
Mob. Networks Appl.
Wenkui Zheng, Wei Hou, Jerry Chun-Wei Lin
2023 J jnl
Sensors
Yongfeng Gao, Siming Lu, Yongyi Shi, Shaojie Chang, Hao Zhang, Wei Hou, Lihong Li, Zhengrong Liang
2023 C conf
IGARSS
Yi Shen, Nan Su, Chunhui Zhao, Wei Hou, Bowen Huang, Yiming Yan
2023 J jnl
J. Inf. Sci. Eng.
Fang Ren, Mingyu Yu, Haiyan Xiu, Wei Hou
2023 J jnl
Remote. Sens.
Chunhui Zhao, Wenxuan Wang, Yiming Yan, Nan Su, Shou Feng, Wei Hou, Qingyu Xia
2023 J jnl
IEEE Access
Lingjun Zhong, Limin Meng, Wei Hou, Li Huang
2023 B conf
ICIP
Zihan Shen, Wei Hou, Yun Li
2023 J jnl
Comput. Biol. Medicine
Zhentao Hu, Yanyang Li, Zheng Wang, Shuo Zhang, Wei Hou
2023 J jnl
Appl. Soft Comput.
Zhentao Hu, Yujie Su, Wei Hou, Xing Ren
2023 J jnl
Remote. Sens.
Cheng Li, Jie Zhao, Wei Hou
2023 J jnl
Int. J. Digit. Earth
Wei Guo, Jinke Liu, Xuesheng Zhao, Wei Hou, Yunxuan Zhao, Yongxing Li, Wenbin Sun, Deqin Fan
2023 J jnl
CoRR
Muslim Chochlov, Gul Aftab Ahmed, James Vincent Patten, Guoxian Lu, Wei Hou, David Gregg, Jim Buckley
2023 J jnl
Comput. Methods Programs Biomed.
Zhentao Hu, Zheng Wang, Yong Jin, Wei Hou
2022 J jnl
IEEE Access
Wei Hou, Limin Meng, Xuqing Ke, Lingjun Zhong
2022 conf
AIPR
Fang Ren, Wei Hou, Mingyu Yu, Cong Tian
2022 C conf
HIS
Qin Cui, Wenkui Zheng, Wei Hou, Ming Sheng, Peng Ren, Wang Chang, Xiangyang Li
2022 C conf
HIS
Qi Xiao, Wenkui Zheng, Chenyu Mao, Wei Hou, Hao Lan, Daojun Han, Yang Duan, Peng Ren, Ming Sheng
2022 C conf
HIS
Wei Hou, Wenkui Zheng, Ming Sheng, Peng Ren, Baifu Zuo, Zhentao Hu, Xianxing Liu, Yang Duan
2022 J jnl
IEEE Access
Xuqing Ke, Wei Hou, Limin Meng
2022 A conf
ICSME
Muslim Chochlov, Gul Aftab Ahmed, James Vincent Patten, Guoxian Lu, Wei Hou, David Gregg, Jim Buckley
2021 conf
NaNA
Fang Ren, Mingyu Yu, Haiyan Xiu, Wei Hou
2021 J jnl
IEEE Trans. Instrum. Meas.
Wei Hou, Xian Tao, De Xu
2021 conf
eLEOT (2)
Guangmin Jiang, Xin Dai, Wei Hou
2021 J jnl
IEEE Trans. Instrum. Meas.
Wei Hou, Xian Tao, De Xu
2021 J jnl
Comput. Chem. Eng.
Qingjun Zhang, Wei Hou, Youguang Ma, Xigang Yuan, Aiwu Zeng
2021 J jnl
J. Am. Medical Informatics Assoc.
Xinyu Dong, Jianyuan Deng, Sina Rashidian, Kayley Abell-Hart, Wei Hou, Richard N. Rosenthal, Mary M. Saltz, Joel H. Saltz, Fusheng Wang
2021 J jnl
IEEE Trans. Instrum. Meas.
Xian Tao, Dapeng Zhang, Wei Hou, Wenzhi Ma, De Xu
2021 Misc conf
WISA
Peng Ren, Shuaibo Li, Wei Hou, Wenkui Zheng, Zhen Li, Qin Cui, Wang Chang, Xin Li, Chun Zeng, Ming Sheng, Yong Zhang
2021 C conf
HIS
Peng Ren, Wei Hou, Ming Sheng, Xin Li, Chao Li, Yong Zhang
2021 J jnl
Int. J. Intell. Syst.
Xi Zhang, Bo Zhao, Jing Qin, Wei Hou, Ye Su, Haining Yang
2021 J jnl
J. Biomed. Informatics
Xinyu Dong, Jianyuan Deng, Wei Hou, Sina Rashidian, Richard N. Rosenthal, Mary M. Saltz, Joel H. Saltz, Fusheng Wang
2021 conf
EITCE
Lei Sun, Xiwei Feng, Pengcheng Hua, Chi Zhao, Chaoqi Wang, Wei Hou
2021 J jnl
IEEE Trans. Veh. Technol.
Yifei Zhang, Wei Hou, Ying Li, Jun Cheng
2021 conf
Poly/DMAH@VLDB
Yu Wang, Ziqiao Guan, Wei Hou, Fusheng Wang
2021 J jnl
Geo spatial Inf. Sci.
Jixian Zhang, Haiyan Gu, Wei Hou, Chunquan Cheng
2020 J jnl
Reliab. Eng. Syst. Saf.
Ran Cao, David W. Coit, Wei Hou, Yushu Yang
2020 conf
MMM (2)
Wei Hou, Dakui Wang, Xiaojun Chen
2020 J jnl
CoRR
Xinyu Dong, Jianyuan Deng, Sina Rashidian, Kayley Abell-Hart, Wei Hou, Richard N. Rosenthal, Mary M. Saltz, Joel H. Saltz, Fusheng Wang
2020 J jnl
CoRR
Yu Wang, Ziqiao Guan, Wei Hou, Fusheng Wang
2019 J jnl
CoRR
Shan Lu, Wei Hou, Jun Cheng, Hiroshi Kamabe
2019 J jnl
Comput. Medical Imaging Graph.
Shu Zhang, Fangfang Han, Zhengrong Liang, Jiaxing Tan, Weiguo Cao, Yongfeng Gao, Marc Jason Pomeroy, Kenneth Ng, Wei Hou
2019 J jnl
IEEE Access
Zhaoji Zhang, Ying Li, Lei Liu, Wei Hou
2019 J jnl
CoRR
Zhaoji Zhang, Ying Li, Lei Liu, Wei Hou
2019 B conf
ISIT
Shan Lu, Wei Hou, Jun Cheng, Hiroshi Kamabe
2019 J jnl
IEEE Access
Yang Mo, Lijun Yang, Tiantian Zou, Wei Hou, Ruijin Liao
2018 B conf
ITW
Shan Lu, Wei Hou, Jun Cheng, Hiroshi Kamabe
2018 J jnl
Pac. Asia J. Assoc. Inf. Syst.
Wei Hou, Shijia Gao
2018 J jnl
Remote. Sens.
Lin Wu, Le Wang, Lin Min, Wei Hou, Zhengwei Guo, Jianhui Zhao, Ning Li
2018 J jnl
ISPRS Int. J. Geo Inf.
Xiaoping Xie, Wei Hou, Hendrik Herold
2018 C conf
ISITA
Kai-Hsin Wang, Wei Hou, Shan Lu, Ping-Yuen Wu, Yeong-Luh Ueng, Jun Cheng
2018 C conf
ISITA
Shan Lu, Wei Hou, Jun Cheng, Hiroshi Kamabe
2017 J jnl
ISPRS Int. J. Geo Inf.
Wei Hou, Xuejun Lu, Pengda Wu, An Xue, Liuke Li
2017 Misc conf
ICNC
Wei Hou, Linda Shi, Yingzhe Wang, Fan Wang, Hui Lyu, Marc St-Hilaire
2017 conf
PACIS
Wei Hou, Shijia Gao
2017 J jnl
Briefings Bioinform.
Soyoun Lee, Jie Yang, Jiayu Huang, Hao Chen, Wei Hou, Song Wu
2016 J jnl
ISPRS Int. J. Geo Inf.
Jixian Zhang, Jiping Liu, Liang Zhai, Wei Hou
2016 C conf
ISITA
Shan Lu, Wei Hou, Jun Cheng
2016 J jnl
J. Syst. Control. Eng.
Fang-long Yin, Songlin Nie, Shu-han Xiao, Wei Hou
2016 C conf
ISITA
Takatoshi Sakaguchi, Kengo Shibata, Wei Hou, Masakazu Yoshida, Jun Cheng
2016 J jnl
IET Commun.
Wei Hou, Shan Lu, Jun Cheng
2016 J jnl
IEEE Commun. Lett.
Wei Hou, Shan Lu, Jun Cheng
2016 conf
LISS
Yanhai Zhao, Guoxing Zhang, Wei Hou
2015 J jnl
IEEE Trans. Inf. Theory
Shan Lu, Wei Hou, Jun Cheng
2015 B conf
CEC
Wei Hou, Hongbin Dong, Guisheng Yin, Yuxin Dong
2015 J jnl
Sensors
Gang Tang, Wei Hou, Huaqing Wang, Ganggang Luo, Jianwei Ma
2015 conf
ICCI*CC
Wei Hou, Yuan Huang, Kao Zhang
2015 conf
ISICA
Lei Shang, Shujing Xu, Wei Hou, Lipeng Zhou
2014 J jnl
Briefings Bioinform.
Yanru Zeng, Wei Hou, Shuang Song, Sisi Feng, Lin Shen, Guohua Xia, Rongling Wu
2014 C conf
ISITA
Shan Lu, Wei Hou, Jun Cheng
2014 conf
ISTC
Wei Hou, Shan Lu, Jun Cheng
2013 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Wei Hou, Tadashi Fujino, Toshiharu Kojima
2013 Misc conf
ICNC
Zhe Ji, Wei Hou, Xin Jin, Zhi-Yi Li
2013 B conf
ISIT
Shan Lu, Jun Cheng, Wei Hou, Yoichiro Watanabe
2013 J jnl
CoRR
Jun He, Wei Hou, Hongbin Dong, Feidun He
2013 B conf
IEEE Congress on Evolutionary Computation
Jun He, Wei Hou, Hongbin Dong, Feidun He
2013 Misc conf
ICIG
Rongbao Chen, Huafeng Xiao, Xianwei Dou, Wei Hou
2012 B conf
WiMob
Wei Hou, Tadashi Fujino, Toshiharu Kojima
2011 J jnl
J. Inf. Technol. Res.
Wei Hou, Hongbin Dong, Guisheng Yin
2011 J jnl
Comput. Commun. Rev.
Lei Yang, Zengbin Zhang, Wei Hou, Ben Y. Zhao, Haitao Zheng
2010 conf
ISSPIT
Wei Hou, Tadashi Fujino
2010 conf
ISSPIT
Caio Masakazu Kinoshita, Wei Hou, Yusuke Sasaki, Tadashi Fujino
2010 J jnl
Expert Syst. Appl.
Zhun Zhou, Bingru Yang, Wei Hou
2010 J jnl
CoRR
Wei Hou, Lin Zhang, Lei Yang, Heather Zheng, Xiuming Shan
2010 conf
ISSPIT
Hidekazu Negishi, Wei Hou, Tadashi Fujino
2010 J jnl
Expert Syst. Appl.
Wei Hou, Bingru Yang, Chensheng Wu, Zhun Zhou
2010 Misc conf
NSDI
Lei Yang, Wei Hou, Lili Cao, Ben Y. Zhao, Haitao Zheng
2009 J jnl
Expert Syst. Appl.
Hongbin Dong, Yuxin Dong, Cheng Zhou, Guisheng Yin, Wei Hou
2009 conf
ETT
Zhiming Qu, Wei Hou
2009 conf
ETT
Zhiming Qu, Wei Hou
2009 J jnl
Expert Syst. Appl.
Bingru Yang, Wei Hou, Zhun Zhou, Huabin Quan
2009 conf
BIFE
Wei Hou, Bingru Yang, Yonghong Xie, Chensheng Wu
2009 conf
CoRoNet@MobiCom
Wei Hou, Lei Yang, Lin Zhang, Xiuming Shan, Heather Zheng
2008 conf
CSSE (4)
Wei Hou, Bingru Yang, Zhun Zhou, Chensheng Wu
2007 J jnl
Inf. Sci.
Hongbin Dong, Jun He, Houkuan Huang, Wei Hou
2007 J jnl
Bioinform.
Min Lin, Hongying Li, Wei Hou, Julie A. Johnson, Rongling Wu
2005 conf
MICAI
Hongbin Dong, Jun He, Houkuan Huang, Wei Hou
2003
Wei Hou
redb/extractors/apk_extractors/apk_dex.py
← Index redb/extractors/apk_extractors/apk_dex.py python
import hashlib
import inspect
import json
from collections import Counter
from datetime import datetime, timezone
from typing import Any

import tlsh

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKDexFile

# Sensitive API patterns categorized for malware analysis
SENSITIVE_API_CATEGORIES = {
    "reflection": [
        "Ljava/lang/reflect/Method;->invoke",
        "Ljava/lang/reflect/Field;->get",
        "Ljava/lang/reflect/Field;->set",
        "Ljava/lang/reflect/Constructor;->newInstance",
        "Ljava/lang/Class;->forName",
        "Ljava/lang/Class;->getMethod",
        "Ljava/lang/Class;->getDeclaredMethod",
        "Ljava/lang/Class;->getDeclaredField",
        "Ljava/lang/ClassLoader;->loadClass",
    ],
    "crypto": [
        "Ljavax/crypto/Cipher;->getInstance",
        "Ljavax/crypto/Cipher;->init",
        "Ljavax/crypto/spec/SecretKeySpec;-><init>",
        "Ljavax/crypto/spec/IvParameterSpec;-><init>",
        "Ljava/security/MessageDigest;->getInstance",
        "Ljava/security/KeyStore;->getInstance",
        "Ljavax/crypto/Mac;->getInstance",
    ],
    "dynamic_loading": [
        "Ldalvik/system/DexClassLoader;-><init>",
        "Ldalvik/system/PathClassLoader;-><init>",
        "Ldalvik/system/InMemoryDexClassLoader;-><init>",
        "Ldalvik/system/BaseDexClassLoader;-><init>",
        "Ljava/lang/Runtime;->exec",
        "Ljava/lang/ProcessBuilder;->start",
    ],
    "telephony": [
        "Landroid/telephony/TelephonyManager;->getDeviceId",
        "Landroid/telephony/TelephonyManager;->getSubscriberId",
        "Landroid/telephony/TelephonyManager;->getLine1Number",
        "Landroid/telephony/TelephonyManager;->getSimSerialNumber",
        "Landroid/telephony/TelephonyManager;->getNetworkOperator",
        "Landroid/telephony/TelephonyManager;->getSimOperator",
    ],
    "sms": [
        "Landroid/telephony/SmsManager;->sendTextMessage",
        "Landroid/telephony/SmsManager;->sendMultipartTextMessage",
        "Landroid/telephony/SmsManager;->sendDataMessage",
    ],
    "network": [
        "Ljava/net/HttpURLConnection;->connect",
        "Ljava/net/URL;->openConnection",
        "Lokhttp3/OkHttpClient;-><init>",
        "Lokhttp3/Request$Builder;->build",
        "Lorg/apache/http/client/HttpClient;->execute",
        "Landroid/webkit/WebView;->loadUrl",
        "Landroid/webkit/WebView;->setWebViewClient",
    ],
    "native": [
        "Ljava/lang/System;->loadLibrary",
        "Ljava/lang/System;->load",
        "Ljava/lang/Runtime;->loadLibrary",
    ],
    "device_info": [
        "Landroid/os/Build;->FINGERPRINT",
        "Landroid/os/Build;->MODEL",
        "Landroid/os/Build;->MANUFACTURER",
        "Landroid/os/Build;->PRODUCT",
        "Landroid/os/Build;->BRAND",
        "Landroid/os/Build;->DEVICE",
        "Landroid/os/Build;->HARDWARE",
        "Landroid/os/Build;->SERIAL",
        "Landroid/os/Build$VERSION;->SDK_INT",
        "Landroid/provider/Settings$Secure;->getString",
    ],
    "file_io": [
        "Ljava/io/FileOutputStream;-><init>",
        "Ljava/io/FileInputStream;-><init>",
        "Landroid/content/SharedPreferences;->edit",
        "Landroid/database/sqlite/SQLiteDatabase;->execSQL",
        "Landroid/database/sqlite/SQLiteDatabase;->rawQuery",
    ],
    "ipc": [
        "Landroid/content/ContentResolver;->query",
        "Landroid/content/ContentResolver;->insert",
        "Landroid/content/ContentResolver;->delete",
        "Landroid/content/Intent;-><init>",
        "Landroid/content/Context;->sendBroadcast",
        "Landroid/content/Context;->startService",
        "Landroid/content/Context;->bindService",
    ],
}


class APKDexExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.dex_files = []
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_DEX.value

    def _analyze_api_usage(self, dex):
        """Categorize sensitive API calls found in DEX bytecode."""
        api_usage = {cat: set() for cat in SENSITIVE_API_CATEGORIES}

        try:
            for method in dex.get_encoded_methods():
                code = method.get_code()
                if not code:
                    continue
                try:
                    bytecode = code.get_bc()
                    if not bytecode:
                        continue
                    for instruction in bytecode.get_instructions():
                        op_name = instruction.get_name()
                        if not op_name or not op_name.startswith("invoke"):
                            continue
                        output = instruction.get_output()
                        if not output:
                            continue
                        for category, patterns in SENSITIVE_API_CATEGORIES.items():
                            for pattern in patterns:
                                if pattern in output:
                                    api_usage[category].add(output.strip())
                                    break
                except Exception:
                    continue
        except Exception as e:
            self.log.warning(f"Error analyzing API usage: {e}")

        # Convert sets to sorted lists
        return {cat: sorted(calls) for cat, calls in api_usage.items() if calls}

    def _compute_obfuscation_indicators(self, classes, methods):
        """Compute obfuscation indicators from class/method names."""
        class_names = []
        for cls in classes:
            try:
                name = cls.get_name()
                if name:
                    class_names.append(name)
            except Exception:
                continue

        method_names = []
        for m in methods:
            try:
                name = m.get_name()
                if name and name not in ("<init>", "<clinit>"):
                    method_names.append(name)
            except Exception:
                continue

        if not class_names:
            return None

        # Short class names: extract just the class part from Dalvik notation
        short_class = 0
        for n in class_names:
            simple = n.split("/")[-1].rstrip(";")
            if len(simple) <= 2:
                short_class += 1

        short_method = sum(1 for n in method_names if len(n) <= 2)

        return {
            "short_class_names_pct": round(short_class / max(len(class_names), 1), 4),
            "short_method_names_pct": round(short_method / max(len(method_names), 1), 4),
            "non_ascii_identifiers": sum(1 for n in class_names if not n.isascii()),
            "avg_class_name_length": round(
                sum(len(n) for n in class_names) / max(len(class_names), 1), 2
            ),
        }

    def _compute_top_packages(self, classes):
        """Compute top packages by class count."""
        package_counter = Counter()
        for cls in classes:
            try:
                name = cls.get_name()  # "Lcom/example/foo/Bar;"
                if not name:
                    continue
                parts = name[1:].replace("/", ".").rsplit(".", 1)
                if len(parts) > 1:
                    package = parts[0]
                else:
                    package = "(default)"
                package_counter[package] += 1
            except Exception:
                continue

        return [
            {"package": pkg, "class_count": count}
            for pkg, count in package_counter.most_common(20)
        ]

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        from androguard.core.dex import DEX

        try:
            dex_names = list(self.apk.get_dex_names() or [])
        except Exception as e:
            self.log.warning(f"Error getting DEX names for {self.hash.sha256}: {e}")
            dex_names = []

        try:
            dex_buffers = list(self.apk.get_all_dex() or [])
        except Exception as e:
            self.log.error(f"Error getting DEX buffers for {self.hash.sha256}: {e}")
            return None

        if not dex_buffers:
            self.log.debug("No DEX files found in APK")
            return None

        self.dex_files = []
        for i, dex_data in enumerate(dex_buffers):
            dex_name = dex_names[i] if i < len(dex_names) else f"classes{i}.dex"

            dex_sha256 = hashlib.sha256(dex_data).hexdigest()
            dex_tlsh = None
            if len(dex_data) >= 50:
                try:
                    dex_tlsh = tlsh.hash(dex_data) or None
                except Exception:
                    pass

            try:
                d = DEX(dex_data)
            except Exception as e:
                self.log.warning(f"Failed to parse DEX {dex_name}: {e}")
                continue

            try:
                classes = list(d.get_classes() or [])
            except Exception as e:
                self.log.warning(f"Error getting classes from {dex_name}: {e}")
                classes = []
            try:
                methods = list(d.get_methods() or [])
            except Exception as e:
                self.log.warning(f"Error getting methods from {dex_name}: {e}")
                methods = []
            try:
                strings = list(d.get_strings() or [])
            except Exception as e:
                self.log.warning(f"Error getting strings from {dex_name}: {e}")
                strings = []

            try:
                top_packages = self._compute_top_packages(classes)
            except Exception as e:
                self.log.warning(f"Error computing top packages for {dex_name}: {e}")
                top_packages = []
            try:
                api_usage = self._analyze_api_usage(d)
            except Exception as e:
                self.log.warning(f"Error analyzing API usage for {dex_name}: {e}")
                api_usage = {}
            try:
                obfuscation_indicators = self._compute_obfuscation_indicators(classes, methods)
            except Exception as e:
                self.log.warning(f"Error computing obfuscation indicators for {dex_name}: {e}")
                obfuscation_indicators = None

            self.dex_files.append(APKDexFile(
                filename=dex_name,
                sha256=dex_sha256,
                class_count=len(classes),
                method_count=len(methods),
                string_count=len(strings),
                tlsh=dex_tlsh,
                top_packages=top_packages,
                api_usage=api_usage if api_usage else None,
                obfuscation_indicators=obfuscation_indicators,
            ))

        return self.dex_files if self.dex_files else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.dex_files:
                return None

            current_time = datetime.now(timezone.utc)

            # DEX table: one row per DEX file
            dex_data = []
            for dex in self.dex_files:
                dex_data.append([
                    self.sha256,
                    dex.sha256,
                    dex.filename,
                    dex.tlsh,
                    dex.class_count,
                    dex.method_count,
                    dex.string_count,
                    json.dumps(dex.top_packages) if dex.top_packages else None,
                    json.dumps(dex.obfuscation_indicators) if dex.obfuscation_indicators else None,
                    current_time,
                ])

            # API usage table: one row per category per DEX
            api_data = []
            for dex in self.dex_files:
                if dex.api_usage:
                    for category, api_calls in dex.api_usage.items():
                        api_data.append([
                            self.sha256,
                            dex.sha256,
                            category,
                            api_calls,
                            current_time,
                        ])

            return {
                'multi_table': True,
                'dex': {
                    'table': 'redb_apk_dex',
                    'data': dex_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'dex_filename', 'dex_tlsh',
                        'dex_class_count', 'dex_method_count', 'dex_string_count',
                        'dex_top_packages', 'dex_obfuscation_indicators',
                        'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'String', 'Nullable(String)',
                        'UInt32', 'UInt32', 'UInt32',
                        'Nullable(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'api_usage': {
                    'table': 'redb_apk_dex_api_usage',
                    'data': api_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'api_category',
                        'api_calls', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'LowCardinality(String)',
                        'Array(String)', "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def get_clickhouse_table(self) -> str:
        return "redb_apk_dex"