2009-06-12 18 views
52

Tengo una biblioteca de Android que carga datos en un servidor de prueba y servidor de producción. Me gustaría que los desarrolladores que usen esta biblioteca utilicen el servidor de prueba durante el desarrollo y el servidor de producción cuando la aplicación se descargue de Android Market.Detectar si la aplicación se descargó de Android Market

¿Es posible que una aplicación indique de dónde vino (de mercado o no de mercado?) Me imagino que se podría detectar la presencia del archivo JAR firmado.

+0

¿Desea saber si la aplicación está publicada o desde dónde el usuario final descargó la aplicación? Como si el usuario cargara la aplicación del mercado, las aplicaciones de mercado usan el servidor de producción o la aplicación se publicó, por lo que todas las copias de esa aplicación se convierten en aplicaciones de producción. – Grant

+0

Grant, la diferencia que busco es tiempo de desarrollador vs tiempo de producción, así que quiero que las copias del desarrollador permanezcan en el servidor de prueba. Solo quiero que las aplicaciones que se descargaron "en la naturaleza" utilicen el servidor de producción. – sehugg

+0

Crea otra aplicación que no hace nada, luego prueba la presencia de eso para indicar una compilación de depuración. Instale la aplicación en teléfonos de desarrollo. – OJW

Respuesta

38

Sí, podría usar la firma para eso. Si usa una clave de depuración para firmar su aplicación durante el desarrollo y una clave de liberación al cargar su aplicación al mercado, puede verificar la firma con la que se firmó la aplicación y en función de esa prueba de uso o servidor de producción. Aquí es una pequeña pieza de código para leer la firma de su aplicación:

try { 
     PackageManager manager = context.getPackageManager(); 
     PackageInfo appInfo = manager.getPackageInfo(
      YOUR_PACKAGE_NAME, PackageManager.GET_SIGNATURES); 

     // Now test if the first signature equals your debug key. 
     boolean shouldUseTestServer = 
      appInfo.signatures[0].toCharsString().equals(YOUR_DEBUG_KEY); 

    } catch (NameNotFoundException e) { 
     // Expected exception that occurs if the package is not present. 
    } 

YOUR_PACKAGE_NAME debe ser algo así como 'com.wsl.CardioTrainer'. Debe ser el nombre del paquete que utilizó en su AndroidManifest.xml. buena suerte

marca

+1

¿Es una buena idea codificar a YOUR_RELEASE_KEY? ¿La ingeniería inversa lo revelará? – Thushan

+4

Eso podría resolver el problema, pero definitivamente NO pondría mi clave privada completa en mi código si fuera usted. ¿Quizás podría salirse con la suya simplemente usando un subconjunto de 20 caracteres de la clave o algo así? –

+5

Creo que usar algún tipo de hash en la clave y la codificación dura, luego hash la clave almacenada en la información del paquete, y luego comprobar que impediría que alguien vea la clave real si se tratara de ingeniería inversa. –

1

Puede establecer la configuración predeterminada en el entorno de producción y usar un Instrumentation personalizado que establece la configuración en el entorno de prueba. La instrumentación debe eliminarse antes de su publicación en el mercado Android.

3

Por lo que puedo decir, no hay nada que la Aplicación de Mercado haga para "marcar" una aplicación para decir que fue descargada del mercado.

He visto este problema abordado de manera diferente por otra biblioteca de Android. El SDK de AdMob para Android se puede descargar y usar de manera gratuita como se describe en on their wiki. Esta biblioteca ofrece anuncios, por lo que tienen el mismo deseo de poder determinar si la aplicación que se está ejecutando actualmente está siendo probada por el desarrollador o si se está utilizando "en la naturaleza". Su enfoque era exigir que el desarrollador estableciera un atributo de "prueba" en el XML o llamar a sus bibliotecas la función "setTesting (boolean)" para que la biblioteca supiera qué anuncios servir. Obviamente, se trata más de un enfoque manual que depende del desarrollador para cambiar una línea de código o XML antes de su publicación.

+1

Sí, ese es un enfoque ... el problema es que es difícil recordar cambiarlo cuando publica :) Estaba buscando una forma que fuera automática. Oh bien. – sehugg

+1

Puede personalizar la secuencia de comandos 'build.xml' Ant para intercambiar variables entre la versión y la creación de depuración. Lo hice de tal manera que una clase de configuración (para las claves de Facebook y Twitter) y un archivo de recursos (para Google Maps) se intercambian automáticamente. –

0

Quizás podría agregar una configuración a su aplicación para "modo desarrollador".

Otra posibilidad, haga que busque un archivo especial o archivo de configuración en la tarjeta SD, y apague la llave.

10

A partir de API 5, puede utilizar PackageManager.getInstallerPackageName(String). De la documentación:

Recupere el nombre del paquete de la aplicación que instaló un paquete. Esto identifica de qué mercado proviene el paquete.

para obtener el paquete de la Android Market, this post puede ayudar.

Cuestiones relacionadas