James R. Driscoll

38 papers A* 8A 1B 1C 2Journal 15Unranked 11
YearRankTypeTitle / Venue / Authors
1997 J jnl
SIAM J. Comput.
James R. Driscoll, Dennis M. Healy Jr., Daniel N. Rockmore
1995 conf
TREC
James R. Driscoll, S. Abbott, K. Hu, M. Miller, G. Theis
1995 J jnl
Discret. Appl. Math.
James R. Driscoll, Dennis M. Healy Jr., Garth Isaak
1994 J jnl
J. ACM
James R. Driscoll, Daniel Dominic Sleator, Robert Endre Tarjan
1994 conf
TREC
James R. Driscoll, G. Theis, G. Billings
1993 J jnl
J. Algorithms
Eric Bach, James R. Driscoll, Jeffrey O. Shallit
1993 conf
TREC
Richard Boyd, James R. Driscoll, Inien Syu
1992 C conf
DEXA
David A. Grossman, James R. Driscoll
1992 conf
TREC
James R. Driscoll, Jennifer Lautenschlager, Mimi Zhao
1991 C conf
DEXA
Edgar B. Wendlandt, James R. Driscoll
1991 A* conf
SODA
James R. Driscoll, Daniel Dominic Sleator, Robert Endre Tarjan
1991 A* conf
SIGIR
Edgar B. Wendlandt, James R. Driscoll
1991 J jnl
Inf. Process. Manag.
Linda C. Malone, James R. Driscoll, Julie Wildman Pepe
1991 J jnl
Inf. Process. Manag.
James R. Driscoll, David A. Rajala, William H. Shaffer, Donald W. Thomas
1990 A* conf
SODA
Eric Bach, James R. Driscoll, Jeffrey O. Shallit
1989 J jnl
ACM Trans. Database Syst.
Sheau-Dong Lang, James R. Driscoll, Jiann H. Jou
1989 A* conf
FOCS
James R. Driscoll, Dennis M. Healy Jr.
1989 J jnl
J. Comput. Syst. Sci.
James R. Driscoll, Neil Sarnak, Daniel Dominic Sleator, Robert Endre Tarjan
1988 conf
RIAO
James R. Driscoll
1988 J jnl
Commun. ACM
James R. Driscoll, Harold N. Gabow, Ruth Shrairman, Robert Endre Tarjan
1987 J jnl
Inf. Syst.
James R. Driscoll, Sheau-Dong Lang, Stephen M. Bratman
1987 J jnl
Inf. Comput.
James R. Driscoll, Merrick L. Furst
1987 J jnl
Inf. Process. Lett.
James R. Driscoll, Sheau-Dong Lang, LeRoy A. Franklin
1986 J jnl
Inf. Syst.
Sheau-Dong Lang, James R. Driscoll, Jiann H. Jou
1986 A* conf
ICDE
Sheau-Dong Lang, James R. Driscoll, Jiann H. Jou
1986 A* conf
STOC
James R. Driscoll, Neil Sarnak, Daniel Dominic Sleator, Robert Endre Tarjan
1984 conf
AFIPS National Computer Conference
Kathryn C. Kinsley, James R. Driscoll
1983 A conf
SIGCSE
James R. Driscoll, Pentti A. Honkanen, William A. Shay, John C. Peck
1983 A* conf
STOC
James R. Driscoll, Merrick L. Furst
1981 J jnl
Inf. Syst.
Robert C. Brigham, Ronald D. Dutton, James R. Driscoll
1979 B conf
COMPSAC
Beverly A. Dutton, Ching-Hua Chen, James R. Driscoll
1979 conf
ACM Annual Conference
Tamira Bonar, James R. Driscoll
1979 conf
ACM Annual Conference
Kathryn C. Kinsley, James R. Driscoll
1978 J jnl
Commun. ACM
James R. Driscoll, Y. Edmund Lien
1978 conf
ACM Annual Conference (2)
James R. Driscoll, Beverly A. Dutton, Kathryn C. Kinsley
1978 conf
ACM-SE
James R. Driscoll
1978 conf
Jerusalem Conference on Information Technology
James R. Driscoll
1975 A* conf
VLDB
Y. Edmund Lien, Carl E. Taylor, James R. Driscoll, Mark L. Reynolds
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