Han Yu

16 papers A* 2Journal 8Unranked 6
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Han Yu, Xiaojuan Zhao, Aiping Li, Kai Chen, Ziniu Liu, Zhichao Peng
2025 J jnl
CoRR
Han Yu, Xiaojuan Zhao, Aiping Li, Kai Chen, Ziniu Liu, Zhichao Peng
2025 J jnl
World Wide Web (WWW)
Kai Chen, Han Yu, Xin Song, Ye Wang, Yongxue Shan, Aiping Li, Yinxuan Huang, Ziniu Liu
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Ziniu Liu, Han Yu, Kai Chen, Aiping Li
2025 J jnl
Expert Syst. Appl.
Kai Chen, Han Yu, Ye Wang, Xin Song, Xiaojuan Zhao, Yalong Xie, Liqun Gao, Aiping Li
2024 conf
ACL (1)
Kai Chen, Ye Wang, Yitong Li, Aiping Li, Han Yu, Xin Song
2024 J jnl
CoRR
Kai Chen, Ye Wang, Yitong Li, Aiping Li, Han Yu, Xin Song
2024 J jnl
World Wide Web (WWW)
Han Yu, Ziniu Liu, Hongkui Tu, Kai Chen, Aiping Li
2024 J jnl
Neurocomputing
Han Yu, Kai Chen, Ziniu Liu, Hongkui Tu, Aiping Li
2024 conf
DSC
Changjian Li, Kai Chen, Han Yu, Yinxuan Huang, Xuechen Zhao, Jianfeng Zhang, Aiping Li
2024 A* conf
IJCAI
Kai Chen, Ye Wang, Xin Song, Siwei Chen, Han Yu, Aiping Li
2020 J jnl
IEEE Access
Han Yu, Xiuqing Lu, Zhenkuan Pan
2020 conf
WISE (1)
Han Yu, Rong Jiang, Bin Zhou, Aiping Li
2020 conf
KSEM (2)
Han Yu, Rong Jiang, Aiping Li
2019 conf
DSC
Han Yu, Aiping Li, Rong Jiang, Yan Jia, Xiao-Juan Zhao, Weihong Han
2019 conf
ICCT
Han Yu, Aiping Li, Rong Jiang
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("/", ".")