Mang I Vai

100 papers B 3C 3Misc 3Journal 56Unranked 35
YearRankTypeTitle / Venue / Authors
2026 J jnl
Microelectron. J.
Chenglong Zhu, Haochuan Wang, Chenkai Peng, Hengzhi Hong, Yu Xia, Yuhua Cheng, Mang I Vai, Sio Hang Pun, Guodong Su, Hui Hong
2026 J jnl
Biomed. Signal Process. Control.
Qingqing Yang, Alan Luiz Eckeli, Nian Xiong, M. Sabarimalai Manikandan, Hung-Chun Li, Mikhail Poluektov, Yuan Zhang, Mang I Vai
2026 J jnl
IEEE Trans. Affect. Comput.
Jie Wei, Hongyin Zhang, Thomas Penzel, Haitang Qiu, Yuan Zhang, Mang I Vai
2026 J jnl
Comput. Biol. Medicine
Yan Cheng, Tianju Li, Zhichao Zhang, Zhiyi Huang, Zhen Mei, Mang I Vai
2026 J jnl
IEEE Trans. Biomed. Eng.
Xielan Tang, Bin Zhang, Yamei Li, Ming Guan, Nian Xiong, Hung-Chun Li, Mikhail Poluektov, Xuesheng Ma, Yuan Zhang, Mang I Vai
2026 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Jia Wen Li, Wei Bin Lin, Chen Ling, Shuang Zhang, Xiang Lei Hu, Xiu Ying Hu, Mang I Vai, Jujian Lv, Xin Liu, Rong Jun Chen
2026 J jnl
IEEE Trans Autom. Sci. Eng.
Dongming Li, Anguo Zhang, Yueming Gao, Mang I Vai, Sio-Hang Pun, Chaoxu Mu
2025 J jnl
IEEE Trans. Instrum. Meas.
Dongming Li, Jiamei Wang, Han Wang, Xiaojiang Huang, Jiejie Yang, Yueming Gao, Hung-Chun Li, Mang I Vai, Sio-Hang Pun
2025 J jnl
Entropy
Guanyuan Feng, Jiawen Li, Yicheng Zhong, Shuang Zhang, Xin Liu, Mang I Vai, Kaihan Lin, Xianxian Zeng, Jun Yuan, Rongjun Chen
2025 J jnl
Entropy
Jiawen Li, Guanyuan Feng, Chen Ling, Ximing Ren, Shuang Zhang, Xin Liu, Leijun Wang, Mang I Vai, Jujian Lv, Rongjun Chen
2025 J jnl
IEEE Trans. Biomed. Circuits Syst.
Han Wang, Dongming Li, Mang I Vai, Sio Hang Pun, Jiejie Yang, Hung Chun Li, Yueming Gao
2025 J jnl
IEEE Trans. Netw. Sci. Eng.
Zhijiong Wang, Anguo Zhang, Hung Chun Li, Yadong Yin, Wei Chen, Chan-Tong Lam, Peng Un Mak, Mang I Vai, Yueming Gao, Sio-Hang Pun
2025 J jnl
IEEE Trans. Instrum. Meas.
Dongming Li, Zhijiong Wang, Han Wang, Sio-Hang Pun, Peng Un Mak, Anguo Zhang, Yu Liu, Hung-Chun Li, Yueming Gao, Min Du, Mang I Vai
2025 C conf
ISCAS
Tianle Miao, Zhipeng Wu, Dejian Li, Yongxiang Lyu, Mang I Vai, Yu Liu
2025 J jnl
IEEE Trans. Instrum. Meas.
Kaiwen Tian, Han Wang, Zhipeng Wu, Yongxiang Lyu, Mang I Vai, Yu Liu
2025 J jnl
IEEE Access
Zhijiong Wang, Wei Lin, Yu Chen, Mang I Vai
2024 conf
ACAI
Tianyu Huang, Zhijiong Wang, Guannan Hu, Sio Hang Pun, Hung Chun Li, Mang I Vai
2024 conf
CIVEMSA
Shuang Yang, Ziliang Wei, Lina Chen, Hanyue Liu, Siohang Pun, Mang I Vai, Yueming Gao
2024 J jnl
IEEE Trans. Biomed. Circuits Syst.
Ziliang Wei, Han Wang, Dongming Li, Mang I Vai, Sio-Hang Pun, Jiejie Yang, Min Du, Yueming Gao
2024 J jnl
Clust. Comput.
Ali Siddique, Mang I Vai, Sio-Hang Pun
2024 J jnl
Biomed. Signal Process. Control.
Xudong Yang, Hongli Yan, Anguo Zhang, Pan Xu, Sio Hang Pan, Mang I Vai, Yueming Gao
2023 J jnl
IEEE Trans. Cogn. Dev. Syst.
Jia Wen Li, Shovan Barma, Sio-Hang Pun, Mang I Vai, Peng Un Mak
2022 J jnl
IEEE Access
Yadong Yin, Yitao Huang, Zhizhang Chen, Sio-Hang Pun, Yipeng Liao, Yueming Gao, Mang I Vai
2022 conf
MMBD
Xiaohe Tian, Mang I Vai
2022 J jnl
Sensors
Yiming Liu, Yueming Gao, Liting Chen, Tao Liu, Jiejie Yang, Siohang Pun, Mang I Vai, Min Du
2022 J jnl
IEEE Access
Ning Yang, De-Feng Liu, Tao Liu, Tianyuan Han, Pingyue Zhang, Xuenan Xu, Siyu Lou, Huan-Guang Liu, Anchao Yang, Cheng Dong, Mang I Vai, Sio-Hang Pun, Jian-Guo Zhang
2022 J jnl
IEEE J. Biomed. Health Informatics
Jia Wen Li, Shovan Barma, Peng Un Mak, Fei Chen, Cheng Li, Ming Tao Li, Mang I Vai, Sio-Hang Pun
2022 J jnl
IEEE Access
Jiujiang Wang, Sio-Hang Pun, Yuanyu Yu, Yihe Liu, Ching-Hsiang Cheng, Kin Fong Lei, Shuang Zhang, Peng Un Mak, Mang I Vai
2021 J jnl
Sensors
Weihao Lin, Shengjie Zhou, Li-Yang Shao, Mang I Vai, Perry Ping Shum, Weijie Xu, Fang Zhao, Feihong Yu, Yibin Liu, Yuhui Liu, Shuaiqi Liu
2021 J jnl
Sensors
Ziliang Wei, Yangrong Wen, Yueming Gao, Mingjing Yang, Jiejie Yang, Sio-Hang Pun, Mang I Vai, Min Du
2021 conf
APCCAS
Liyang Wang, Siohang Pun, Peng Un Mak, Achim Klug, Bai-Jun Zhang, Mang I Vai, Tim C. Lei
2021 conf
EMBC
Ben-Zheng Li, Sio-Hang Pun, Mang I Vai, Achim Klug, Tim C. Lei
2021 conf
CIVEMSA
Jia Wen Li, Shovan Barma, Siohang Pun, Mang I Vai, Feng Wan, Wai Sun Liu, Peng Un Mak
2021 conf
EMBC
Jia Wen Li, Shovan Barma, Sio-Hang Pun, Fei Chen, Cheng Li, Ming Tao Li, Pan Ke Wang, Mang I Vai, Peng Un Mak
2021 J jnl
IEEE Access
Weihao Lin, Shengjie Zhou, Li-Yang Shao, Mang I Vai, Perry Ping Shum, Fang Zhao, Shuaiqi Liu, Jie Hu, Yuhui Liu
2020 J jnl
IEEE Access
Yadong Yin, Kamal El-Sankary, Zhizhang Chen, Yueming Gao, Mang I Vai, Sio-Hang Pun
2020 J jnl
Sensors
Ruixin Jiang, Huihuang Wu, Jianpeng Yang, Haiyan Jiang, Min Du, Mang I Vai, Siohang Pun, Yueming Gao
2020 J jnl
IEEE Access
Weikun Chen, Ziliang Wei, Yueming Gao, Zeljka Lucev Vasic, Mario Cifrek, Mang I Vai, Min Du, Sio-Hang Pun
2019 conf
CIVEMSA
Yi Zhan, Mang I Vai, Shovan Barma, Sio-Hang Pun, Jia Wen Li, Peng Un Mak
2019 conf
NER
Ben-Zheng Li, Sio-Hang Pun, Feng Wan, Mang I Vai, Achim Klug, Tim C. Lei
2019 J jnl
J. Sensors
Xin Liu, Yuanyu Yu, Jiujiang Wang, Sio-Hang Pun, Mang I Vai, Peng Un Mak
2019 J jnl
IEEE Access
Jia Wen Li, Shovan Barma, Peng Un Mak, Sio-Hang Pun, Mang I Vai
2019 conf
CIVEMSA
Yifan Li, Chi Man Wong, Yudian Zheng, Feng Wan, Peng Un Mak, Siohang Pun, Mang I Vai
2019 J jnl
IEEE Access
Shuang Zhang, Sio-Hang Pun, Peng Un Mak, Yu-ping Qin, Yi He Liu, Yueming Gao, Mang I Vai
2019 J jnl
IEICE Electron. Express
Yuanyu Yu, Jiujiang Wang, Sio-Hang Pun, Ching-Hsiang Cheng, Kin Fong Lei, Mang I Vai, Shuang Zhang, Peng Un Mak
2019 J jnl
IEEE Access
Yufan Peng, Chi Man Wong, Ze Wang, Feng Wan, Mang I Vai, Peng Un Mak, Yong Hu, Agostinho C. Rosa
2018 J jnl
Wirel. Commun. Mob. Comput.
Shi Lin, Yue-ming Gao, Juan Cai, Zeljka Lucev Vasic, Mang I Vai, Min Du, Mario Cifrek, Sio-Hang Pun
2018 conf
EMBC
Zhimin Chen, Mang I Vai, Sio-Hang Pun, Peng Un Mak
2017 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Chio-In Ieong, Mingzhong Li, Man-Kay Law, Pui-In Mak, Mang I Vai, Rui Paulo Martins
2017 J jnl
IEEE Trans. Biomed. Eng.
Chang-Hao Chen, Elizabeth A. McCullagh, Sio-Hang Pun, Peng Un Mak, Mang I Vai, Pui-In Mak, Achim Klug, Tim C. Lei
2017 J jnl
Wirel. Commun. Mob. Comput.
Shi Lin, Yue-ming Gao, Juan Cai, Zeljka Lucev Vasic, Mang I Vai, Min Du, Mario Cifrek, Sio-Hang Pun
2017 J jnl
IEEE Trans. Instrum. Meas.
Xi Mei Chen, Shovan Barma, Sio-Hang Pun, Mang I Vai, Peng Un Mak
2016 J jnl
Sensors
Yue-ming Gao, Zhumei Wu, Sio-Hang Pun, Peng Un Mak, Mang I Vai, Min Du
2016 J jnl
EURASIP J. Wirel. Commun. Netw.
Yue-ming Gao, Yan-Ting Ye, Mang I Vai, Min Du, Sio-Hang Pun
2016 J jnl
Sensors
Yue-ming Gao, Jianchong Wei, Peng Un Mak, Mang I Vai, Min Du, Sio-Hang Pun
2016 conf
MIPRO
Wenshu Ni, Yueming Gao, Zeljka Lucev, Sio-Hang Pun, Mario Cifrek, Mang I Vai, Min Du
2016 conf
MIPRO
Yueming Gao, Chuanyang Lin, Siohang Pun, Mang I Vai, Min Du
2016 conf
ASP-DAC
Mingzhong Li, Chio-In Ieong, Man-Kay Law, Pui-In Mak, Mang I Vai, Sio-Hang Pun, Rui Paulo Martins
2016 conf
ASP-DAC
Chio-In Ieong, Pui-In Mak, Mang I Vai, Rui Paulo Martins
2015 conf
EMBC
Limin Yang, Wenya Nan, Xiaoting Qu, Feng Wan, Pui-In Mak, Peng Un Mak, Mang I Vai, Yong Hu, Agostinho C. Rosa
2015 conf
AuCC
Wai Kei Tou, Mang I Vai, Sek Un Cheang
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Mingzhong Li, Chio-In Ieong, Man-Kay Law, Pui-In Mak, Mang I Vai, Sio-Hang Pun, Rui Paulo Martins
2014 J jnl
J. Comput.
Shuang Zhang, Yu-ping Qin, Jiangming Kuang, Peng Un Mak, Sio-Hang Pun, Mang I Vai, Yihe Liu
2014 B conf
SMC
Ze Wang, Chiman Wong, Janir Nuno da Cruz, Feng Wan, Pui-In Mak, Peng Un Mak, Mang I Vai
2014 J jnl
Comput. Biol. Medicine
Derek F. Wong, Lidia S. Chao, Xiaodong Zeng, Mang I Vai, Heng-Leong Lam
2013 J jnl
IEEE Trans. Biomed. Circuits Syst.
Tan-Tan Zhang, Pui-In Mak, Mang I Vai, Peng Un Mak, Man-Kay Law, Sio-Hang Pun, Feng Wan, Rui Paulo Martins
2013 conf
EMBC
Jia Wen Li, Xi Mei Chen, Sio-Hang Pun, Peng Un Mak, Yueming Gao, Mang I Vai, Min Du
2013 conf
ISNN (2)
Ka Fai Lao, Chiman Wong, Feng Wan, Pui-In Mak, Peng Un Mak, Mang I Vai
2013 conf
ICAIT
Xi Mei Chen, Peng Un Mak, Sio-Hang Pun, Yue-ming Gao, Chan-Tong Lam, Ze Tian Wang, Jia Wen Li, Meng Wang, Mang I Vai, Min Du
2013 J jnl
IEEE Trans. Biomed. Eng.
Greta S. P. Mok, Tao Sun, Tzung-Chi Huang, Mang I Vai
2013 conf
EMBC
Mingzhong Li, Chio-In Ieong, Man-Kay Law, Pui-In Mak, Mang I Vai, Rui Paulo Martins
2012 J jnl
IEEE Trans. Biomed. Circuits Syst.
Chio-In Ieong, Pui-In Mak, Chi-Pang Lam, Cheng Dong, Mang I Vai, Peng Un Mak, Sio-Hang Pun, Feng Wan, Rui Paulo Martins
2012 conf
EMBC
Teng Cao, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai, Yong Hu
2012 J jnl
IEEE Trans. Affect. Comput.
Sio-Hang Pun, Yue-ming Gao, Peng Un Mak, Hio Ho, Kin Weng Che, Hang Kin Ieong, Huok Wu, Mang I Vai, Min Du
2012 conf
VECIMS
Yue Liu, Xiao Jiang, Teng Cao, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai
2012 conf
BMEI
Yueming Gao, Renjun Ma, Siohang Pun, Peng Un Mak, Mang I Vai
2012 conf
VECIMS
Wenya Nan, Lanshin Chang, João P. Rodrigues, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai, Agostinho C. Rosa
2012 conf
Brain Informatics
Chin Ian Lou, Daria Migotina, João P. Rodrigues, João D. Semedo, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai, Fernando Melicio, J. Gomes Pereira, Agostinho C. Rosa
2012 conf
TSP
U. Kin Che, Chi Kin Lao, Sio-Hang Pun, Peng Un Mak, Feng Wan, Mang I Vai
2012 conf
EMBC
Xi Mei Chen, Peng Un Mak, Sio-Hang Pun, Yueming Gao, Mang I Vai, Min Du
2012 J jnl
Sensors
Xi Mei Chen, Peng Un Mak, Sio-Hang Pun, Yueming Gao, Chan-Tong Lam, Mang I Vai, Min Du
2012 conf
BHI
Xi Mei Chen, Siohang Pun, Yueming Gao, Peng Un Mak, Mang I Vai, Min Du
2012 J jnl
Comput. Electr. Eng.
Boyu Wang, Chiman Wong, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai
2012 conf
ICIC (1)
Chong Yin Fok, Mang I Vai
2011 B conf
IJCNN
Chiman Wong, Boyu Wang, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai
2011 conf
BODYNETS
Jingwu He, Yueming Gao, Siohang Pun, Peng Un Mak, Mang I Vai
2011 conf
EMBC
Tan-Tan Zhang, Pui-In Mak, Mang I Vai, Peng Un Mak, Feng Wan, Rui Paulo Martins
2011 Misc conf
ICMLC
Sam Chao, Fai Wong, Heng-Leong Lam, Mang I Vai
2011 B conf
IJCNN
Boyu Wang, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai
2011 conf
BODYNETS
Xi Mei Chen, Peng Un Mak, Mang I Vai
2011 J jnl
IEEE Trans. Inf. Technol. Biomed.
Sio-Hang Pun, Yue-ming Gao, Peng Un Mak, Mang I Vai, Min Du
2011 C conf
ICICS
Xi Mei Chen, Sio-Hang Pun, Ze Tian Wang, Peng Un Mak, Mang I Vai
2011 conf
PAKDD Workshops
Boyu Wang, Feng Wan, Peng Un Mak, Pui-In Mak, Mang I Vai
2010 J jnl
Biomed. Signal Process. Control.
Bing Nan Li, Ming-Chui Dong, Mang I Vai
2009 C conf
ISCAS
Chon-Teng Ma, Pui-In Mak, Mang I Vai, Peng Un Mak, Sio-Hang Pun, Feng Wan, Rui Paulo Martins
2005 J jnl
Expert Syst. Appl.
Bing Nan Li, Ming-Chui Dong, Mang I Vai, Peng Un Mak
2004 conf
ICBA
Jianke Zhu, Mang I Vai, Peng Un Mak
2004 J jnl
IEEE Trans. Biomed. Eng.
Mang I Vai, Li-Gao Zhou
2004 Misc conf
ICIG
Jianke Zhu, Mang I Vai, Peng Un Mak
2004 Misc conf
WSC
Bing Nan Li, Ming-Chui Dong, Mang I Vai
redb/extractors/decompiler/apk/method_extractor.py
← Index redb/extractors/decompiler/apk/method_extractor.py python
"""Per-method content extraction, hashing, and similarity computation.

Handles SHA-256 content hashing, ssdeep/TLSH fuzzy hashing, MinHash
computation, and obfuscation indicator detection for APK methods.
"""

import hashlib
import re
from typing import Dict, List, Optional

from redb.extractors.decompiler.apk.smali_normalization import (
    categorize_opcode,
    normalize_method_body,
)
from redb.extractors.decompiler.apk.smali_parser import SmaliParser


# ---------------------------------------------------------------------------
# Smali Prime Product — semantic primes matching Binary Ninja's LLIL primes
# ---------------------------------------------------------------------------
# Each Dalvik semantic category maps to the same prime its LLIL counterpart
# uses in cfg_features.py. This makes prime products semantically comparable
# for APK-vs-APK similarity (not numerically comparable to Binja values).

SMALI_OP_PRIMES = {
    "ALU": 37,       # ADD/SUB → same prime as LLIL_ADD
    "CONV": 131,     # Type conversions → same as LLIL_SX
    "CMP": 103,      # Comparisons → same as LLIL_CMP_E
    "MOV": 2,        # Register moves → same as LLIL_SET_REG
    "CONST": 2,      # Constants → SET_REG equivalent
    "LOAD": 5,       # Field/array reads → same as LLIL_LOAD
    "STORE": 7,      # Field/array writes → same as LLIL_STORE
    "CALL": 17,      # invoke-* → same as LLIL_CALL
    "BRANCH": 29,    # if-* → same as LLIL_IF
    "JMP": 31,       # goto → same as LLIL_GOTO
    "SWITCH": 151,   # switch → same as LLIL_JUMP_TO
    "RET": 23,       # return → same as LLIL_RET
    "ALLOC": 5,      # new-instance/new-array → LOAD-adjacent (heap access)
    "TYPE": 1,       # check-cast/instance-of → identity (metadata)
    "ARR": 5,        # array-length/fill-array → LOAD-adjacent
    "EXC": 23,       # throw → RET-adjacent (control transfer out)
    "SYNC": 1,       # monitor → identity (no LLIL equivalent)
    "OTHER": 1,      # Unknown → identity
}


def compute_prime_product_smali(smali_body: str) -> int:
    """Multiplicative hash of normalized Dalvik opcodes. Mod 2^64.

    Same algorithm as cfg_features.compute_prime_product but using
    Dalvik semantic categories instead of LLIL operation enums.
    """
    if not smali_body:
        return 0

    product = 1
    for line in smali_body.splitlines():
        stripped = line.strip()
        if not stripped or stripped.startswith((".", ":", "#")):
            continue
        opcode = stripped.split()[0].split("/")[0] if stripped else ""
        category = categorize_opcode(opcode)
        prime = SMALI_OP_PRIMES.get(category, 1)
        product = (product * prime) % (2**64)

    return product


def count_call_instructions(smali_body: str) -> int:
    """Count invoke-* instructions in a smali method body."""
    if not smali_body:
        return 0
    count = 0
    for line in smali_body.splitlines():
        stripped = line.strip()
        if stripped.startswith("invoke-"):
            count += 1
    return count


def compute_sha256(content: str) -> str:
    """Compute SHA-256 hash of normalized content."""
    return hashlib.sha256(content.encode("utf-8")).hexdigest()


def compute_ssdeep(content: str) -> Optional[str]:
    """Compute ssdeep fuzzy hash of content."""
    try:
        import ppdeep
        data = content.encode("utf-8")
        if len(data) < 50:
            return None
        result = ppdeep.hash(data)
        return result if result else None
    except (ImportError, Exception):
        return None


def compute_tlsh(content: str) -> Optional[str]:
    """Compute TLSH fuzzy hash of content."""
    try:
        import tlsh
        data = content.encode("utf-8")
        if len(data) < 50:
            return None
        result = tlsh.hash(data)
        return result if result else None
    except (ImportError, Exception):
        return None


def compute_minhash(
    content: str,
    n: int = 3,
    normalization_level: str = "opcode_api",
) -> Optional[List[int]]:
    """Compute MinHash signature from semantically normalized smali n-grams.

    Applies semantic normalization (analogous to Binary Ninja's LLIL) before
    computing the MinHash. This strips register allocation noise and
    instruction encoding variants while preserving operation semantics and
    API references.

    Uses the same algorithm and parameters as the Binary Ninja MinHasher
    (64 seeds from master seed 0xdeadbeef, 8-bit signature elements, mmh3)
    to ensure cross-platform similarity comparisons are compatible.

    Args:
        content: Raw smali method body.
        n: N-gram size (default 3).
        normalization_level: Normalization level for instructions.
            'opcode_api' (default) preserves API call/field references.
            'category' uses only semantic categories.
            'opcode' uses base opcodes without operands.
    """
    try:
        import mmh3
    except ImportError:
        return None

    HASH_MAX = 0xFFFFFFFF
    SIGNATURE_LENGTH = 64
    SIGNATURE_BITS = 8

    # Semantically normalize instructions (like LLIL for native code)
    lines = normalize_method_body(content, level=normalization_level)

    if len(lines) < n:
        return None

    # Build n-grams (tuples of normalized instruction strings)
    shingles = [tuple(lines[i:i + n]) for i in range(len(lines) - n + 1)]

    if not shingles:
        return None

    # Generate deterministic seeds matching the Binary Ninja pipeline
    import random
    rng = random.Random(0xDEADBEEF)
    seeds = [rng.randint(0, HASH_MAX) for _ in range(SIGNATURE_LENGTH)]

    # For each seed, hash all shingles and take the minimum
    signature = []
    for seed in seeds:
        min_val = HASH_MAX
        for shingle in shingles:
            text = "|".join(str(elem) for elem in shingle)
            h = mmh3.hash(text, seed) & HASH_MAX
            if h < min_val:
                min_val = h
        # Truncate to signature bits
        if SIGNATURE_BITS < 32:
            min_val %= (2 ** SIGNATURE_BITS)
        signature.append(min_val)

    return signature


def detect_obfuscation_indicators(
    method_name: str,
    class_name: str,
    smali_body: str,
    instruction_count: int,
) -> Dict[str, bool]:
    """Compute obfuscation indicators for a method.

    Returns dict with boolean indicators.
    """
    indicators = {}

    # Short method name (typical R8/ProGuard output)
    indicators["short_method_name"] = len(method_name) <= 2

    # Short class name — extract simple name from Dalvik descriptor
    simple_class = class_name
    if "/" in simple_class:
        simple_class = simple_class.rsplit("/", 1)[-1]
    simple_class = simple_class.rstrip(";")
    indicators["short_class_name"] = len(simple_class) <= 2

    # String encryption: const-string followed by decryption-pattern call
    indicators["has_string_encryption"] = _detect_string_encryption(smali_body)

    # Reflection calls
    indicators["has_reflection_calls"] = _detect_reflection_calls(smali_body)

    # Excessive goto count (control flow flattening)
    goto_count = _count_goto_instructions(smali_body)
    threshold = max(5, int(instruction_count * 0.15))
    indicators["excessive_goto_count"] = goto_count > threshold

    return indicators


def _detect_string_encryption(smali_body: str) -> bool:
    """Detect const-string followed by decryption-pattern calls."""
    lines = smali_body.split("\n")
    for i, line in enumerate(lines):
        stripped = line.strip()
        if stripped.startswith("const-string"):
            # Check the next 3 lines for invoke-* to potential decryption
            for j in range(i + 1, min(i + 4, len(lines))):
                next_line = lines[j].strip()
                if next_line.startswith("invoke-"):
                    # Common decryption patterns
                    if any(
                        pat in next_line
                        for pat in [
                            "decrypt",
                            "decode",
                            "Cipher",
                            "DES",
                            "AES",
                            "Base64",
                            "getBytes",
                        ]
                    ):
                        return True
    return False


def _detect_reflection_calls(smali_body: str) -> bool:
    """Detect use of Java reflection APIs."""
    reflection_patterns = [
        "Ljava/lang/reflect/",
        "Ljava/lang/Class;->forName",
        "Ljava/lang/Class;->getMethod",
        "Ljava/lang/Class;->getDeclaredMethod",
        "Ljava/lang/Class;->getField",
        "Ljava/lang/Class;->getDeclaredField",
    ]
    for pattern in reflection_patterns:
        if pattern in smali_body:
            return True
    return False


def _count_goto_instructions(smali_body: str) -> int:
    """Count goto/goto_16/goto_32 instructions."""
    count = 0
    for line in smali_body.split("\n"):
        stripped = line.strip()
        if stripped.startswith(("goto ", "goto/16 ", "goto/32 ")):
            count += 1
        elif stripped in ("goto", "goto/16", "goto/32"):
            count += 1
    return count


def dalvik_to_java_class(descriptor: str) -> str:
    """Convert Dalvik class descriptor to Java dot notation.

    Lcom/example/Foo; -> com.example.Foo
    """
    if descriptor.startswith("L") and descriptor.endswith(";"):
        return descriptor[1:-1].replace("/", ".")
    return descriptor.replace("/", ".")


def dalvik_type_to_java(type_desc: str) -> str:
    """Convert a Dalvik type descriptor to Java type name."""
    type_map = {
        "V": "void",
        "Z": "boolean",
        "B": "byte",
        "S": "short",
        "C": "char",
        "I": "int",
        "J": "long",
        "F": "float",
        "D": "double",
    }

    if not type_desc:
        return "void"

    if type_desc in type_map:
        return type_map[type_desc]

    if type_desc.startswith("["):
        return dalvik_type_to_java(type_desc[1:]) + "[]"

    if type_desc.startswith("L") and type_desc.endswith(";"):
        full = type_desc[1:-1].replace("/", ".")
        # Return simple name
        return full.rsplit(".", 1)[-1] if "." in full else full

    return type_desc


def dalvik_to_java_prototype(
    method_name: str, signature: str, class_name: str = ""
) -> str:
    """Convert Dalvik method signature to Java-style prototype.

    Input: method_name='onCreate', signature='(Landroid/os/Bundle;)V'
    Output: 'void onCreate(Bundle)'
    """
    # Parse return type and param types from signature
    if not signature or not signature.startswith("("):
        return f"void {method_name}()"

    close_paren = signature.find(")")
    if close_paren == -1:
        return f"void {method_name}()"

    params_str = signature[1:close_paren]
    return_type_str = signature[close_paren + 1:]

    return_type = dalvik_type_to_java(return_type_str)
    params = _parse_dalvik_params(params_str)
    param_java = ", ".join(dalvik_type_to_java(p) for p in params)

    return f"{return_type} {method_name}({param_java})"


def _parse_dalvik_params(params_str: str) -> List[str]:
    """Parse Dalvik parameter descriptor string into individual types."""
    params = []
    i = 0
    while i < len(params_str):
        ch = params_str[i]
        if ch in "VZBSCIJFD":
            params.append(ch)
            i += 1
        elif ch == "[":
            # Array — find the base type
            array_prefix = "["
            i += 1
            while i < len(params_str) and params_str[i] == "[":
                array_prefix += "["
                i += 1
            if i < len(params_str):
                if params_str[i] == "L":
                    end = params_str.find(";", i)
                    if end != -1:
                        params.append(array_prefix + params_str[i : end + 1])
                        i = end + 1
                    else:
                        break
                else:
                    params.append(array_prefix + params_str[i])
                    i += 1
        elif ch == "L":
            end = params_str.find(";", i)
            if end != -1:
                params.append(params_str[i : end + 1])
                i = end + 1
            else:
                break
        else:
            i += 1
    return params