2011-07-05 10 views
5

Esta es la primera vez que publico aquí. No estoy seguro de si este es el lugar correcto para hacer esta pregunta, pero parece que no encuentro otros lugares más apropiados. Aquí está mi pregunta de todos modos.ActivityManager.forceStopPackage() desde el Administrador de tareas

Entiendo que la API ActivityManager.forceStopPackage() es interna y solo se puede llamar desde el proceso del sistema. Sin embargo, me desconcierta que la aplicación integrada Task Manager (con el nombre del paquete com.motorola.PerformanceManager) en mi teléfono motorola atrix puede llamar directamente sin ser un proceso del sistema. Hay dos cosas que verifiqué.

En primer lugar, es un proceso no es del sistema de ps comando:

app_64 13681 1379 170788 29820 ffffffff 00000000 S com.motorola.PerformanceManager 

En segundo lugar, de hecho, llama al ActivityManager.forceStopPackage() API desde su archivo odex (decompiled en smali, luego en Dex y, a continuación, en java). Desde el código smali, ya está claro que llama a esta API.

También verifiqué su archivo AndroidManifest.xml que no parece ser nada especial para mí (el foro reconoce erróneamente el contenido como URL y me impide publicarlo).

El archivo de manifiesto incluye el permiso android.permission.FORCE_STOP_PACKAGES que se supone que es uno del sistema. Una aplicación que no sea del sistema aún recibirá un error de denegación de permiso incluso con este permiso. Intenté usar la reflexión para acceder a esta API con el permiso android.permission.FORCE_STOP_PACKAGES, pero todavía obtengo el error de tiempo de ejecución.

Ahora, ¿cómo puede la aplicación Task Manager integrada llamar a la API interna sin ser un proceso del sistema? Una posibilidad es que la aplicación esté firmada con la misma clave privada de plataforma. Sin embargo, no estoy seguro de cómo puedo verificar eso. Además, todavía se supone que es un proceso del sistema con descripciones adicionales en el archivo de manifiesto.

Espero que alguien pueda responder mi pregunta. Gracias.

+0

i tienen el mismo problema como: java.lang.SecurityException: Permiso Negación: \t \t forceStopPackage() desde pid = 20914, uid = 10073 requiere Android .permission.FORCE_STOP_PACKAGES ,,, ¿podría ayudarme a resolver este problema? –

Respuesta

13

El permiso "android.permission.FORCE_STOP_PACKAGES" está protegido por la firma de la plataforma.

Si tiene el código fuente de Android a continuación, comprobar la declaración de la autorización:

/frameworks/base/core/res/AndroidManifest.xml

... 
    <permission android:name="android.permission.FORCE_STOP_PACKAGES" 
     android:permissionGroup="android.permission-group.SYSTEM_TOOLS" 
     android:protectionLevel="signature" 
... 

Se puede ver su nivel de protección es la firma, a continuación, comprobar la documentación del SDK para la explicación:

"android: ProtectionLevel"

http://developer.android.com/guide/topics/manifest/permission-element.html#plevel

"firma ... Un permiso que el sistema otorga solo si la aplicación solicitante está firmada con el mismo certificado que la aplicación que declaró el permiso. Si los certificados coinciden, el sistema otorga automáticamente el permiso sin notificar al usuario o solicitar la aprobación explícita del usuario "

El permiso es declarado por el framework-res que está firmado por la firma de plataforma, por lo que la aplicación que desea use el permiso también se firmará con la misma firma.

/frameworks/base/core/res/Android.mk

... 
    LOCAL_PACKAGE_NAME := framework-res 
    LOCAL_CERTIFICATE := platform 
... 

Regards

Ziteng Chen

+0

Gracias, creo que esta es la respuesta correcta. Sin embargo, todavía no estoy seguro de cómo puedo verificar que la aplicación esté firmada con la clave de la plataforma. De acuerdo con el archivo de manifiesto de la aplicación, el permiso se escribe simplemente como (en ninguna parte se menciona el nivel de protección en el archivo de manifiesto). Esto es algo que contradice a lo que entendemos? – zack

+0

Todos los archivos .apk deben estar firmados, pero es posible que usted no lo sepa porque Eclipse ADT lo ha hecho por usted. Siga la guía para firmar apk con sus propias claves: http://developer.android.com/guide/publishing/app-signing.html#ExportWizard Si tiene la fuente de Android, entonces puede encontrar los certificados de depuración de Android en la carpeta/build/target/product/security, pero los fabricantes de teléfonos normalmente reemplazarán los certificados por sus propios certificados en vivo que son confidenciales y nunca se revelarán a usted ni a mí, así que me temo que no se puede obtener, por ejemplo, la plataforma certificado de un teléfono Motorola. –

+0

Gracias de nuevo. Solo para verificar si entiendo esto correctamente. Entiendo que cada archivo .apk está firmado con un certificado. Pero la cuestión es que, de acuerdo con la especificación, ¿no se supone que el permiso FORCE_STOP_PACKAGES tiene una línea de "android: protectionLevel =" signature "en el archivo de manifiesto? ¿Está diciendo que esto no es realmente necesario (el administrador de tareas incorporado? la aplicación no tiene esta línea en absoluto)? Marcaré su respuesta como respuesta después de que haya confirmado mi entendimiento. – zack

Cuestiones relacionadas