¿Por qué el campo PackageInfo.signatures es una matriz y cuándo debería haber algo distinto de un valor aquí?

Estoy revisando las firmas de los paquetes entre sí para determinar si son incompatibles (compilados en diferentes almacenes de claves). Me di cuenta de que PackageInfo.signatures es casi siempre una colección que contiene una sola entrada, lo que tiene sentido para mí. Construyo mi aplicación con una almacén de depuración o de producción, y eso determina la firma del paquete (que es mi comprensión simplista del proceso de firma de apk en este momento). Sé que esto será nulo si no solicito específicamente esta información (pasando el indicador PackageManager.GET_SIGNATURES ), pero no entiendo muy bien el caso en el que habría más de uno.

Escribí algún código de depuración y lo corrí en mi teléfono Android personal. De los 300 paquetes instalados en mi teléfono, todo tenía exactamente una firma, excepto algunos paquetes que parecían ser de mi proveedor de servicios (com.verizon. * Namespaces).

Siento que es aceptable para mi caso de uso (administración de paquetes) considerar que los paquetes de aplicaciones tendrán una sola firma, pero quiero asegurarme de que no me falte algo que podría introducir un bug de caso de borde.

Para sus propósitos, parece completamente aceptable asumir que una aplicación de Android tiene una sola firma. Un APK de Android se puede compilar con varias firmas, pero no es recomendable ni ampliamente probado. (¿Por qué Verizon lo está haciendo?

Encontré este archivo de Dianne Hackborn , la dama del desarrollo de Android:

P : Sé que el firmante del frasco apoya varias firmas en un archivo jar. Si un archivo APK tiene dos firmas válidas, ¿significa que este APK puede acceder al permiso de nivel de firma proporcionado por ambos firmantes?

R : En teoría, algo se hace con múltiples firmas, pero nadie lo ha usado nunca, así que probablemente no funcione. Esto también tiene el efecto secundario (si funciona) de aliasing las dos firmas a la misma cosa ya que presumiblemente proceden del mismo propietario, lo cual es probable que no sea lo que quieres.

Otro poco de Dianne (note el uso de "it", no "they" y "certificate" en lugar de "certificates"):

Q : PackageInfo.signatures: ¿Qué devuelve?

R : Es el certificado que se utilizó para firmar el archivo .apk.

Sin embargo. Es digno de mención que encontré una referencia de prueba a varias firmas en la fuente de Android Git: Test for Checking Package Signatures (Bug 4596332) . Además, el código Android BackupManagerService (y otro código fuente de Android ) garantiza que comprueba si hay varias firmas.

Por lo tanto, aquí está mi conclusión: No tiene que preocuparse de firmas múltiples, a menos que esté codificando en una situación en la que la seguridad y la compilación de los paquetes específicos era importante. (Sin embargo, también parece que no tendría mucho de un problema de acomodar varias firmas si es necesario.)

Espero que sea al menos algo satisfactorio.

  • ¿Cuál es la notación de puntos entre los nombres de las clases y qué significa?
  • RecyclerView: Las clases internas no pueden tener una declaración estática
  • Android: haz algo en actividad cuando cambian las preferencias
  • Permisos de Android SU: ¿Cómo usarlos?
  • Siguiente redirecciones en HTTPResponse Android
  • Sistema de partículas libGDX
  • Procese el comando sin iniciar MainActivity, en Android
  • Fecha sin par: "Fri Oct 10 23:11:07 IST 2014" (al compensar 20)
  • ¿Cómo comprobar mediante programación la disponibilidad de la conexión a Internet en Android?
  • Mismo botón de clic múltiple
  • Toast Stop - getConnectedNodes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.