¿Por qué las aplicaciones deshabilitadas aún se están ejecutando?

He notado que las aplicaciones (como Google Contacts Sync) que se han deshabilitado usando el administrador de aplicaciones de Android (KitKat) aún se muestran como ejecutándose cuando se usan herramientas de observación de procesos. Esto es así incluso después de reiniciar el dispositivo.

¿Por qué las aplicaciones deshabilitadas aún se están ejecutando? ¿Existe una forma efectiva (y segura) de desactivarlos?

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).

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 Gracias. Después de un reinicio, ¿no comenzará de nuevo?
En su caso, sí, porque una aplicación del sistema ha llamado explícitamente a un servicio exportado de ese paquete y la única forma de eliminar de manera confiable ese proceso (y cualquier otro) es eliminarlo activamente usando Greenify, Amplify (requiere Xposed) o aplicaciones similares. Nota: esto no debería suceder y debería considerarse un error, porque PackageManager tiene la tarea de no permitir que se ejecute una aplicación deshabilitada.
¡Gracias! Esa es una gran información. He actualizado la pregunta para reflejar que las soluciones raíz son aceptables. ¿Puedo usar una herramienta como MyAndroidTools para deshabilitar manualmente todos los servicios para las aplicaciones deshabilitadas?
@Firelord Gracias. ¿Hide funciona en KitKat o se introdujo en Lollipop? ¿Se puede ejecutar el comando ocultar directamente desde el dispositivo o requiere una conexión adb externa? Después de realizar ese comando, ¿cuál es el comando para revertirlo, si es necesario?
@Firelord ¿Le importa compilar sus comentarios en una respuesta? Aunque la pregunta es "por qué", creo que "cómo prevenir" era la verdadera pregunta (por el por qué: las aplicaciones deshabilitadas aún pueden llamar sus intenciones, lo que sucede con bastante frecuencia para las aplicaciones centrales de Google. De acuerdo con su investigación (vinculada) , esto ya no debería aplicarse una vez que la aplicación se bloqueó/ocultó).
Si tiene éxito con mi respuesta, hágamelo saber, ya que probé mi solución solo en las ROM de Lollipop.
@Izzy y Firelord Preguntando esto para obtener más información: ¿Usar una herramienta como MyAndroidTools para deshabilitar todos los servicios y receptores de la aplicación sería otra solución efectiva?
Bueno, en ese sentido, deshabilité todos los servicios, receptores, actividades y proveedores de contenido, así como también deshabilité la aplicación SystemUI. Reinicié el dispositivo y adiviné qué aplicación todavía se cargó en la memoria (no es el caso de pm block/hide), lo que me hace preguntarme qué está causando que la aplicación se cargue ahora. Otra cosa es que mientras estuvo cargado en la memoria se puede observar su ausencia superficial por falta de fondo, temas, barra de estado y más. Tal vez, una nueva pregunta se puede forjar a partir de esto.
@Firelord Supongo que eso es lo que señalé anteriormente: si deshabilita una aplicación, simplemente se "marca como deshabilitada" (y no se muestra en el iniciador, etc.), pero aún está registrada en el sistema (administrador de paquetes), por lo que otras aplicaciones pueden encontrarlo y llamar a sus intenciones. Parece que ocultar/bloquear es bastante comparable con una "desinstalación, dejando .apkatrás los datos", por lo que la aplicación queda "completamente desregistrada 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 encontrarlos.
@Izzy Excepto que el bloqueo aparentemente no funciona correctamente en KitKat. :-(
@RockPaperLizard... y ocultarse no funciona allí en absoluto. Bueno, la perdición de KK parece no estar limitada a lidiar con tu tarjeta SD. Lo siento por eso. Pero estaba "hablando en general";)

Respuestas (1)

Su Android no necesita tener acceso de root para deshabilitar realmente una aplicación, si tiene la versión 4.4.x o superior. Todo lo que necesita es la configuración de en la PC y la depuración 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 comprueba el pmuso de Package Manager ( ), verá

bloque pm [--user USER_ID] 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 de cada comando para ejecutarlos desde la PC.

La función detrás de ocultar 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 ni el archivo del paquete real. La aplicación se puede mostrar restableciendo el estado oculto o instalándola

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 usando ps. No encontrará una presencia activa de la aplicación bloqueada/oculta.

Lo mismo ocurre con muchas aplicaciones del sistema deshabilitadas mediante GUI o pm disable, pero no 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 discutido algunas de las diferencias entre ocultar / bloquear y deshabilitar en mi pregunta pm hide VS pm disabled: la crisis de identidad . Solo proporciona 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 de archivo de la aplicación (este último sugerido por 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án en su lugar.

Ambos pasos se pueden ejecutar usando cualquier aplicación de administrador de archivos raíz. La forma de 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

¡Gran respuesta! ¡Gracias! ¿Es mejor deshabilitar primero la aplicación usando el administrador de aplicaciones de Android, o es mejor asegurarse de que no esté deshabilitada allí?
No es necesario deshabilitar la aplicación si la elige, pm block/hideasí que déjela intacta.
Si ya está deshabilitado, ¿es mejor volver a habilitarlo?
No hay necesidad de hacer eso. El atributo de ocultar se establecería junto al atributo de deshabilitar para ese paquete (puede verificarlo dentro /data/system/users/0/package-restrictions.xml, buscar <pkg name="YOUR_PACKAGE"). En resumen, es seguro aplicar o no el comando bloquear/ocultar en una aplicación deshabilitada.
Lo intenté. Aquí está la respuesta recibida en el emulador de terminal (textualmente): "ADVERTENCIA: enlazador: app_process tiene reubicaciones de texto. Esto está desperdiciando memoria y es un riesgo de seguridad. Corrija. Eliminado"
Hmmm... No parece estar funcionando. Lo probé en 3 paquetes. Continúan cargando y funcionando.
" ADVERTENCIA: enlazador: app_process tiene reubicaciones de texto. Esto está desperdiciando memoria y es un riesgo de seguridad. Corrija. Eliminado ": ¿tiene Xposed instalado? Solía ​​tener esta advertencia debido a eso. En cuanto a si están funcionando o no, no puedo confirmarlo con certeza porque en mi comentario sobre su pregunta dije que mis hallazgos se basan en Lollipop, pero el bloque debería funcionar de todos modos. Veré qué más puedo encontrar para ayudar aquí.
Esto es extraño. Probé el bloqueo de systemui en mi Kitkat y, para mi sorpresa, el bloqueo funciona igual que la desactivación, esta aplicación permanece en la memoria. El proceso SystemUI se bifurcó incluso si lo eliminé. No sé si es un error o un comportamiento deseado, pero en cualquier caso, contrasta con mis hallazgos relacionados con Lollipop indicados en la respuesta. Supongo que la respuesta es bastante inútil ahora.
@Izzy Te envía un ping para que estés al tanto del chat, ya que te puede interesar.
@RockPaperLizard, olvidé contarte 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 propietario, grupo y otros. Reinicie y la aplicación no estará en el sistema. También puede configurarlo 000.
Gran idea. Vea el enlace de chat arriba para continuar...
Realicé un poco más de prueba y aparece el mensaje "ADVERTENCIA: enlazador: app_process tiene reubicaciones de texto. Esto está desperdiciando memoria y es un riesgo de seguridad. Corrija. Eliminado" aparece ya sea que use pm para bloquear o desbloquear. También aparece cuando se usa un nombre de paquete ficticio. Me pregunto, en KitKat, si está haciendo algo.
Es posible que desee actualizar su respuesta para dejar en claro que esta técnica aparentemente no funciona en KitKat. Además, ¿solo los receptores de transmisión pueden cargar una aplicación deshabilitada, o los servicios también la cargarán? Ver: android.stackexchange.com/questions/131499/…