Xialin Li

16 papers C 4Journal 11Unranked 1
YearRankTypeTitle / Venue / Authors
2026 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Xialin Li, Xiaoying Hu, Keying Yang, Jingrui Zhang
2025 J jnl
IEEE Trans. Ind. Informatics
Jiaqing Zhai, Li Guo, Zhongguan Wang, Xialin Li, Yixin Liu, Chengshan Wang
2025 J jnl
IEEE Trans. Ind. Electron.
Xu Zhou, Li Guo, Xialin Li, Zhi Wang, Jiebei Zhu, Chengshan Wang
2022 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Peng Li, Yijing Wang, Lei Liu, Xialin Li, Zhiqiang Zuo
2021 C conf
IECON
Yixian Yang, Li Guo, Xialin Li, Jiaxin Li, Wei Liu, Huihui He
2021 C conf
IECON
Xialin Li, Chen Zhang, Lin Zhu, Pengfei Li, Zhi Wang, Li Guo
2021 C conf
IECON
Xialin Li, Xunyang Wang, Li Guo, Rui Liu, Hongda Wang, Jianchun Xing
2021 C conf
IECON
Pengfei Li, Li Guo, Xialin Li, Chen Zhang, Lin Zhu, Ye Zhang
2020 conf
ISICDM
Xialin Li, Chen Li, Wenwei Zhao, Yuzhuo Gu, Jindong Li, Peng Xu
2020 J jnl
CoRR
Xialin Li, Chen Li, Wenwei Zhao
2020 J jnl
IEEE Access
Xialin Li, Chen Li, Frank Kulwa, Md Mamunur Rahaman, Wenwei Zhao, Xue Wang, Dan Xue, Yudong Yao, Yilin Cheng, Jindong Li, Shouliang Qi, Tao Jiang
2019 J jnl
IEEE Access
Xialin Li, Zhiwang Li, Li Guo, Jiebei Zhu, Yizhen Wang, Chengshan Wang
2019 J jnl
IEEE Access
Yanbo Che, Jingjing Jia, Jiebei Zhu, Xialin Li, Zihan Lv, Ming Li
2018 J jnl
IEEE Trans. Smart Grid
Xialin Li, Li Guo, Yun Wei Li, Zhen Guo, Chao Hong, Ye Zhang, Chengshan Wang
2018 J jnl
IEEE Trans. Smart Grid
Xialin Li, Li Guo, Shaohui Zhang, Chengshan Wang, Yun Wei Li, Anwei Chen, Yibin Feng
2016 J jnl
IEEE Trans. Smart Grid
Li Guo, Wenjian Liu, Xialin Li, Yixin Liu, Bingqi Jiao, Wei Wang, Chengshan Wang, Fangxing Li
redb/extractors/decompiler/apk/apktool_wrapper.py
← Index redb/extractors/decompiler/apk/apktool_wrapper.py python
"""Apktool disassembler subprocess wrapper.

Manages apktool subprocess execution for smali disassembly,
following the CAPA extractor subprocess pattern.
"""

import os
import signal
import subprocess
from typing import List, Optional


class ApktoolDisassembler:
    """Subprocess wrapper for apktool smali disassembly."""

    def __init__(
        self, apktool_path: str = None, timeout: int = None, log=None
    ):
        self.apktool_path = apktool_path or os.getenv("APKTOOL_PATH", "apktool")
        self.timeout = timeout or int(os.getenv("APKTOOL_TIMEOUT", "120"))
        self.log = log

    def disassemble(self, apk_path: str, output_dir: str) -> bool:
        """Run apktool disassembly on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.apktool_path,
            "d",
            "--no-res",
            "--force",
            "--output", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"apktool returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    return False
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"apktool timed out after {self.timeout}s"
                    )
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"apktool not found at '{self.apktool_path}'. "
                    "Install apktool or set APKTOOL_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"apktool execution error: {e}")
            return False

    def get_smali_directories(self, output_dir: str) -> List[str]:
        """Return paths to all smali output directories.

        Handles multi-DEX: smali/, smali_classes2/, smali_classes3/, etc.
        """
        smali_dirs = []
        if not os.path.isdir(output_dir):
            return smali_dirs

        for entry in sorted(os.listdir(output_dir)):
            if entry == "smali" or entry.startswith("smali_classes"):
                full_path = os.path.join(output_dir, entry)
                if os.path.isdir(full_path):
                    smali_dirs.append(full_path)

        return smali_dirs