El servicio exportado no requiere permiso: ¿qué significa?

143

Creé un servicio que está vinculado por otras aplicaciones a través de AIDL, y lo agrego al manifiesto de la siguiente manera:

<service android:name=".MyService">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

donde IService es la interfaz AIDL.

De esta manera, Eclipse me muestra la advertencia El servicio exportado no requiere permiso . Si elimino el intent-filter, la advertencia desaparece, pero obviamente las aplicaciones no pueden vincularse al servicio.

¿Qué significa esta advertencia?

enzom83
fuente
31
Significa que otras aplicaciones (arbitrarias) que el usuario tiene en su teléfono pueden vincularse con usted Servicey llamar al método que prefiera que esté expuesto a través de su interfaz AIDL.
Jens
25
cree un nuevo <permission> en su AndroidManifest.xml y use el nombre de ese como el android:permissionatributo de su <service>declaración. O simplemente ignore la advertencia: ¿qué pretende hacer el servicio? Si está de acuerdo con mantener el servicio "interno", es mucho más fácil simplemente configurarlo android:exported="false"en<service>
Jens
3
Luego, ignore la advertencia o agregue un <permiso>, use "firma" si todas sus aplicaciones están firmadas con el mismo certificado o simplemente vaya con "normal" de lo contrario.
Jens
3
Ya está utilizando un certificado (de lanzamiento) para firmar sus aplicaciones: la protección de firma verifica que la aplicación que solicita el permiso esté firmada de la misma manera que la aplicación que definió el permiso.
Jens
2
@Jens Gracias ... me ayudó ... por cierto, puedes agregar tus comentarios como respuesta. Deja que enzom83 lo acepte.
Vijay C

Respuestas:

128

Tuve el mismo problema cuando actualicé SDK a la versión 20 . Lo eliminé agregando Android: propiedad exportada de estaandroid:exported="false" manera:

<service android:name=".MyService"
    android:exported="false">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

Ver este documento

Nam Vu
fuente
56

Si desea restringir el uso de su actividad a su propia aplicación, debe agregar exported=falsea la declaración de manifiesto de su actividad.

Si desea permitir que otras aplicaciones lo usen (explícitamente a través de su nombre de clase o, mejor, usando una intención con un tipo de datos o acción), entonces tiene dos opciones:

  • restringir esas aplicaciones mediante el uso de un permiso
  • permita que todas las aplicaciones lo usen, luego puede agregarlo tools:ignore="ExportedActivity"a la declaración de manifiesto de su actividad.

-

El mismo razonamiento se aplica a un servicio, con tools:ignore="ExportedService"proveedores de contenido y con tools:ignore="ExportedContentProvider".

Snicolas
fuente
8
Esto funcionó para mí, ¡gracias! Sin embargo, tenga en cuenta que esto requiere agregar una declaración xmlns en la parte superior del archivo de manifiesto:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit
Gracias, se agrega automáticamente por Eclipse. Es un buen complemento para otros usuarios de IDEs.
Snicolas
Uso Eclipse 4.2.1, y no lo agrega, dando un error (¿al menos con la configuración predeterminada?). Simplemente dice: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundy no se dan opciones para solucionar esto.
Luis A. Florit
Lo agregará si elimina sus herramientas: foo = instrucción de barra, luego, cuando haya un error / advertencia, haga clic derecho y use una solución rápida para agregar la declaración de herramientas.
Snicolas
1
El caso especial es el SyncService, que debe exportarse pero solo desea que el sistema lo use. Para SyncService o AuthenticatorService agregue android: permission = "signature"
Entreco
4

Como dijo Jens , "significa que otras aplicaciones (arbitrarias) que el usuario tiene en su teléfono pueden vincularse a su Servicio y llamar al método que prefiera que esté expuesto a través de su interfaz AIDL".

JD
fuente