Xiaojin Zhu

22 papers Misc 1Journal 8Unranked 13
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Cybern.
Yuchen Qian, Zhonghua Miao, Jin Zhou, Xiaojin Zhu
2025 J jnl
Neurocomputing
Hongsheng Sha, Rongwei Guo, Jin Zhou, Xiaojin Zhu, Jinchen Ji, Zhonghua Miao
2023 J jnl
Syst. Control. Lett.
Jiaming Hu, Stephan Trenn, Xiaojin Zhu
2023 J jnl
J. Frankl. Inst.
Yuchen Qian, Zhonghua Miao, Jin Zhou, Xiaojin Zhu
2023 J jnl
J. Frankl. Inst.
Hongsheng Sha, Rongwei Guo, Jin Zhou, Xiaojin Zhu, Nan Li, Zhonghua Miao
2022 conf
EITCE
Jinhua Jiang, Xuan Chang, Zhiyuan Gao, Yiru Wang, Hesheng Zhang, Xiaojin Zhu
2022 J jnl
Trans. Inst. Meas. Control
Muyao Shao, Yiru Wang, Zhiyuan Gao, Xiaojin Zhu
2022 conf
ECC
Jiaming Hu, Stephan Trenn, Xiaojin Zhu
2022 conf
RICAI
Weichuan Xu, Jiming An, Zhiyuan Gao, Xiaojin Zhu
2022 conf
RICAI
Jiming An, Weichuan Xu, Zhiyuan Gao, Xiaojin Zhu
2020 J jnl
Trans. Inst. Meas. Control
Yubin Fang, Xiaojin Zhu, Jiaming Hu, Zhiyuan Gao, Hesheng Zhang
2020 J jnl
Trans. Inst. Meas. Control
Jiaming Hu, Xiaojin Zhu, Yubin Fang, Zhiyuan Gao, Yijia Zhou
2017 conf
LSMS/ICSEE (2)
Bing Bai, Xiaojin Zhu, Hesheng Zhang, Zhaoxun Zhang
2017 conf
LSMS/ICSEE (2)
Tianshan Wang, Fan Jiang, Xiaojin Zhu, Hesheng Zhang, Zhiyuan Gao
2017 conf
LSMS/ICSEE (1)
Haotian Liu, Yubin Fang, Bing Bai, Xiaojin Zhu
2017 conf
LSMS/ICSEE (1)
Yubin Fang, Xiaojin Zhu, Haotian Liu, Zhiyuan Gao
2012 conf
AsiaSim (2)
Xiaoping Qiao, Hesheng Zhang, Jinxing Xu, Xiaojin Zhu
2012 conf
AsiaSim (1)
Hesheng Zhang, Xiaoping Qiao, Ping'an Ding, Xiaojin Zhu
2010 conf
ICIRA (1)
Zhonghua Miao, Xuyong Wang, Chengliang Liu, Xiaojin Zhu
2010 Misc conf
ICNC
Xiaojin Zhu, Zhiyan Chen, Zhiyuan Gao, Xiaojun Wu
2007 conf
LSMS (1)
Tinggao Qin, Xiaojin Zhu, Yanchun Chen, Jian Wang
2006 conf
ICIC (1)
Xiaojin Zhu, Yanchun Chen, Hesheng Zhang, Jialin 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("/", ".")