Malcolm K. Crowe

33 papers A* 1B 1C 1Journal 21Unranked 8
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2024 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2024 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2023 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2023 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2021 J jnl
CoRR
Malcolm K. Crowe, Carolyn Begg, Fritz Laux, Martti Laiho
2021 J jnl
CoRR
Fritz Laux, Malcolm K. Crowe
2021 J jnl
CoRR
Malcolm K. Crowe, Fritz Laux
2015 J jnl
Int. J. Intell. Comput. Cybern.
Kaibo Xu, Junkang Feng, Malcolm K. Crowe, Lin Liu
2014 conf
SGAI Conf.
Chris Jones, Malcolm K. Crowe
2013 J jnl
Inf. Sci.
Jigang Sun, Malcolm K. Crowe, Colin Fyfe
2012 J jnl
Int. J. Data Min. Model. Manag.
Xi Wang, Malcolm K. Crowe, Colin Fyfe
2012 J jnl
Inf. Sci.
Jigang Sun, Colin Fyfe, Malcolm K. Crowe
2012 conf
UKCI
Salah Rana, Malcolm K. Crowe, Colin Fyfe
2011 J jnl
Pattern Recognit.
Jigang Sun, Malcolm K. Crowe, Colin Fyfe
2011 conf
ICUMT
Tawfik Al Hadhrami, Qi Wang, Malcolm K. Crowe, Christos Grecos
2010 B conf
ESANN
Jigang Sun, Colin Fyfe, Malcolm K. Crowe
2010 conf
IEA/AIE (2)
Jigang Sun, Malcolm K. Crowe, Colin Fyfe
2009 conf
VS-GAMES
Malcolm K. Crowe, Daniel Livingstone
2009 J jnl
Knowl. Inf. Syst.
Kaibo Xu, Junkang Feng, Malcolm K. Crowe
2006 C conf
IDEAL
Wesam Barbakh, Malcolm K. Crowe, Colin Fyfe
2005 A* conf
SIGIR
Leif Azzopardi, Mark A. Girolami, Malcolm K. Crowe
2005 conf
Databases and Applications
Malcolm K. Crowe
1994 book
Cooperative Work with Multimedia
Malcolm K. Crowe
1994 conf
Broadband Islands
Malcolm K. Crowe, Shicheng Tian
1993 J jnl
Inf. Softw. Technol.
Malcolm K. Crowe
1987 conf
ESEC
Malcolm K. Crowe, Clark Nicol, Martin E. Corr, John W. Oram, David G. Jenkins
1987 J jnl
Softw. Pract. Exp.
Malcolm K. Crowe
1987 J jnl
Softw. Eng. J.
Clark Nicol, Malcolm K. Crowe, Martin E. Corr, John W. Oram, David G. Jenkins
1986 J jnl
Comput. J.
David Mackay, G. Ball, Malcolm K. Crowe, Michael Hughes, David G. Jenkins, Clark Nicol
1985 J jnl
ACM SIGPLAN Notices
Malcolm K. Crowe, Clark Nicol, Michael Hughes, David Mackay
1982 J jnl
ACM SIGPLAN Notices
Malcolm K. Crowe
1980 J jnl
Comput. J.
Malcolm K. Crowe
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("/", ".")