Hankz Hankui Zhuo

91 papers A* 22A 4B 1C 1Journal 53Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Chang Yao, Jinghui Qin, Kebing Jin, Hankz Hankui Zhuo
2025 J jnl
Neural Networks
Xuechen Mu, Hankz Hankui Zhuo, Chen Chen, Kai Zhang, Chao Yu, Jianye Hao
2025 J jnl
CoRR
Wenkai Yu, Jianhang Tang, Yang Zhang, Shanjiang Tang, Kebing Jin, Hankz Hankui Zhuo
2025 J jnl
ACM Trans. Intell. Syst. Technol.
Kebing Jin, Hankz Hankui Zhuo
2025 J jnl
CoRR
Fangjian Shen, Yicheng Zheng, Wushao Wen, Hankz Hankui Zhuo
2025 A* conf
IJCAI
Jingjin Liu, Yingkai Xiao, Hankz Hankui Zhuo, Wushao Wen
2025 A* conf
IJCAI
Zhanwen Zhou, Hankz Hankui Zhuo, Jinghua Zhou, Wushao Wen
2024 conf
ICIC (LNAI 5)
Yingkai Xiao, Kebing Jin, Renyong Ma, Hankz Hankui Zhuo
2024 J jnl
CoRR
Hankz Hankui Zhuo, Xin Chen, Rong Pan
2024 A conf
ECAI
Fan Zhang, Kebing Jin, Hankz Hankui Zhuo
2023 J jnl
CoRR
Yingkai Xiao, Jingjin Liu, Hankz Hankui Zhuo
2023 conf
PAAP
Benbo Zha, Hong Shen, Hankz Hankui Zhuo, Zhijian Luo
2023 A conf
ECAI
Weixin Wu, Hankz Hankui Zhuo
2023 J jnl
CoRR
Weixin Wu, Hankz Hankui Zhuo
2023 A* conf
IJCAI
Kebing Jin, Hankz Hankui Zhuo, Zhanhao Xiao, Hai Wan, Subbarao Kambhampati
2023 J jnl
CoRR
Xuechen Mu, Hankz Hankui Zhuo, Chen Chen, Kai Zhang, Chao Yu, Jianye Hao
2023 A* conf
AAAI
Zifan Wu, Chao Yu, Chen Chen, Jianye Hao, Hankz Hankui Zhuo
2023 J jnl
CoRR
Zifan Wu, Chao Yu, Chen Chen, Jianye Hao, Hankz Hankui Zhuo
2023 J jnl
CoRR
Zifan Wu, Chao Yu, Chen Chen, Jianye Hao, Hankz Hankui Zhuo
2023 J jnl
CoRR
Fan Zhang, Kebing Jin, Hankz Hankui Zhuo
2023 J jnl
CoRR
Chao Yu, Xuejing Zheng, Hankz Hankui Zhuo, Hai Wan, Weilin Luo
2023 J jnl
CoRR
Jingjin Liu, Hankz Hankui Zhuo, Kebing Jin, Jiamin Yuan, Zhimin Yang, Zhengan Yao
2023 J jnl
CoRR
Zhanwen Zhou, Hankz Hankui Zhuo, Xiaowu Zhang, Qiyuan Deng
2022 J jnl
CoRR
Kebing Jin, Yingkai Xiao, Hankz Hankui Zhuo, Renyong Ma
2022 A* conf
AAAI
Mu Jin, Zhihao Ma, Kebing Jin, Hankz Hankui Zhuo, Chen Chen, Chao Yu
2022 J jnl
Artif. Intell.
Kebing Jin, Hankz Hankui Zhuo, Zhanhao Xiao, Hai Wan, Subbarao Kambhampati
2022 J jnl
CoRR
Kebing Jin, Hankz Hankui Zhuo
2022 J jnl
CoRR
Jianye Hao, Jiawen Lu, Xijun Li, Xialiang Tong, Xiang Xiang, Mingxuan Yuan, Hankz Hankui Zhuo
2022 J jnl
CoRR
Kebing Jin, Zhanhao Xiao, Hankz Hankui Zhuo, Hai Wan, Jiaran Cai
2022 A* conf
NeurIPS
Zifan Wu, Chao Yu, Chen Chen, Jianye Hao, Hankz Hankui Zhuo
2022 conf
WWW (Companion Volume)
Liming Gao, Dongliang Liao, Gongfu Li, Jin Xu, Hankz Hankui Zhuo
2022 conf
ChineseCSCW (2)
Yuechang Liu, Dongbo Xie, Hankz Hankui Zhuo, Liqian Lai, Zhimin Li
2022 J jnl
CoRR
Kebing Jin, Huaixun Chen, Hankz Hankui Zhuo
2021 J jnl
Sensors
Ziqi Sheng, Kebing Jin, Zhihao Ma, Hankz Hankui Zhuo
2021 A* conf
NeurIPS
Zifan Wu, Chao Yu, Deheng Ye, Junge Zhang, Haiyin Piao, Hankz Hankui Zhuo
2021 J jnl
CoRR
Zifan Wu, Chao Yu, Deheng Ye, Junge Zhang, Haiyin Piao, Hankz Hankui Zhuo
2021 J jnl
CoRR
Mu Jin, Zhihao Ma, Kebing Jin, Hankz Hankui Zhuo, Chen Chen, Chao Yu
2021 J jnl
CoRR
Kebing Jin, Hankz Hankui Zhuo, Zhanhao Xiao, Hai Wan, Subbarao Kambhampati
2021 J jnl
CoRR
Zhihao Ma, Yuzheng Zhuang, Paul Weng, Hankz Hankui Zhuo, Dong Li, Wulong Liu, Jianye Hao
2021 J jnl
CoRR
Xuejing Zheng, Chao Yu, Chen Chen, Jianye Hao, Hankz Hankui Zhuo
2021 A* ed.
ICAPS
Susanne Biundo, Minh Do, Robert Goldman, Michael Katz, Qiang Yang, Hankz Hankui Zhuo
2021 J jnl
CoRR
Siqi Hong, Hankz Hankui Zhuo, Kebing Jin, Zhanwen Zhou
2020 J jnl
ACM Trans. Intell. Syst. Technol.
Hankz Hankui Zhuo, Yantian Zha, Subbarao Kambhampati, Xin Tian
2020 J jnl
CoRR
Huiling Zhu, Xin Luo, Hankz Hankui Zhuo
2020 A* conf
AAAI
Yuechang Liu, Dongbo Xie, Hankz Hankui Zhuo, Liqian Lai
2020 A* conf
AAAI
Zhanhao Xiao, Hai Wan, Hankz Hankui Zhuo, Andreas Herzig, Laurent Perrussel, Peilin Chen
2020 A* conf
AAAI
Junyi Shen, Hankz Hankui Zhuo, Jin Xu, Bin Zhong, Sinno Jialin Pan
2019 J jnl
CoRR
Feng Liao, Hankz Hankui Zhuo, Xiaoling Huang, Yu Zhang
2019 J jnl
CoRR
Hankz Hankui Zhuo, Wenfeng Feng, Qian Xu, Qiang Yang, Yufeng Lin
2019 J jnl
CoRR
Hankz Hankui Zhuo, Jing Peng, Subbarao Kambhampati
2019 A* conf
AAAI
Min Tang, Jiaran Cai, Hankz Hankui Zhuo
2019 J jnl
ACM Trans. Intell. Syst. Technol.
Hankz Hankui Zhuo
2019 J jnl
CoRR
Zhanhao Xiao, Hai Wan, Hankz Hankui Zhuo, Andreas Herzig, Laurent Perrussel, Peilin Chen
2019 J jnl
CoRR
Xinghua Zheng, Ming Tang, Hankz Hankui Zhuo, Kevin X. Wen
2019 J jnl
CoRR
Zhanhao Xiao, Hai Wan, Hankz Hankui Zhuo, Jinxia Lin, Yanan Liu
2019 J jnl
CoRR
Junyi Shen, Hankz Hankui Zhuo, Jin Xu, Bin Zhong, Sinno Jialin Pan
2018 conf
PAKDD (1)
Chuantao Zong, Wenfeng Feng, Vincent W. Zheng, Hankz Hankui Zhuo
2018 J jnl
CoRR
Yuncong Li, Hankz Hankui Zhuo
2018 conf
NAACL-HLT
Mingmin Jin, Xin Luo, Huiling Zhu, Hankz Hankui Zhuo
2018 J jnl
CoRR
Hankz Hankui Zhuo, Yantian Zha, Subbarao Kambhampati
2018 A* conf
IJCAI
Wenfeng Feng, Hankz Hankui Zhuo, Subbarao Kambhampati
2018 J jnl
CoRR
Wenfeng Feng, Hankz Hankui Zhuo, Subbarao Kambhampati
2018 conf
PRCV (3)
Jarvan Law, Hankz Hankui Zhuo, Junhua He, Erhu Rong
2017 J jnl
CoRR
Junhua He, Hankz Hankui Zhuo, Jarvan Law
2017 A* conf
AAAI
Hankz Hankui Zhuo
2017 J jnl
CoRR
Jarvan Law, Hankz Hankui Zhuo, Junhua He, Erhu Rong
2017 J jnl
Artif. Intell.
Hankz Hankui Zhuo, Subbarao Kambhampati
2017 J jnl
CoRR
Han Tian, Hankz Hankui Zhuo
2017 A* conf
ICRA
Yu Zhang, Sarath Sreedharan, Anagha Kulkarni, Tathagata Chakraborti, Hankz Hankui Zhuo, Subbarao Kambhampati
2016 J jnl
Sensors
Xiaomu Luo, Huoyuan Tan, Qiuju Guan, Tong Liu, Hankz Hankui Zhuo, Baihua Shen
2016 A conf
AAMAS
Xin Tian, Hankz Hankui Zhuo, Subbarao Kambhampati
2015 B conf
HCOMP
Jie Gao, Hankz Hankui Zhuo, Subbarao Kambhampati, Lei Li
2015 A* conf
AAAI
Hankz Hankui Zhuo
2015 J jnl
CoRR
Xin Tian, Hankz Hankui Zhuo, Subbarao Kambhampati
2015 J jnl
CoRR
Yu Zhang, Hankz Hankui Zhuo, Subbarao Kambhampati
2014 J jnl
Artif. Intell.
Hankz Hankui Zhuo, Qiang Yang
2014 J jnl
Artif. Intell.
Hankz Hankui Zhuo, Héctor Muñoz-Avila, Qiang Yang
2013 A* conf
IJCAI
Hankz Hankui Zhuo, Subbarao Kambhampati
2013 conf
ADMA (2)
Yueyun Jin, Weilin Zeng, Hankz Hankui Zhuo, Lei Li
2013 conf
HCOMP (Works in Progress / Demos)
Kartik Talamadupula, Subbarao Kambhampati, Yuheng Hu, Tuan Anh Nguyen, Hankz Hankui Zhuo
2013 A* conf
AAAI
Hankz Hankui Zhuo, Tuan Anh Nguyen, Subbarao Kambhampati
2013 A* conf
IJCAI
Hankz Hankui Zhuo, Tuan Anh Nguyen, Subbarao Kambhampati
2012 conf
NIPS
Hankz Hankui Zhuo, Qiang Yang, Subbarao Kambhampati
2012 J jnl
CoRR
Hankz Hankui Zhuo, Subbarao Kambhampati, Tuan Anh Nguyen
2011 A* conf
ICAPS
Hankz Hankui Zhuo, Qiang Yang, Rong Pan, Lei Li
2011 A conf
AAMAS
Hankz Hankui Zhuo, Hector Muñoz-Avila, Qiang Yang
2011 C conf
SEKE
Jie Gao, Hankz Hankui Zhuo, Daojun Han, Lei Li
2011 A* conf
IJCAI
Hankz Hankui Zhuo, Lei Li
2011 J jnl
AI Mag.
Qiang Yang, Vincent Wenchen Zheng, Bin Li, Hankz Hankui Zhuo
2010 J jnl
Artif. Intell.
Hankz Hankui Zhuo, Qiang Yang, Derek Hao Hu, Lei Li
2009 A* conf
IJCAI
Hankz Hankui Zhuo, Derek Hao Hu, Chad Hogg, Qiang Yang, Hector Muñoz-Avila
redb/extractors/decompiler/apk/smali_parser.py
← Index redb/extractors/decompiler/apk/smali_parser.py python
"""Smali file parser — extracts individual method bodies from apktool output.

Parses .smali files produced by apktool and extracts per-method bodies,
instruction counts, and register counts.
"""

import os
import re
from dataclasses import dataclass, field
from typing import Dict, List, Optional


@dataclass
class SmaliMethod:
    """Parsed smali method data."""
    class_name: str
    method_name: str
    method_signature: str
    body: str
    instruction_count: int = 0
    register_count: int = 0
    access_flags: List[str] = field(default_factory=list)


# Directives start with '.' — these are metadata, not instructions
_DIRECTIVE_RE = re.compile(r"^\s*\.")
# Labels start with ':'
_LABEL_RE = re.compile(r"^\s*:")
# Blank or comment lines
_BLANK_OR_COMMENT_RE = re.compile(r"^\s*(#.*)?$")
# Method declaration
_METHOD_START_RE = re.compile(
    r"^\.method\s+(.*?)\s+(\S+)\(([^)]*)\)(\S+)\s*$"
)
_METHOD_START_SIMPLE_RE = re.compile(
    r"^\.method\s+(.*)"
)
# .registers or .locals directive
_REGISTERS_RE = re.compile(r"^\s*\.registers\s+(\d+)")
_LOCALS_RE = re.compile(r"^\s*\.locals\s+(\d+)")
# .line directive
_LINE_RE = re.compile(r"^\s*\.line\s+\d+")


class SmaliParser:
    """Parser for apktool smali output files."""

    @staticmethod
    def parse_smali_file(filepath: str) -> List[SmaliMethod]:
        """Parse a single .smali file and return list of methods.

        Each .smali file contains one class with all its methods.
        """
        with open(filepath, "r", encoding="utf-8", errors="replace") as f:
            content = f.read()

        return SmaliParser._parse_smali_content(content, filepath)

    @staticmethod
    def _parse_smali_content(content: str, source: str = "") -> List[SmaliMethod]:
        """Parse smali text content and extract methods."""
        lines = content.split("\n")
        methods = []

        # Extract class name from .class directive
        class_name = ""
        for line in lines:
            if line.startswith(".class "):
                parts = line.split()
                class_name = parts[-1]  # Last token is the class descriptor
                break

        in_method = False
        method_lines = []
        method_header = ""
        access_flags = []
        skip_method = False

        for line in lines:
            if line.startswith(".method "):
                in_method = True
                method_lines = []
                method_header = line
                skip_method = False

                # Parse access flags and method signature
                remainder = line[len(".method "):].strip()
                tokens = remainder.split()
                access_flags = []
                method_sig_token = tokens[-1] if tokens else ""

                for t in tokens[:-1]:
                    access_flags.append(t)

                # Skip abstract and native methods (no body)
                if "abstract" in access_flags or "native" in access_flags:
                    skip_method = True

            elif line.startswith(".end method"):
                if in_method and not skip_method:
                    body = "\n".join(method_lines)
                    method_name, signature = SmaliParser._parse_method_sig(
                        method_header
                    )
                    instruction_count = SmaliParser.count_instructions(body)
                    register_count = SmaliParser._extract_register_count(body)

                    methods.append(
                        SmaliMethod(
                            class_name=class_name,
                            method_name=method_name,
                            method_signature=signature,
                            body=body,
                            instruction_count=instruction_count,
                            register_count=register_count,
                            access_flags=access_flags,
                        )
                    )
                in_method = False
                method_lines = []
                access_flags = []

            elif in_method and not skip_method:
                method_lines.append(line)

        return methods

    @staticmethod
    def parse_smali_directory(dirpath: str) -> Dict[str, SmaliMethod]:
        """Parse all .smali files in a directory tree.

        Returns dict keyed by 'ClassName->methodName(signature)ReturnType'.
        """
        result = {}
        for root, _dirs, files in os.walk(dirpath):
            for fname in files:
                if fname.endswith(".smali"):
                    fpath = os.path.join(root, fname)
                    try:
                        methods = SmaliParser.parse_smali_file(fpath)
                        for m in methods:
                            key = SmaliParser.make_method_key(
                                m.class_name, m.method_name, m.method_signature
                            )
                            result[key] = m
                    except Exception:
                        continue
        return result

    @staticmethod
    def normalize_smali_body(body: str) -> str:
        """Normalize smali body for consistent hashing.

        Strips comments, .line directives, normalizes whitespace.
        """
        lines = []
        for line in body.split("\n"):
            stripped = line.strip()
            # Skip empty lines, comments, and .line directives
            if not stripped or stripped.startswith("#"):
                continue
            if _LINE_RE.match(stripped):
                continue
            lines.append(stripped)
        return "\n".join(lines)

    @staticmethod
    def count_instructions(body: str) -> int:
        """Count actual Dalvik instructions (skip directives, labels, blanks)."""
        count = 0
        for line in body.split("\n"):
            stripped = line.strip()
            if not stripped:
                continue
            if _DIRECTIVE_RE.match(stripped):
                continue
            if _LABEL_RE.match(stripped):
                continue
            if _BLANK_OR_COMMENT_RE.match(stripped):
                continue
            count += 1
        return count

    @staticmethod
    def _extract_register_count(body: str) -> int:
        """Extract register count from .registers or .locals directive.

        apktool outputs .locals (local registers only) by default.
        .registers (total = locals + params) is used with --use-registers.
        We return whichever is present.
        """
        for line in body.split("\n"):
            stripped = line.strip()
            m = _REGISTERS_RE.match(stripped)
            if m:
                return int(m.group(1))
            m = _LOCALS_RE.match(stripped)
            if m:
                return int(m.group(1))
        return 0

    @staticmethod
    def _parse_method_sig(header_line: str) -> tuple:
        """Parse method name and signature from .method header line.

        Input: '.method public onCreate(Landroid/os/Bundle;)V'
        Returns: ('onCreate', '(Landroid/os/Bundle;)V')
        """
        remainder = header_line[len(".method "):].strip()
        tokens = remainder.split()
        if not tokens:
            return ("unknown", "()")

        # Last token contains methodName(params)returnType
        method_part = tokens[-1]

        paren_idx = method_part.find("(")
        if paren_idx == -1:
            return (method_part, "()")

        method_name = method_part[:paren_idx]
        signature = method_part[paren_idx:]

        return (method_name, signature)

    @staticmethod
    def make_method_key(class_name: str, method_name: str, signature: str) -> str:
        """Build a canonical method key for cross-tool matching.

        Format: 'Lcom/example/Foo;->methodName(params)ReturnType'
        """
        return f"{class_name}->{method_name}{signature}"