Xiaodong Zhou

54 papers A* 5B 2C 3Misc 1Journal 30Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
Simul. Model. Pract. Theory
Jixin Shi, Maoyu Li, Nan Jiang, Hanchen Yu, Hongyun Yang, Xiaodong Zhou, Lizhong Yang
2026 J jnl
Phys. Commun.
Fusheng Li, Fan Zhang, Bin Qian, Xiaodong Zhou, Yi Luo, Xiangyong Feng
2026 J jnl
Knowl. Based Syst.
Jia Peng, Xiaoyu Liu, Xiaodong Zhou, Lei Wang, Xianyou Zhu
2026 J jnl
Comput. Medical Imaging Graph.
Xiaodong Zhou, Huibin Wang
2025 J jnl
Comput. Medical Imaging Graph.
Xiaodong Zhou, Huibin Wang, Lili Zhang
2025 J jnl
J. Comput. Methods Sci. Eng.
Xingyuan Fan, Ying Zhao, Jun Dong, Xiaodong Zhou, Xiangyong Feng
2025 J jnl
Frontiers Inf. Technol. Electron. Eng.
Qingmei Cao, Ruiwen Xiang, Yonghong Tan, Weiqing Sun, Jiawei Chi, Xiaodong Zhou, Lei Yao
2025 J jnl
IEEE Access
Li Yan, Xiaodong Zhou, Yaotian Wang, Xuan Chang, Qing Li, Gang Han
2025 J jnl
J. Comput. Methods Sci. Eng.
Yin Zhao, Xingyuan Fan, Jun Dong, Mi Zhou, Xiaodong Zhou
2025 J jnl
IEEE Robotics Autom. Lett.
Jun Zhang, Haoyun Chen, Yun Li, Xiaoyu Chu, Xiaodong Zhou, Aiguo Song
2025 J jnl
Algorithms
Tingzhe Pan, Jue Hou, Xin Jin, Chao Li, Xinlei Cai, Xiaodong Zhou
2025 J jnl
IEEE Robotics Autom. Lett.
Rui Zhang, Qiang Zhang, Xiaodong Zhou
2025 J jnl
IEEE Trans. Consumer Electron.
Junhao Feng, Boyang Huang, Xiaodong Zhou, Xin Jin
2025 J jnl
CoRR
Qingyue Cao, Bo Jin, Changwei Gong, Xin Tong, Wenzheng Li, Xiaodong Zhou
2025 J jnl
Ind. Robot
Rui Zhang, Qiang Zhang, Junbo Cheng, Xiaodong Zhou
2024 J jnl
Sensors
Ten It Wong, Candy Ng, Shengxuan Lin, Zhong Chen, Xiaodong Zhou
2024 J jnl
Scalable Comput. Pract. Exp.
Xiaoxu Dang, Guoyu Wang, Xiaodong Zhou, Shihui Wang
2023 J jnl
Scalable Comput. Pract. Exp.
Xiaoxu Dang, Guoyu Wang, Xiaodong Zhou, Shihui Wang
2023 J jnl
Concurr. Comput. Pract. Exp.
Li Lv, Xiaodong Zhou, Dekun Tan, Ping Kang, RunXiu Wu
2022 A* conf
ICRA
Wenrui Chen, Qiang Diao, Yaonan Wang, Xiaodong Zhou, Qiang Zhang, Cuo Yan, Zhiyong Li
2022 J jnl
Sensors
Kaibai Chen, Shaohua Liu, Min Gao, Xiaodong Zhou
2022 J jnl
IEEE Trans. Cybern.
Lin Yang, Yanan Li, Deqing Huang, Jingkang Xia, Xiaodong Zhou
2021 conf
ICCC Workshops
Xu Xia, Chengli Mei, Xiaodong Zhou, Sheng Wang, Heng Wang, Yanxia Xing
2021 J jnl
IEEE Access
Xitong Sun, Min Gao, Xiaodong Zhou, Jing Lv, Feng Tian, Zhiming Qiao
2021 J jnl
IEEE Access
Dong Tao, Qiang Zhang, Xiaoyu Chu, Xiaodong Zhou, Liangyu Zhao
2020 J jnl
Frontiers Neurorobotics
Shiping Zuo, Jianfeng Li, Mingjie Dong, Xiaodong Zhou, Wenpei Fan, Yuan Kong
2020 conf
ICVIP
Xiaofeng Yue, Juan Zhu, Xiaodong Zhou, Zeyuan Liu, Xianning Yu
2020 conf
AIAM
Xiaodong Zhou, Jianfeng Li, Shiping Zuo
2019 J jnl
ISPRS Int. J. Geo Inf.
Xiaodong Zhou, Tinghua Ai, Ni-na Meng, Peng Xie
2019 conf
ICBBE
Junwei Zhao, Zhenliang Lin, Xiaodong Zhou, Guobin Li, Jie Luo
2019 conf
ICBBE
Yudong Zhong, Xiaodong Zhou, Yiping Du, Qun Chen
2019 conf
ICCMS
Yubiao Huang, Jia Gui, Xiaodong Zhou, Bei Cao, Yuan Zheng, Kai Ye, Xiaoyu Ju, Yong Ni, Lizhong Yang
2019 J jnl
Frontiers Robotics AI
Yanan Li, Xiaodong Zhou, Junpei Zhong, Xuefang Li
2018 J jnl
ISPRS Int. J. Geo Inf.
Xiaodong Zhou, Zhe Chen, Xiang Zhang, Tinghua Ai
2017 J jnl
Pattern Recognit.
Jinpeng Zhang, Lichi Zhang, Lei Xiang, Yeqin Shao, Guorong Wu, Xiaodong Zhou, Dinggang Shen, Qian Wang
2015 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Zhijian Fu, Xiaodong Zhou, Yanqiu Chen, Junhui Gong, Fei Peng, Zidan Yan, Taolin Zhang, Lizhong Yang
2011 conf
BIBM Workshops
Xiaodong Zhou, E. Olusegun George
2011 C conf
ICICS
Dan Wang, Xiaodong Zhou, Wenbing Zhao
2011 conf
ICAIC (2)
Heshan Guan, Shuliang Zou, Xiaodong Zhou, Zitong Huang
2011 conf
BIBM Workshops
Xiaodong Zhou, E. Olusegun George
2009 conf
FSKD (1)
Xiaodong Zhou, Chun-Cheng Yang, Ni-na Meng
2009 conf
ICNC (5)
Ni-na Meng, Tinghua Ai, Rong-juan Li, Xiaodong Zhou
2008 conf
CSSE (3)
Guohua Wu, Xiaodong Zhou
2008 A* conf
ACL
Giuseppe Carenini, Raymond T. Ng, Xiaodong Zhou
2007 A* conf
WWW
Giuseppe Carenini, Raymond T. Ng, Xiaodong Zhou
2006 conf
AINA (2)
Xiaodong Zhou, Jiandong Li, Dongfang Zhao
2005 Misc conf
SAC
Giuseppe Carenini, Raymond T. Ng, Xiaodong Zhou, Ed Zwart
2005 A* conf
KDD
Giuseppe Carenini, Raymond T. Ng, Xiaodong Zhou
2003 B conf
PIMRC
Jun Yang, Jiandong Li, Xiaodong Zhou
2003 B conf
ICTAI
Qingcang Yu, Harry H. Cheng, Wayne W. Cheng, Xiaodong Zhou
2002 C conf
IGARSS
Shihao Tang, Qijiang Zhu, Xiaodong Zhou, Shaomin Liu, Menxin Wu
2002 C conf
IGARSS
Xiaodong Zhou, Qijiang Zhu, Shihao Tang, Xue Chen, Menzin Wu
2002 A* conf
VLDB
Laks V. S. Lakshmanan, Raymond T. Ng, Christine Xing Wang, Xiaodong Zhou, Theodore Johnson
2001 J jnl
IEEE Trans. Biomed. Eng.
Mingxi Wan, Yangmei Li, Junbo Li, Yaoyao Cui, Xiaodong Zhou
redb/extractors/apk_extractors/apk_features.py
← Index redb/extractors/apk_extractors/apk_features.py python
import inspect
import zipfile
from datetime import datetime, timezone
from typing import Any

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


class APKFeaturesExtractor(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.apk_features = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_zip_timestamps(self):
        """Extract earliest and latest content modification from ZIP entries."""
        earliest = None
        latest = None
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        try:
                            dt = datetime(*info.date_time)
                            if earliest is None or dt < earliest:
                                earliest = dt
                            if latest is None or dt > latest:
                                latest = dt
                        except (ValueError, TypeError):
                            continue
        except Exception as e:
            self.log.warning(f"Error extracting ZIP timestamps: {e}")
        return (
            earliest.isoformat() if earliest else None,
            latest.isoformat() if latest else None,
        )

    def _extract_supported_abis(self):
        """Determine supported ABIs from lib/ directory."""
        abis = set()
        for f in self._list_files():
            if f.startswith("lib/") and f.endswith(".so"):
                parts = f.split("/")
                if len(parts) >= 3:
                    abis.add(parts[1])
        return sorted(abis)

    def _count_dex_files(self):
        """Count DEX files and compute total size."""
        dex_count = 0
        total_size = 0
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        if info.filename.endswith(".dex"):
                            dex_count += 1
                            total_size += info.file_size
        except Exception as e:
            self.log.warning(f"Error counting DEX files: {e}")
        return dex_count, total_size

    def _check_embedded_apk(self):
        """Check if the archive contains nested APK files."""
        for f in self._list_files():
            if f.lower().endswith(".apk"):
                return True
        return False

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

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

        package_name = self._safe_extract(
            "package_name", lambda: self.apk.get_package()
        )
        app_name = self._safe_extract(
            "app_name", lambda: self.apk.get_app_name()
        )

        def _get_version_code():
            try:
                return int(self.apk.get_androidversion_code() or 0)
            except (ValueError, TypeError):
                return 0

        version_code = self._safe_extract("version_code", _get_version_code)
        version_name = self._safe_extract(
            "version_name", lambda: self.apk.get_androidversion_name()
        )

        def _get_sdk(getter):
            val = getter()
            return int(val) if val else None

        min_sdk = self._safe_extract(
            "min_sdk_version", lambda: _get_sdk(self.apk.get_min_sdk_version)
        )
        target_sdk = self._safe_extract(
            "target_sdk_version", lambda: _get_sdk(self.apk.get_target_sdk_version)
        )
        compile_sdk = self._safe_extract(
            "compile_sdk_version",
            lambda: _get_sdk(self.apk.get_effective_target_sdk_version),
        )

        main_activity = self._safe_extract(
            "main_activity", lambda: self.apk.get_main_activity()
        )

        is_debuggable = self._safe_extract(
            "is_debuggable",
            lambda: self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true",
            False,
        )
        allow_backup = self._safe_extract(
            "allow_backup",
            lambda: self.apk.get_attribute_value(
                "application", "allowBackup"
            ) != "false",
            True,
        )
        uses_cleartext = self._safe_extract(
            "uses_cleartext_traffic",
            lambda: self.apk.get_attribute_value(
                "application", "usesCleartextTraffic"
            ) == "true",
            False,
        )

        supported_abis = self._safe_extract(
            "supported_abis", self._extract_supported_abis, []
        )
        dex_count, total_dex_size = self._safe_extract(
            "dex_files", self._count_dex_files, (0, 0)
        )
        all_files = self._safe_extract("file_list", self._list_files, [])
        total_file_count = len(all_files)
        has_native_code = any(
            f.startswith("lib/") and f.endswith(".so") for f in all_files
        )
        has_assets = any(f.startswith("assets/") for f in all_files)
        contains_embedded_apk = self._safe_extract(
            "contains_embedded_apk", self._check_embedded_apk, False
        )

        uses_libraries = self._safe_extract(
            "uses_libraries",
            lambda: list(self.apk.get_libraries() or []),
            [],
        )

        earliest_mod, latest_mod = self._safe_extract(
            "zip_timestamps", self._extract_zip_timestamps, (None, None)
        )

        self.apk_features = APKFeatures(
            package_name=package_name,
            app_name=app_name,
            version_code=version_code,
            version_name=version_name,
            min_sdk_version=min_sdk,
            target_sdk_version=target_sdk,
            compile_sdk_version=compile_sdk,
            main_activity=main_activity,
            is_debuggable=is_debuggable,
            allow_backup=allow_backup,
            uses_cleartext_traffic=uses_cleartext,
            supported_abis=supported_abis,
            dex_count=dex_count,
            total_dex_size=total_dex_size,
            total_file_count=total_file_count,
            has_native_code=has_native_code,
            has_assets=has_assets,
            uses_libraries=uses_libraries,
            earliest_content_modification=earliest_mod,
            latest_content_modification=latest_mod,
            contains_embedded_apk=contains_embedded_apk,
        )
        return self.apk_features

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

            f = self.apk_features
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                f.package_name,
                f.app_name,
                f.version_code,
                f.version_name,
                f.min_sdk_version,
                f.target_sdk_version,
                f.compile_sdk_version,
                f.main_activity,
                int(f.is_debuggable),
                int(f.allow_backup),
                int(f.uses_cleartext_traffic),
                f.supported_abis,
                f.dex_count,
                f.total_dex_size,
                f.total_file_count,
                int(f.has_native_code),
                int(f.has_assets),
                f.uses_libraries,
                f.earliest_content_modification,
                f.latest_content_modification,
                int(f.contains_embedded_apk),
                current_time,
            ]]

            column_names = [
                "sha256",
                "package_name", "app_name", "version_code", "version_name",
                "min_sdk_version", "target_sdk_version", "compile_sdk_version",
                "main_activity",
                "is_debuggable", "allow_backup", "uses_cleartext_traffic",
                "supported_abis",
                "dex_count", "total_dex_size", "total_file_count",
                "has_native_code", "has_assets",
                "uses_libraries",
                "earliest_content_modification", "latest_content_modification",
                "contains_embedded_apk",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)",
                "Nullable(String)", "Nullable(String)", "Nullable(UInt32)", "Nullable(String)",
                "Nullable(UInt16)", "Nullable(UInt16)", "Nullable(UInt16)",
                "Nullable(String)",
                "UInt8", "UInt8", "UInt8",
                "Array(String)",
                "UInt16", "UInt64", "UInt32",
                "UInt8", "UInt8",
                "Array(String)",
                "Nullable(String)", "Nullable(String)",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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