¿Por qué las aplicaciones deshabilitadas siguen ejecutándose?

8

Me di cuenta de que las aplicaciones (como Google Contacts Sync) que se han deshabilitado con el administrador de aplicaciones de Android (KitKat) todavía se muestran como en ejecución cuando se usan herramientas de observación de procesos. Esto es cierto incluso después de reiniciar el dispositivo.

¿Por qué las aplicaciones deshabilitadas siguen ejecutándose? ¿Existe una forma efectiva (y segura) de desactivarlos realmente?

Las soluciones que requieren privilegios de root son aceptables.

(Tenga en cuenta que para el ejemplo específico anterior, puede decirle a Android que no sincronice sus contactos, pero aún ejecuta el proceso de sincronización de contactos de Google. Pero no nos detengamos en ese ejemplo ... es solo un ejemplo).

RockPaperLizard
fuente
Justo al lado del botón "Desactivar" hay un botón "Forzar detención". Presiónelo y el proceso debería terminar y no comenzar más.
GiantTree
@GiantTree Gracias. Después de reiniciar, ¿no comenzará de nuevo?
RockPaperLizard
44
En su caso, lo hace, porque una aplicación del sistema ha llamado explícitamente a un servicio exportado de ese paquete y la única forma de matar de manera confiable ese proceso (y cualquier otro) es matarlo activamente usando Greenify, Amplify (requiere Xposed) o aplicaciones similares. Nota: esto no debería suceder y debería considerarse un error, ya que PackageManager tiene la tarea de no permitir que se ejecute una aplicación deshabilitada.
GiantTree
1
Bueno, en ese sentido, deshabilité todos los servicios, receptores, actividades y proveedores de contenido, así como deshabilité la aplicación SystemUI. Reinicié el dispositivo y adivine qué carga la aplicación todavía se cargó en la memoria (como no es el caso con pm block/hide), lo que me hace preguntarme qué está causando que la aplicación se cargue ahora. Otra cuestión es que, mientras se cargó en la memoria, puede observar su ausencia superficial por falta de fondo, temas, barra de estado y más. Quizás, una nueva pregunta se puede sacar de esto.
Señor del fuego
1
@Firelord, supongo que eso es lo que señalé anteriormente: si deshabilita una aplicación, solo está "marcada como deshabilitada" (y no se muestra en el iniciador, etc.), pero todavía está registrada en el sistema (administrador de paquetes), para que otras aplicaciones puedan encontrarla y llama a sus intenciones. Parece que la ocultación / bloqueo es bastante comparable con una "desinstalación de dejar .apky datos atrás", por lo que la aplicación se vuelve "completamente no registrada e invisible para todo menos para el administrador de archivos", por lo que otras aplicaciones ya no pueden llamar a sus intenciones como pueden No los encuentre.
Izzy

Respuestas:

7

Su Android no necesita tener acceso de root para deshabilitar realmente una aplicación, si tiene la versión 4.4.xo superior. Todo lo que necesitas esconfiguración en PC y depuración de USB habilitada en un dispositivo no rooteado, o una aplicación de emulador de terminal para un dispositivo rooteado (también puede usar adb).

Si marca el pmuso del Administrador de paquetes ( ), verá

bloque pm [--ID_USUARIO_USUARIO] PACKAGE_OR_COMPONENT ")
pm desbloquear [--user USER_ID] PACKAGE_OR_COMPONENT ")

Para Lollipop, sería

pm hide [--user USER_ID] PACKAGE_OR_COMPONENT ")
pm mostrar [--user USER_ID] PACKAGE_OR_COMPONENT ")

Para bloquear u ocultar un paquete (es seguro), simplemente haga

pm block PACKAGE # for KitKat
pm hide PACKAGE  # for Lollipop

Para desbloquear o mostrar el paquete, haga

pm unblock PACKAGE #for KitKat 
pm unhide PACKAGE  # for Lollipop

PACKAGE→ nombre del paquete de una aplicación. Para saber el nombre del paquete de una aplicación:

Agregue adb shellantes del mismo comando para ejecutarlos desde la PC.

La función detrás de hide tiene el siguiente comentario dentro del código fuente

Pone el paquete en un estado oculto, que es casi como un estado desinstalado, lo que hace que el paquete no esté disponible, pero no elimina los datos o el archivo del paquete real. La aplicación se puede ocultar al restablecer el estado oculto o al instalarlo

Se hacen comentarios similares para el bloque aquí .

Para verificar el reclamo, puede usar algunos servicios del sistema como meminfo, procstatsy activityusar la herramienta dumpsys o incluso enumerar todos los procesos que usan ps. No encontrará una presencia activa de la aplicación bloqueada / oculta.

Lo mismo ocurre con muchas aplicaciones del sistema deshabilitadas usando GUI o pm disableno para todas las aplicaciones, ya que incluso una aplicación deshabilitada puede recibir transmisiones para las que se ha registrado, lo que solo se puede hacer si está cargada en la memoria 1 . Sin embargo, una aplicación deshabilitada no puede actuar por sí sola, ni puede ser ejecutada por ninguna otra aplicación.

He argumentado algunas de las diferencias entre ocultar / bloquear y desactivar en mi pregunta pm hide VS pm disable: la crisis de identidad . Proporciona solo información complementaria a esta respuesta, por lo que puede omitirla.

EDITAR:

Parece que la técnica no funciona para todas las aplicaciones en Android KitKat. En ese caso, simplemente revoque el permiso de lectura del APK de la aplicación o elimine la extensión .APK del nombre del archivo de la aplicación (este último lo sugirió Jaskaranbir una vez), seguido de un reinicio suave / completo. Esto es lo mismo que eliminar una aplicación del sistema, con la única diferencia de que todos los archivos permanecerían en su lugar.

Ambos pasos se pueden ejecutar con cualquier aplicación de administrador de archivos raíz. La forma de la línea de comando es:

adb shell su -c 'chmod 000 /data/app/PACKAGE*'             # 000 means no read-write-executable permission to user,group and others. 
adb shell su -c 'mv /data/app/PACKAGE* /data/app/PACKAGE'  # doing renaming by moving the file
adb reboot

1: falta de evidencia técnica para respaldar el hecho

Señor del fuego
fuente
¡Gran respuesta! ¡Gracias! ¿Es mejor deshabilitar primero la aplicación con el administrador de aplicaciones de Android o mejor asegurarse de que no esté deshabilitada allí?
RockPaperLizard
No es necesario deshabilitar la aplicación si está optando por ella, pm block/hideasí que no la toque.
Señor del fuego
Si ya está deshabilitado, ¿es mejor volver a habilitarlo?
RockPaperLizard
1
Esto es extraño Probé el bloqueo del sistema en mi Kitkat y para mi sorpresa, el bloqueo funciona igual que deshabilitar, esta aplicación permanece en la memoria. El proceso de SystemUI se bifurcó incluso si lo maté. No sé si es un error o un comportamiento deseado, pero en cualquier caso, está en contraste con mis hallazgos relacionados con Lollipop establecidos en la respuesta. Supongo que la respuesta es bastante inútil ahora.
Señor del fuego
1
@RockPaperLizard, olvidé decirte un truco muy simple. Revoque los permisos de lectura del archivo del paquete (o directorio base, en el caso de Lollipop), reinicie y listo. Por ejemplo, con permisos de root, puede detener SystemUI de esta manera, adb shell su -c "chmod 111 /system/app/SystemUI.apk". 111 significa establecer solo permisos ejecutables para el propietario, el grupo y otros. Reinicie y la aplicación faltará al sistema. También puedes configurarlo 000.
Señor del fuego