Haiming Liang

70 papers B 2Journal 65Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Cybern.
Sihai Zhao, Siqi Wu, Haiming Liang, Hengjie Zhang
2025 J jnl
Appl. Soft Comput.
Sihai Zhao, Siqi Wu, Haiming Liang, Hengjie Zhang
2025 B conf
SMC
Yixin Wang, Yucheng Dong, Haiming Liang, Yao Li, Yuzhu Wu, Quanbo Zha
2025 J jnl
Inf. Fusion
Haiming Liang, Yucheng Dong, Ying He
2024 J jnl
J. Oper. Res. Soc.
Hengjie Zhang, Wenfeng Zhu, Jing Xiao, Haiming Liang
2024 J jnl
IEEE Trans. Comput. Soc. Syst.
Haiming Liang, Weijun Xu, Francisco Chiclana, Shui Yu, Yucheng Dong, Enrique Herrera-Viedma
2024 J jnl
Appl. Soft Comput.
Wenbo Zhang, Xi Chen, Jie Mao, Feng Ke, Haiming Liang
2024 J jnl
Inf. Fusion
Sha Fan, Haiming Liang, Witold Pedrycz, Dong Yue
2024 J jnl
Ann. Oper. Res.
Hengjie Zhang, Wenfeng Zhu, Xin Chen, Yuzhu Wu, Haiming Liang, Cong-Cong Li, Yucheng Dong
2024 J jnl
Appl. Soft Comput.
Haiming Liang, Hengjie Zhang, Sihai Zhao, Hui Hu
2024 J jnl
Comput. Ind. Eng.
Weidong Wu, Haiming Liang, Yuzhu Wu, Bowen Zhang, Witold Pedrycz
2024 J jnl
IEEE Access
Siqin Liu, Haiming Liang, Zhusheng Zhou, Wenyang Chen
2024 J jnl
Inf. Fusion
Sha Fan, Haiming Liang, Cong-Cong Li, Francisco Chiclana, Witold Pedrycz, Yucheng Dong
2023 J jnl
Inf. Sci.
Xia Chen, Haiming Liang, Yangjingjing Zhang, Yuzhu Wu
2023 J jnl
Expert Syst. Appl.
Haiming Liang, Hui Hu, Yating Liu, Hengjie Zhang
2023 J jnl
Eng. Appl. Artif. Intell.
Yating Liu, Haiming Liang, Yucheng Dong, Yongfeng Cao
2023 J jnl
Expert Syst. Appl.
Yating Liu, Yao Li, Haiming Liang, Yucheng Dong
2022 J jnl
Expert Syst. Appl.
Sha Fan, Haiming Liang, Yucheng Dong, Witold Pedrycz
2022 J jnl
IEEE Trans. Fuzzy Syst.
Haiming Liang, Gang Kou, Yucheng Dong, Francisco Chiclana, Enrique Herrera-Viedma
2022 J jnl
IEEE Trans. Cybern.
Cong-Cong Li, Haiming Liang, Yucheng Dong, Francisco Chiclana, Enrique Herrera-Viedma
2022 J jnl
Int. J. Comput. Intell. Syst.
Junchang Qin, Sha Fan, Haiming Liang, Cong-Cong Li, Yucheng Dong
2022 J jnl
Complex Intell. Syst.
Keyu Xiang, Haiming Liang, Zhaoxia Guo, Yucheng Dong
2021 J jnl
Kybernetes
Haiming Liang, Xiao Zhang, Fang Fang, Xi Chen
2021 J jnl
Int. J. Comput. Intell. Syst.
Huali Tang, Shoufu Wan, Cong-Cong Li, Haiming Liang, Yucheng Dong
2021 J jnl
Comput. Ind. Eng.
Jie Long, Haiming Liang, Lei Gao, Zhaoxia Guo, Yucheng Dong
2021 J jnl
J. Intell. Fuzzy Syst.
Yuxuan Gao, Haiming Liang, Bingzhen Sun
2021 J jnl
IEEE Trans. Fuzzy Syst.
Haiming Liang, Cong-Cong Li, Yucheng Dong, Francisco Herrera
2021 J jnl
Inf. Fusion
Haiming Liang, Xia Chen, Cong-Cong Li, Hengjie Zhang
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Xia Chen, Zhaogang Ding, Yucheng Dong, Haiming Liang
2021 J jnl
IEEE Trans. Fuzzy Syst.
Yucheng Dong, Min Zhan, Zhaogang Ding, Haiming Liang, Francisco Herrera
2021 J jnl
Int. J. Inf. Technol. Decis. Mak.
Min Zhan, Haiming Liang, Can Zhu, Yucheng Dong
2021 J jnl
Inf. Fusion
Yi Liu, Haiming Liang, Lei Gao, Zhaoxia Guo
2021 J jnl
Comput. Ind. Eng.
Yating Liu, Zhengwei Sun, Haiming Liang, Yucheng Dong
2021 J jnl
Expert Syst. J. Knowl. Eng.
Yating Liu, Huali Tang, Haiming Liang, Hengjie Zhang, Cong-Cong Li, Yucheng Dong
2020 J jnl
Inf. Fusion
Xin Chen, Haiming Liang, Yuan Gao, Weijun Xu
2020 J jnl
IEEE Trans. Fuzzy Syst.
Haiming Liang, Yucheng Dong, Zhaogang Ding, Raquel Ureña, Francisco Chiclana, Enrique Herrera-Viedma
2020 J jnl
Knowl. Based Syst.
Jing Han, Xinyu Teng, Xiao Tang, Xun Cai, Haiming Liang
2020 J jnl
IEEE Trans. Fuzzy Syst.
Hengjie Zhang, Jing Xiao, Iván Palomares, Haiming Liang, Yucheng Dong
2020 J jnl
Inf. Fusion
Ke Li, Haiming Liang, Gang Kou, Yucheng Dong
2020 J jnl
Eur. J. Oper. Res.
Siqi Wu, Meng Wu, Yucheng Dong, Haiming Liang, Sihai Zhao
2020 J jnl
J. Oper. Res. Soc.
Xin Chen, Weijun Xu, Haiming Liang, Yucheng Dong
2019 J jnl
IEEE Trans. Comput. Soc. Syst.
Quanbo Zha, Haiming Liang, Gang Kou, Yucheng Dong, Shui Yu
2019 B conf
SMC
Quanbo Zha, Haiming Liang, Yucheng Dong
2019 J jnl
J. Intell. Fuzzy Syst.
Xi Chen, Juan Wang, Haiming Liang, Jing Han
2019 J jnl
IEEE Trans. Comput. Soc. Syst.
Min Zhan, Haiming Liang, Gang Kou, Yucheng Dong, Shui Yu
2019 J jnl
J. Comb. Optim.
Xi Chen, Liu Zhao, Haiming Liang, Kin Keung Lai
2019 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Yating Liu, Yucheng Dong, Haiming Liang, Francisco Chiclana, Enrique Herrera-Viedma
2019 J jnl
Knowl. Based Syst.
Haiming Liang, Cong-Cong Li, Guoyin Jiang, Yucheng Dong
2019 J jnl
Knowl. Based Syst.
Yucheng Dong, Yuxiang Fan, Haiming Liang, Francisco Chiclana, Enrique Herrera-Viedma
2019 J jnl
Soft Comput.
Yanping Jiang, Xia Liang, Manning Li, Haiming Liang
2019 J jnl
IEEE Access
Yuxuan Gao, Yueping Du, Bingzhen Sun, Haiming Liang
2018 J jnl
Comput. Ind. Eng.
Haiming Liang, Qiang Gong, Yucheng Dong, Zhaogang Ding
2018 J jnl
Soft Comput.
Xi Chen, Liu Zhao, Haiming Liang
2018 J jnl
Soft Comput.
Jing Han, Bin Li, Haiming Liang, Kin Keung Lai
2018 J jnl
Comput. Ind. Eng.
Haiming Liang, Wang Xiong, Yucheng Dong
2018 J jnl
Inf. Fusion
Yucheng Dong, Min Zhan, Gang Kou, Zhaogang Ding, Haiming Liang
2018 J jnl
Complex.
Yuxuan Gao, Yueping Du, Haiming Liang, Bingzhen Sun
2018 J jnl
Appl. Soft Comput.
Bowen Zhang, Haiming Liang, Guiqing Zhang, Yinfeng Xu
2018 J jnl
Eur. J. Oper. Res.
Yanping Jiang, Xia Liang, Haiming Liang, Ningman Yang
2018 J jnl
Inf. Fusion
Bowen Zhang, Haiming Liang, Guiqing Zhang
2018 J jnl
Knowl. Based Syst.
Bowen Zhang, Haiming Liang, Yuan Gao, Guiqing Zhang
2017 J jnl
Soft Comput.
Yanping Jiang, Xia Liang, Haiming Liang
2017 J jnl
J. Artif. Soc. Soc. Simul.
Zhaogang Ding, Yucheng Dong, Haiming Liang, Francisco Chiclana
2017 conf
CSA/CUTE
Yitao Wang, Huayang Wang, Xinye Zhao, Kedi Huang, Haiming Liang
2017 conf
CSA/CUTE
Yitao Wang, Huayang Wang, Haiming Liang, Liying Wang
2016 J jnl
J. Artif. Soc. Soc. Simul.
Haiming Liang, Yucheng Dong, Cong-Cong Li
2016 J jnl
Inf. Fusion
Yucheng Dong, Xia Chen, Haiming Liang, Cong-Cong Li
2016 J jnl
Inf. Fusion
Haiming Liang, Cong-Cong Li, Yucheng Dong, Yanping Jiang
2015 J jnl
Appl. Soft Comput.
Yucheng Dong, Nan Luo, Haiming Liang
2015 conf
IFSA-EUSFLAT
Haiming Liang, Yucheng Dong, Cong-Cong Li
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))