Xiaojuan Lu

13 papers Journal 7Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Cryptol.
Meicheng Liu, Chengan Hou, Xiaojuan Lu, Shichang Wang, Dongdai Lin
2026 J jnl
IEEE Trans. Netw.
Jin Ye, Yijun Li, Wenliang Li, Xiaojuan Lu, Qichen Su, Jiawei Huang, Jianxin Wang
2025 conf
USENIX ATC
Zhaoyi Li, Jiawei Huang, Yijun Li, Jingling Liu, Junxue Zhang, Hui Li, Xiaojun Zhu, Shengwen Zhou, Jing Shao, Xiaojuan Lu, Qichen Su, Jianxin Wang, Chee Wei Tan, Yong Cui, Kai Chen
2025 J jnl
Comput. Networks
Xiaojuan Lu, Liying Chen, Kai Wang, Pingping Dong, Lianming Zhang
2025 J jnl
Int. J. Cogn. Informatics Nat. Intell.
Xiaojuan Lu
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Pingping Dong, Xiaojuan Lu, Tairan Huang, Liying Chen, Yang Yang, Lianming Zhang
2024 conf
NPC (1)
Pingping Dong, Liying Chen, Xiaojuan Lu, Xin Zhang, Lianming Zhang, Jiawei Huang, Guo Chen
2023 conf
ISPA/BDCloud/SocialCom/SustainCom
Pingping Dong, Xiaojuan Lu, Tairan Huang, Liying Chen, Yang Yang, Lianming Zhang
2022 J jnl
Cybersecur.
Xiaojuan Lu, Bohan Li, Meicheng Liu, Dongdai Lin
2022 conf
HPCC/DSS/SmartCity/DependSys
Pingping Dong, Cheng Nie, Yajing Li, Yuning Zuo, Xiaojuan Lu, Lianming Zhang
2021 conf
SecITC
Xiaojuan Lu, Bohan Li, Shichang Wang, Dongdai Lin
2021 conf
CRYPTO (3)
Meicheng Liu, Xiaojuan Lu, Dongdai Lin
2018 J jnl
Des. Codes Cryptogr.
Xiaojuan Lu, Xiaolei Niu, Haitao Cao
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("/", ".")