Weihao Yan

15 papers Journal 13Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Commun.
Weihao Yan, Jianping An, Yangbo Feng, Shuai Wang, Xuanhe Yang, Gaofeng Pan
2025 J jnl
IEEE Internet Things J.
Peng Yin, Yiwei Liu, Linye Wang, Yizheng Ge, Weihao Yan, Jihua Lu, Lihui Feng, Yufan Du
2025 J jnl
Mach. Learn. Knowl. Extr.
Qi Wang, Weihao Yan, Yanlong Li, Yizheng Ge, Yiwei Liu, Peng Yin, Shuai Tan
2025 J jnl
J. Comb. Theory, Ser. A
Salvatore Tringali, Weihao Yan
2025 J jnl
CoRR
Weihao Yan, Christoph Brune, Mengwu Guo
2025 J jnl
Adv. Model. Simul. Eng. Sci.
Dongwei Ye, Weihao Yan, Christoph Brune, Mengwu Guo
2025 J jnl
CoRR
Weihao Yan, Christoph Brune, Mengwu Guo
2025 J jnl
IEEE Access
Haonan Xue, Zhihai Zhuo, Weihao Yan, Yuexia Zhang
2024 J jnl
CoRR
Tao Li, Qinghua Tao, Weihao Yan, Zehao Lei, Yingwen Wu, Kun Fang, Mingzhen He, Xiaolin Huang
2024 J jnl
Trans. Mach. Learn. Res.
Tao Li, Qinghua Tao, Weihao Yan, Yingwen Wu, Zehao Lei, Kun Fang, Mingzhen He, Xiaolin Huang
2023 J jnl
IEEE Access
Min Huang, Weihao Yan, Wenhui Dai, Jingyang Wang
2023 J jnl
IEEE Internet Things J.
Weihao Yan, Jianping An, Jinpeng Song, Yixuan Li, Shuai Wang
2022 J jnl
CoRR
Tao Li, Weihao Yan, Zehao Lei, Yingwen Wu, Kun Fang, Ming Yang, Xiaolin Huang
2022 conf
WCSP
Yi Zhang, Weihao Yan, Tian Yuan, Ping Yan, Jinpeng Song, Xiangyuan Bu
2020 conf
ICMTEL
Xing-Hua Lu, Lingfang Zeng, Hao-han Huang, Weihao Yan
redb/extractors/decompiler/apk/library_filter.py
← Index redb/extractors/decompiler/apk/library_filter.py python
"""Package-based library filtering for APK DEX code analysis.

Determines whether a method belongs to a known library/framework package
and should be filtered out of content tables. This is the Android equivalent
of is_lib_or_thunk() in the Binary Ninja pipeline.
"""

import os
from typing import Dict, List


DEFAULT_LIBRARY_PREFIXES = [
    "android.",
    "androidx.",
    "com.google.android.",
    "com.google.firebase.",
    "com.google.gson.",
    "com.google.protobuf.",
    "kotlin.",
    "kotlinx.",
    "org.apache.",
    "com.squareup.",
    "io.reactivex.",
    "org.reactivestreams.",
    "com.facebook.",
    "com.crashlytics.",
    "io.fabric.",
    "org.junit.",
    "org.mockito.",
]


class LibraryFilter:
    """Filters library/framework classes from APK analysis."""

    def __init__(self, prefixes: List[str] = None):
        env_prefixes = os.getenv("APK_LIBRARY_PREFIXES")
        if env_prefixes:
            self._prefixes = [p.strip() for p in env_prefixes.split(",") if p.strip()]
        elif prefixes is not None:
            self._prefixes = prefixes
        else:
            self._prefixes = DEFAULT_LIBRARY_PREFIXES

        # Convert Dalvik-style prefixes to both formats for matching
        self._dot_prefixes = tuple(self._prefixes)

        self._stats = {"library": 0, "user": 0}

    def is_library(self, class_name: str) -> bool:
        """Check if a class belongs to a known library/framework package.

        Accepts both Java dot notation (com.example.Foo) and Dalvik
        descriptor notation (Lcom/example/Foo;).
        """
        # Normalize Dalvik descriptor to dot notation
        normalized = self._normalize_class_name(class_name)

        is_lib = normalized.startswith(self._dot_prefixes)
        if is_lib:
            self._stats["library"] += 1
        else:
            self._stats["user"] += 1
        return is_lib

    def get_filter_stats(self) -> Dict[str, int]:
        """Return counts of filtered vs. retained classes."""
        return dict(self._stats)

    @staticmethod
    def _normalize_class_name(class_name: str) -> str:
        """Convert Dalvik descriptor to dot notation.

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