Detener una aplicación de Android desde la consola

205

¿Es posible detener una aplicación de Android desde la consola? Algo como:

adb stop com.my.app.package

Aceleraría mucho nuestro proceso de prueba. En este momento, desinstalamos / instalamos la aplicación cada vez para asegurarnos de que los casos de prueba manuales comiencen con un estado limpio.

hpique
fuente

Respuestas:

146

Editar: mucho después de que escribí esta publicación y fue aceptada como respuesta, el am force-stopcomando fue implementado por el equipo de Android, como se menciona en esta respuesta .

Alternativamente: en lugar de simplemente detener la aplicación, ya que mencionas que quieres una "pizarra limpia" para cada ejecución de prueba, puedes usar adb shell pm clear com.my.app.package, lo que detendrá el proceso de la aplicación y borrará todos los datos almacenados para esa aplicación.


Si estás en Linux:
adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill

Eso solo funcionará para dispositivos / emuladores donde tenga root inmediatamente después de ejecutar un shell. Eso probablemente se puede refinar un poco para llamar de suantemano.

De lo contrario, puede hacer (manualmente, o supongo que con guión):
pc $ adb -d shell
android $ su
android # ps
android # kill <process id from ps output>

Christopher Orr
fuente
66
No pude hacerlo funcionar (permiso denegado tanto para kill como para su), pero +1 por mostrarme que puedo hacer mucho más de lo que pensaba con adb.
hpique
9
Ah, parece que no tienes un dispositivo rooteado. ¡Definitivamente funciona en el emulador al menos! :)
Christopher Orr
1
Quizás tenga que volver a montar la partición lectura-escritura y ejecutar adb como root: adb remount; adb root # que es solo una estúpida idea
Rorist
570

La forma limpia de detener la aplicación es:

adb shell am force-stop com.my.app.package

De esta manera, no tiene que averiguar la ID del proceso.

Enrico Ros
fuente
28
Esta debería ser la respuesta aceptada para este problema. La pregunta no incluye un dispositivo rooteado.
Dimitris
10
@Dimitris Escribí mi respuesta anterior antes de que force-stopexistiera el comando. Actualicé mi respuesta para señalar a esta.
Christopher Orr
2
También actualicé mi respuesta con una buena manera de proporcionar realmente una "pizarra limpia" para ejecutar pruebas.
Christopher Orr
Punto importante que después de esto su BroadcastReceiver no funcionará (hasta que se abra la próxima aplicación) commonsware.com/blog/2011/07/13/…
CAMOBAP
Probado en Android 9.0 API Level 28, la aplicación todavía se muestra en las aplicaciones recientes a pesar de que PIDse encuentra con respecto a la aplicación. ¿Sabes cómo detener la aplicación por completo, lo que significa incluso desde las aplicaciones en segundo plano?
talha06
32

Primero, coloque la aplicación en segundo plano (presione el botón de inicio del dispositivo)

Entonces ... en una terminal ...

adb shell am kill com.your.package
dell116
fuente
11
NOTA No creo que esto funcione más en niveles de API> 22.
dell116
lo hace en mi Nexus 5 con Marshmallow
urSus
Esto funciona. Sin embargo, primero asegúrese de poner la aplicación en segundo plano.
PhillyTheThrilly
17

puede usar lo siguiente desde la consola del dispositivo: pm disable com.my.app.packageque lo matará. Luego utilícelo pm enable com.my.app.packagepara poder iniciarlo nuevamente.

Alguien en algún lugar
fuente
1
En un teléfono no rooteado, esto parece no hacer nada.
Robert Muil
Lo he comprobado en un teléfono no rooteado. Al principio hay algunos mensajes de permiso denegado y luego mató mi aplicación / servicio DalvicVM. Solo dale un segundo.
LikeYou
1
en un dispositivo rooteado esto funciona, y tiene el beneficio adicional de poder mantener baja la aplicación / servicio. Esto puede ser deseable para fines de prueba.
miki
2
Nota: Necesitas adb shell, luego ejecuta suprimero.
kakyo
Advertencia, esto hará que desaparezcan los accesos directos del icono del iniciador para ese paquete, incluso después de volver a habilitarlo.
Elad Nava
10

Si tiene acceso al paquete de la aplicación, puede instalarlo con la opción -r y matará el proceso si actualmente se está ejecutando como un efecto secundario. Me gusta esto:

adb -d install -r MyApp.apk ; adb -d shell am start -a android.intent.action.MAIN -n com.MyCompany.MyApp/.MyActivity

La opción -r conserva los datos actualmente asociados con la aplicación. Sin embargo, si desea una pizarra limpia como usted menciona, es posible que no desee utilizar esa opción.

ThomasW
fuente
7

Si apuntas a un dispositivo no rooteado y / o tienes servicios en tu APK que no quieres detener, las otras soluciones no funcionarán.

Para resolver este problema, he recurrido a un receptor de mensajes de difusión que he agregado a mi actividad para detenerlo.

public class TestActivity extends Activity {
    private static final String STOP_COMMAND = "com.example.TestActivity.STOP";

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            TestActivity.this.finish();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //other stuff...

        registerReceiver(broadcastReceiver, new IntentFilter(STOP_COMMAND));
    }
}

De esa manera, puede emitir este comando adb para detener su actividad:

adb shell am broadcast -a com.example.TestActivity.STOP
Patrick Valsecchi
fuente
2

Si todo lo que estás buscando es matar un paquete

pkill package_name 

Deberia trabajar

Steve
fuente
Nota: esto solo funciona en las versiones más recientes de Android. pkill no está disponible en mi emulador 4.4 pero está disponible en el emulador de Android 6.
Simon Warta
1

adb shell killall -9 com.your.package.name

de acuerdo con el "control de acceso obligatorio" de MAC, probablemente tenga el permiso para eliminar el proceso que no ha sido iniciado por root

¡que te diviertas!

sinan bilkay
fuente
Recibo "Operación no permitida" en respuesta a la ejecución de este comando
Abdul Rahman Shamair
0

En eclipse, vaya a la perspectiva DDMS y en la pestaña de dispositivos, haga clic en el proceso que desea matar debajo del dispositivo en el que desea matarlo. Entonces solo necesita presionar el botón de parada y esto debería matar el proceso.

No estoy seguro de cómo haría esto desde la herramienta de línea de comando, pero debe haber una manera. Tal vez lo haces a través del adb shell ...

matto1990
fuente
Encontré un fragmento de código en GitHub sobre cómo hacer esto desde la línea de comandos sin ejecutar Eclipse y lo extendí ligeramente .
sschuberth
-1
pkill NAMEofAPP

Malvavisco no rooteado, termux y emulador de terminal.

William A. Krithinithis Kripto
fuente