Neil Rubens

29 papers A 3B 5C 1Journal 11Unranked 7
YearRankTypeTitle / Venue / Authors
2016 J jnl
Comput. Sci. Rev.
Mehdi Elahi, Francesco Ricci, Neil Rubens
2016 conf
HICSS
Jukka Huhtamäki, Neil Rubens
2016 B conf
LREC
Dain Kaplan, Neil Rubens, Simone Teufel, Takenobu Tokunaga
2015 ch.
Recommender Systems Handbook
Neil Rubens, Mehdi Elahi, Masashi Sugiyama, Dain Kaplan
2015 A conf
AIED
Sébastien Louvigné, Yoshihiro Kato, Neil Rubens, Maomi Ueno
2015 J jnl
ACM Trans. Manag. Inf. Syst.
Rahul C. Basole, Martha G. Russell, Jukka Huhtamäki, Neil Rubens, Kaisa Still, Hyunwoo Park
2014 conf
EC-Web
Mehdi Elahi, Francesco Ricci, Neil Rubens
2014 B conf
ICALT
Sébastien Louvigné, Yoshihiro Kato, Neil Rubens, Maomi Ueno
2014 J jnl
Int. J. Technol. Manag.
Kaisa Still, Jukka Huhtamäki, Martha G. Russell, Neil Rubens
2014 J jnl
CoRR
Neil Rubens
2013 J jnl
ACM Trans. Intell. Syst. Technol.
Mehdi Elahi, Francesco Ricci, Neil Rubens
2013 B conf
ICALT
Xin Wan, Neil Rubens, Toshio Okamoto
2012 conf
ICONIP (3)
Marko V. Jankovic, Neil Rubens
2012 C conf
ISMIS
Mehdi Elahi, Francesco Ricci, Neil Rubens
2012 conf
ICWL Workshops
Neil Rubens, Dain Kaplan, Toshio Okamoto
2012 B conf
ICALT
Neil Rubens, Toshio Okamoto, Dain Kaplan
2012 conf
ICMB
Rahul C. Basole, Martha G. Russell, Jukka Huhtamäki, Neil Rubens
2012 B conf
ICALT
Sébastien Louvigné, Neil Rubens, Fumihiko Anma, Toshio Okamoto
2011 J jnl
J. Softw.
Neil Rubens, Kaisa Still, Jukka Huhtamäki, Martha G. Russell
2011 ch.
Recommender Systems Handbook
Neil Rubens, Dain Kaplan, Masashi Sugiyama
2011 J jnl
Int. J. Inf. Syst. Soc. Chang.
Neil Rubens, Dain Kaplan, Toshio Okamoto
2010 J jnl
Int. J. Knowl. Web Intell.
Neil Rubens, Mikko Vilenius, Toshio Okamoto, Dain Kaplan
2010 J jnl
Inf. Media Technol.
Neil Rubens, Ryota Tomioka, Masashi Sugiyama
2009 conf
Web Intelligence/IAT Workshops
Neil Rubens, Mikko Vilenius, Toshio Okamoto
2008 J jnl
Neural Networks
Masashi Sugiyama, Neil Rubens
2008 A conf
SDM
Masashi Sugiyama, Neil Rubens
2008 conf
LKR
Neil Rubens, Vera Sheinman, Takenobu Tokunaga, Masashi Sugiyama
2007 A conf
RecSys
Neil Rubens, Masashi Sugiyama
2006 J jnl
CoRR
Neil Rubens
redb/extractors/decompiler/apk/apktool_wrapper.py
← Index redb/extractors/decompiler/apk/apktool_wrapper.py python
"""Apktool disassembler subprocess wrapper.

Manages apktool subprocess execution for smali disassembly,
following the CAPA extractor subprocess pattern.
"""

import os
import signal
import subprocess
from typing import List, Optional


class ApktoolDisassembler:
    """Subprocess wrapper for apktool smali disassembly."""

    def __init__(
        self, apktool_path: str = None, timeout: int = None, log=None
    ):
        self.apktool_path = apktool_path or os.getenv("APKTOOL_PATH", "apktool")
        self.timeout = timeout or int(os.getenv("APKTOOL_TIMEOUT", "120"))
        self.log = log

    def disassemble(self, apk_path: str, output_dir: str) -> bool:
        """Run apktool disassembly on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.apktool_path,
            "d",
            "--no-res",
            "--force",
            "--output", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"apktool returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    return False
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"apktool timed out after {self.timeout}s"
                    )
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"apktool not found at '{self.apktool_path}'. "
                    "Install apktool or set APKTOOL_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"apktool execution error: {e}")
            return False

    def get_smali_directories(self, output_dir: str) -> List[str]:
        """Return paths to all smali output directories.

        Handles multi-DEX: smali/, smali_classes2/, smali_classes3/, etc.
        """
        smali_dirs = []
        if not os.path.isdir(output_dir):
            return smali_dirs

        for entry in sorted(os.listdir(output_dir)):
            if entry == "smali" or entry.startswith("smali_classes"):
                full_path = os.path.join(output_dir, entry)
                if os.path.isdir(full_path):
                    smali_dirs.append(full_path)

        return smali_dirs