2009-06-12 17 views
52

Possiedo una libreria Android che carica i dati su un server di prova e un server di produzione. Mi piacerebbe che gli sviluppatori utilizzassero questa libreria per utilizzare il server di prova durante lo sviluppo e il server di produzione quando l'app viene scaricata da Android Market.Rileva se l'app è stata scaricata da Android Market

E 'possibile per un'app indicare da dove proviene (mercato o non mercato?) Immagino che si possa rilevare la presenza del file JAR firmato.

+0

Vuoi sapere se l'app è stata pubblicata o da dove l'utente ha scaricato l'app? Come, l'utente ha caricato l'app dal mercato, quindi le app di mercato utilizzano il server di produzione o l'app è stata pubblicata, quindi tutte le copie di tale app diventano app di produzione. – Grant

+0

Concessione, la differenza che sto cercando è in realtà tempo di sviluppo vs tempo di produzione, quindi voglio che le copie degli sviluppatori rimangano sul server di test. Voglio solo tutte le app che sono state scaricate "in the wild" per utilizzare il server di produzione. – sehugg

+0

Creare un'altra applicazione che non fa nulla, quindi verificare la presenza di quello per indicare una build di debug? Installa l'app sui telefoni di sviluppo. – OJW

risposta

38

Sì, è possibile utilizzare la firma per questo. Se si utilizza una chiave di debug per firmare l'app durante lo sviluppo e una chiave di rilascio quando si carica la propria app sul mercato, è possibile verificare la firma con cui è stata firmata l'app e in base a tale test di utilizzo o server di produzione. Ecco un pezzo di codice piccolo per leggere la firma della vostra applicazione:

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 deve essere qualcosa come 'com.wsl.CardioTrainer'. Deve essere il nome del pacchetto utilizzato nel tuo AndroidManifest.xml. Good Luck

marchio

+1

È una buona idea codificare YOUR_RELEASE_KEY? Il reverse engineering lo rivelerà? – Thushan

+4

Questo potrebbe risolvere il problema, ma sicuramente NON metterei la mia chiave privata completa nel mio codice se fossi in te. Forse potresti cavartela usando solo un sottoinsieme da 20 caratteri della chiave o qualcosa del genere? –

+5

Penso che usare un qualche tipo di hash sulla chiave e codificare in modo rigido, quindi eseguire l'hashing della chiave memorizzata nelle informazioni del pacchetto, quindi controllare che nessuno possa vedere la chiave reale se è stata decodificata. –

1

È possibile configurare la configurazione predefinita nell'ambiente di produzione e utilizzare un valore personalizzato Instrumentation che imposta la configurazione sull'ambiente di prova. L'intromissione dovrebbe essere rimossa prima di essere pubblicata sul mercato Android.

3

Da quello che posso dire non c'è nulla che l'applicazione di mercato fa per "segnalare" un'applicazione per dire che è stato scaricato dal mercato.

Ho visto questo problema affrontato in modo diverso da un'altra libreria Android. L'SDK Android AdMob può essere scaricato e utilizzato gratuitamente come descritto in on their wiki. Questa libreria pubblica gli annunci, quindi hanno lo stesso desiderio di essere in grado di determinare se l'applicazione attualmente in esecuzione viene testata dallo sviluppatore o se viene utilizzata "in the wild". Il loro approccio consisteva nel richiedere che lo sviluppatore impostasse un attributo "testing" nell'XML o chiamasse la funzione "setTesting (boolean)" delle librerie per consentire alla libreria di sapere quali annunci pubblicare. Questo è ovviamente più un approccio manuale che si basa sullo sviluppatore per modificare una riga di codice o XML prima della pubblicazione.

+1

Sì, questo è un approccio. Il problema è che è difficile ricordarsi di cambiarlo quando pubblichi :) Stavo cercando un modo che fosse automatico. Oh bene. – sehugg

+1

È possibile personalizzare lo script di build Ant 'build.xml' per sostituire le variabili tra la versione release e la creazione di debug. L'ho fatto in modo tale che una classe di configurazione (per i tasti Facebook e Twitter) e un file di risorse (per Google Maps) vengano scambiati automaticamente. –

0

Forse potresti aggiungere un'impostazione alla tua app per "modalità sviluppatore".

Un'altra possibilità è cercare un file speciale o un file di configurazione sulla scheda SD e disattivare la chiave.

10

Partendo da API 5, è possibile utilizzare PackageManager.getInstallerPackageName(String). Dalla documentazione:

Recupera il nome del pacchetto dell'applicazione che ha installato un pacchetto. Identifica da quale mercato proviene il pacchetto.

Per ottenere il pacchetto di Android Market, this post può essere d'aiuto.

Problemi correlati