;;;; Copyright 2007 The Android Open Source Project ;;; Set up GUD+JDB to attach to a Java process running on the phone or ;;; under the emulator. (defvar android-jdb-port-history '("8700") "history of ports supplied to `android-jdb'") (defvar android-jdb-project-root-history '() "history of project roots supplied to `android-jdb'") (defvar android-jdb-history nil "history of commands supplied to `android-jdb'") (defvar android-jdb-activity-class-history () "history of activity classes supplied to `start-android-activity'") (defcustom android-jdb-command-name "jdb" "Name of Java debugger." :type 'string :group 'android) (defgroup android nil "Android Applications." :group 'applications) (defcustom android-project-root nil "This is where your Android project root is stored." :type 'directory :group 'android ) (defcustom android-apk nil "This is where your Android Application Package is stored." :type 'string :group 'android) (defcustom android-activity-class nil "This is where your Android Activity class is stored." :type 'string :group 'android) (defun android-read-project-root () (if (or (string-match "XEmacs" emacs-version) (>= emacs-major-version 22)) (read-file-name "Android project root: " android-project-root nil t nil 'file-directory-p) (labels ((read-directory () (read-file-name "Android project root: " android-project-root nil t nil))) (do ((entered-root (read-directory) (read-directory))) ((and entered-root (file-directory-p entered-root)) (expand-file-name entered-root)))))) (defun android-jdb (port root) "Set GUD+JDB up to run against Android on PORT in directory ROOT." (interactive (list (read-from-minibuffer "Activity's JDWP DDMS port: " (car android-jdb-port-history) nil t 'android-jdb-port-history) (android-read-project-root))) (setq android-project-root root) (let ((jdb-command (format "%s -attach localhost:%s -sourcepath%s" android-jdb-command-name port (format "%s/src" root)))) (if (not (string= jdb-command (car android-jdb-history))) (push jdb-command android-jdb-history)) (jdb jdb-command))) (defun android-emulate () "Run the Android emulator. This expects the SDK tools directory to be in the current path." (interactive) (compile "emulator")) (defun android-install-app (apk) "Install an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path." (interactive (list (expand-file-name (read-file-name "Android Application Package (.apk): " nil android-apk t nil nil)))) (setq android-apk apk) (compile (format "adb install -r %s" apk))) (defun android-uninstall-app (package-name) "Uninstall an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path. Specify the package name --- and not the name of the application e.g., com.android.foo." (interactive (list (read-from-minibuffer "Package: "))) (compile (format "adb uninstall %s" package-name))) (defun android-start-activity (package class) "Start the activity PACKAGE/CLASS in the Android emulator. This expects the SDK tools directory to be in the current path." (interactive (list (read-from-minibuffer "Package: ") (read-from-minibuffer "Activity Java class: " (car android-jdb-activity-class-history) nil t 'android-jdb-activity-class-history))) (compile (format "adb shell am start -n %s/%s" package class))) (defun android-debug-activity (package class) "Start the activity PACKAGE/CLASS within the debugger in the Android emulator. This expects the SDK tools directory to be in the current path." (interactive (list (read-from-minibuffer "Package: ") (read-from-minibuffer "Activity Java class: " (car android-jdb-activity-class-history) nil t 'android-jdb-activity-class-history))) (compile (format "adb shell am start -D -n %s/%s" package class))) (provide 'android)