Jaco A. Jordaan

30 papers B 1C 7Journal 1Unranked 21
YearRankTypeTitle / Venue / Authors
2023 conf
AFRICON
Fannie Isaac Masango, Jaco A. Jordaan, Agha Francis Nnachi
2021 conf
AFRICON
Bonginkosi A. Thango, Aloys Oriedi Akumu, L. S. Sikhosana, Agha Francis Nnachi, Jaco A. Jordaan
2021 conf
AFRICON
Bonginkosi A. Thango, Aloys Oriedi Akumu, L. S. Sikhosana, Agha Francis Nnachi, Jaco A. Jordaan
2020 C conf
ISNN
Katleho Moloi, Jaco A. Jordaan, Yskandar Hamam
2019 conf
ISNN (2)
Katleho Moloi, Jaco A. Jordaan, Yskandar Hamam
2019 conf
AFRICON
Katleho Moloi, Jaco A. Jordaan, Bolanle Tolulope Abe
2019 conf
AFRICON
Katleho Moloi, Bolanle Tolulope Abe, Agha Francis Nnachi, Jaco A. Jordaan
2019 conf
ISNN (2)
Bolanle Tolulope Abe, Jaco A. Jordaan
2018 conf
IDEAL (1)
Katleho Moloi, Jaco A. Jordaan, Yskandar Hamam
2017 conf
AFRICON
Xolani G. Magagula, Yskandar Hamam, Jaco A. Jordaan, Adedayo Ademola Yusuff
2017 conf
AFRICON
Katleho Moloi, Jaco A. Jordaan, Yskandar Hamam
2015 J jnl
CoRR
Abhisek Ukil, Willy Siti, Jaco A. Jordaan
2015 conf
ICPRAM (1)
Bolanle Tolulope Abe, Jaco A. Jordaan
2013 conf
AFRICON
J. F. van der Merwe, Jaco A. Jordaan
2013 conf
ASCC
Dan V. Nicolae, Jaco A. Jordaan
2013 C conf
ICMV
Bolanle Tolulope Abe, Jaco A. Jordaan, Tshilidzi Marwala
2013 C conf
ICMV
Bolanle Tolulope Abe, Jaco A. Jordaan
2013 conf
AFRICON
D. H. Tungadio, B. P. Numbi, M. W. Siti, Jaco A. Jordaan
2012 B conf
IJCNN
Jaco A. Jordaan, Dan V. Nicolae, Adisa A. Jimoh
2011 conf
AFRICON
Kabeya Musasa, Willy Siti, Jaco A. Jordaan
2011 conf
AFRICON
Jaco A. Jordaan, Abhisek Ukil
2008 C conf
IDEAL
Jaco A. Jordaan, M. W. Siti, A. A. Jimoh
2008 C conf
IDEAL
Anish Mathew Kurien, Barend J. van Wyk, Yskandar Hamam, Jaco A. Jordaan
2007 conf
ICONIP (2)
M. W. Siti, Dan V. Nicolae, Jaco A. Jordaan, A. A. Jimoh
2007 C conf
IDEAL
Jaco A. Jordaan, Abhisek Ukil
2007 conf
ICONIP (2)
Jaco A. Jordaan, Anton van Wyk, Ben van Wyk
2007 C conf
IDEAL
Jaco A. Jordaan, Michaël A. van Wyk, Barend J. van Wyk
2007 conf
ICONIP (2)
M. W. Siti, A. A. Jimoh, Jaco A. Jordaan, Dan V. Nicolae
2006 conf
ICONIP (2)
Abhisek Ukil, Jaco A. Jordaan
2006 conf
ISNN (2)
Abhisek Ukil, Willy Siti, Jaco A. Jordaan
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("/", ".")