Xiangjun Zou

40 papers Journal 33Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Minqiu Kuang, Xuejie Zou, Fangping Xie, Xiaojian Li, Shang Chen, Dawei Liu, Yuxuan Zhang, Sebastian Bader, Xiangjun Zou, Xu Li
2025 J jnl
Comput. Electron. Agric.
Xinzhao Zhou, Xiangjun Zou, Hewei Meng, Fengyun Wu, Shang Chen, Xiwen Luo
2025 J jnl
Comput. Electron. Agric.
Zhi Liang, Xiaojuan Li, Guoqiang Wang, Fengyun Wu, Xiangjun Zou
2025 J jnl
Expert Syst. Appl.
Hongxing Peng, Zhenxing Li, Xiangjun Zou, Hongjun Wang, Juntao Xiong
2025 J jnl
Comput. Electron. Agric.
Hongxing Peng, Shangkun Guo, Xiangjun Zou, Hongjun Wang, Juntao Xiong, Qijun Liang
2024 J jnl
Comput. Electron. Agric.
Xiaojuan Li, Bo Liu, Yinggang Shi, Mingming Xiong, Dongyu Ren, Letian Wu, Xiangjun Zou
2023 J jnl
Remote. Sens.
Shaoxiong Zheng, Peng Gao, Yufei Zhou, Zepeng Wu, Liangxiang Wan, Fei Hu, Weixing Wang, Xiangjun Zou, Shihong Chen
2023 J jnl
Comput. Electron. Agric.
Fengyun Wu, Zhou Yang, Xingkang Mo, Zihao Wu, Wei Tang, Jieli Duan, Xiangjun Zou
2023 J jnl
Comput. Electron. Agric.
Lei Ye, Fengyun Wu, Xiangjun Zou, Jin Li
2023 J jnl
Comput. Electron. Agric.
Shang Chen, Xiangjun Zou, Xinzhao Zhou, Yang Xiang, Mingliang Wu
2022 J jnl
Comput. Electron. Agric.
Lanhui Fu, Fengyun Wu, Xiangjun Zou, Yinlong Jiang, Jiaquan Lin, Zhou Yang, Jieli Duan
2022 J jnl
Comput. Electron. Agric.
Fengyun Wu, Jieli Duan, Puye Ai, Zhaoyi Chen, Zhou Yang, Xiangjun Zou
2021 J jnl
Comput. Electron. Agric.
Mingyou Chen, Yunchao Tang, Xiangjun Zou, Zhaofeng Huang, Hao Zhou, Siyu Chen
2021 J jnl
Comput. Electron. Agric.
Lei Ye, Jieli Duan, Zhou Yang, Xiangjun Zou, Mingyou Chen, Sheng Zhang
2021 J jnl
Comput. Electron. Agric.
Guichao Lin, Lixue Zhu, Jinhui Li, Xiangjun Zou, Yunchao Tang
2021 J jnl
Comput. Electron. Agric.
Guichao Lin, Yunchao Tang, Xiangjun Zou, Chenglin Wang
2020 J jnl
IEEE Access
Jinhui Li, Yunchao Tang, Xiangjun Zou, Guichao Lin, Hongjun Wang
2020 J jnl
IEEE Access
Lanhui Fu, Jieli Duan, Xiangjun Zou, Jiaquan Lin, Lei Zhao, Jinhui Li, Zhou Yang
2020 J jnl
Comput. Electron. Agric.
Mingyou Chen, Yunchao Tang, Xiangjun Zou, Kuangyu Huang, Zhaofeng Huang, Hao Zhou, Chenglin Wang, Guoping Lian
2019 J jnl
Comput. Electron. Agric.
Lanhui Fu, Jieli Duan, Xiangjun Zou, Guichao Lin, Shuaishuai Song, Bang Ji, Zhou Yang
2019 J jnl
Sensors
Guichao Lin, Yunchao Tang, Xiangjun Zou, Juntao Xiong, Jinhui Li
2019 J jnl
Comput. Electron. Agric.
Xiaoman Cao, Xiangjun Zou, Chunyang Jia, Mingyou Chen, ZeQing Zeng
2019 J jnl
Robotics Comput. Integr. Manuf.
Yunchao Tang, Lijuan Li, Chenglin Wang, Mingyou Chen, Wenxian Feng, Xiangjun Zou, Kuangyu Huang
2019 conf
ISICA
Yunchao Tang, Mingyou Chen, Xiangguo Wu, Kuangyu Huang, Fengyun Wu, Xiangjun Zou, Yuxin He
2019 J jnl
IEEE Access
Chenglin Wang, Tianhong Luo, Lijun Zhao, Yunchao Tang, Xiangjun Zou
2018 J jnl
Comput. Ind.
Lufeng Luo, Yunchao Tang, Qinghua Lu, Xiong Chen, Po Zhang, Xiangjun Zou
2018 J jnl
Complex.
Lufeng Luo, Hanjin Wen, Qinghua Lu, Haojie Huang, Weilin Chen, Xiangjun Zou, Chenglin Wang
2018 J jnl
Comput. Ind.
Tianhu Liu, Reza Ehsani, Arash Toudeshki, Xiangjun Zou, Hongjun Wang
2018 J jnl
Comput. Electron. Agric.
Tianhu Liu, Gang Luo, Reza Ehsani, Arash Toudeshki, Xiangjun Zou, Hongjun Wang
2018 J jnl
Comput. Electron. Agric.
Juntao Xiong, Zhi-Liang He, Rui Lin, Zhen Liu, Rongbin Bu, Zhen-Gang Yang, Hongxing Peng, Xiangjun Zou
2017 J jnl
Comput. Electron. Agric.
Zhi-Liang He, Juntao Xiong, Rui Lin, Xiangjun Zou, Lin-Yue Tang, Zhen-Gang Yang, Zhen Liu, Ge Song
2017 J jnl
Sensors
Chenglin Wang, Yunchao Tang, Xiangjun Zou, Lufeng Luo, Xiong Chen
2016 J jnl
Sensors
Lufeng Luo, Yunchao Tang, Xiangjun Zou, Chenglin Wang, Po Zhang, Wenxian Feng
2014 conf
ICIRA (1)
Yuda Mo, Xiangjun Zou, Jiaqi Hou, Guichao Lin, Yuhui Long, Nian Liu, Bo Li, Zhilin Jiang
2012 J jnl
Mach. Vis. Appl.
Xiangjun Zou, Haixin Zou, Jun Lu
2011 conf
ICDMA
Fengying Xu, Guolong Liu, Xiangjun Zou, Zhen Chen, Ce Xu
2009 conf
ICIRA
Haixin Zou, Xiangjun Zou, Yinle Chen, Yan Chen, Quan Sun, Hongjun Wang, Tianhu Liu
2009 conf
ICIRA
Yan Chen, Shuang Jin, Xiangjun Zou, Dong-fen Xu, Wei-liang Cai
2009 conf
ICIRA
Hongjun Wang, Xiangjun Zou, Changyu Liu, Tianhu Liu, Jiaxin Chen
2006 conf
ICAT
Xiangjun Zou, Jun Lu, Lufeng Luo, Xiwen Luo, Yanqiong Zhou
redb/extractors/decompiler/apk/jadx_wrapper.py
← Index redb/extractors/decompiler/apk/jadx_wrapper.py python
"""JADX decompiler subprocess wrapper.

Manages JADX subprocess execution for Java decompilation,
following the CAPA extractor subprocess pattern.
"""

import os
import re
import signal
import subprocess
from typing import Dict, Optional


class JADXDecompiler:
    """Subprocess wrapper for JADX Java decompilation."""

    def __init__(self, jadx_path: str = None, timeout: int = None, log=None):
        self.jadx_path = jadx_path or os.getenv("JADX_PATH", "jadx")
        self.timeout = timeout or int(os.getenv("JADX_TIMEOUT", "300"))
        self.log = log

    def decompile(self, apk_path: str, output_dir: str) -> bool:
        """Run JADX decompilation on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.jadx_path,
            "--no-res",
            "--no-imports",
            "--threads-count", "2",
            "--output-dir", 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"JADX returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    # JADX may still produce partial output on non-zero exit
                    return os.path.isdir(os.path.join(output_dir, "sources"))
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"JADX timed out after {self.timeout}s"
                    )
                # Kill the process group
                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"JADX not found at '{self.jadx_path}'. "
                    "Install JADX or set JADX_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"JADX execution error: {e}")
            return False

    def parse_java_methods(self, output_dir: str) -> Dict[str, str]:
        """Parse JADX output into per-method Java source.

        Returns dict keyed by 'package.ClassName.methodName(ParamType1, ParamType2)'.
        """
        sources_dir = os.path.join(output_dir, "sources")
        if not os.path.isdir(sources_dir):
            return {}

        methods = {}
        for root, _dirs, files in os.walk(sources_dir):
            for fname in files:
                if not fname.endswith(".java"):
                    continue
                fpath = os.path.join(root, fname)
                try:
                    with open(fpath, "r", encoding="utf-8", errors="replace") as f:
                        content = f.read()

                    # Derive the fully qualified class name from file path
                    rel_path = os.path.relpath(fpath, sources_dir)
                    class_fqn = rel_path.replace(os.sep, ".").replace("/", ".")
                    if class_fqn.endswith(".java"):
                        class_fqn = class_fqn[:-5]

                    file_methods = self._extract_methods_from_java(
                        content, class_fqn
                    )
                    methods.update(file_methods)

                except Exception:
                    continue

        return methods

    def _extract_methods_from_java(
        self, source: str, class_fqn: str
    ) -> Dict[str, str]:
        """Extract individual methods from a Java source file.

        Uses brace-depth tracking to find method boundaries.
        """
        methods = {}
        lines = source.split("\n")
        i = 0

        while i < len(lines):
            line = lines[i]
            match = self._is_method_declaration(line)
            if match:
                method_name, param_types = match
                # Track brace depth to find method end
                start_line = i
                brace_depth = 0
                found_open = False

                for j in range(i, len(lines)):
                    for ch in lines[j]:
                        if ch == "{":
                            brace_depth += 1
                            found_open = True
                        elif ch == "}":
                            brace_depth -= 1

                    if found_open and brace_depth == 0:
                        method_body = "\n".join(lines[start_line : j + 1])
                        key = f"{class_fqn}.{method_name}({param_types})"
                        methods[key] = method_body
                        i = j + 1
                        break
                else:
                    i += 1
            else:
                i += 1

        return methods

    # Regex for method declarations (not constructors, not class/interface decl)
    _METHOD_DECL_RE = re.compile(
        r"^\s*(?:(?:public|private|protected|static|final|synchronized|"
        r"native|abstract|strictfp)\s+)*"
        r"(?:[\w<>\[\]?.]+\s+)"  # return type
        r"(\w+)"  # method name
        r"\s*\(([^)]*)\)"  # parameters
        r"(?:\s*throws\s+[\w.,\s]+)?"
        r"\s*\{"
    )

    def _is_method_declaration(self, line: str) -> Optional[tuple]:
        """Check if a line is a method declaration.

        Returns (method_name, param_types_str) or None.
        """
        m = self._METHOD_DECL_RE.match(line)
        if not m:
            return None

        method_name = m.group(1)
        params_raw = m.group(2).strip()

        # Skip class-level blocks
        if method_name in ("if", "for", "while", "switch", "try", "catch"):
            return None

        # Extract just the type names from parameters
        if not params_raw:
            return (method_name, "")

        param_types = []
        for param in params_raw.split(","):
            param = param.strip()
            if not param:
                continue
            parts = param.split()
            # Last non-annotation token before the variable name is the type
            # Simple heuristic: type is second-to-last, name is last
            if len(parts) >= 2:
                param_types.append(parts[-2])
            elif len(parts) == 1:
                param_types.append(parts[0])

        return (method_name, ", ".join(param_types))