11

Problemi con le mie app su Google Play. Ho un'applicazione gratuita che utilizza un'autorizzazione personalizzata. Questa autorizzazione consente l'accesso alle app a pagamento. Queste app a pagamento fungono da "chiavi" e sbloccano le funzionalità nell'app gratuita. Fondamentalmente l'app gratuita tenterà di avviare l'intento di una delle app a pagamento. L'app a pagamento farà alcune cose e tornerà a dire se l'app gratuita dovrebbe sbloccare funzionalità o meno.L'autorizzazione personalizzata Android non riesce in base all'ordine di installazione dell'app

I problemi si verificano in base all'ordine di installazione dell'app. Se l'app gratuita viene installata prima di un'app a pagamento, l'app gratuita non può avviare l'intento. Restituisce il permesso di negazione. Se l'app a pagamento viene installata per prima l'app gratuita, l'app gratuita può avviare l'intento senza problemi. Riavviare il dispositivo e/o forzare l'arresto delle app non risolve il problema. Allego il codice relavent. Qualcosa mi dice che sto facendo qualcosa di sbagliato.

  • App gratuita manifesto (codice rilevante): Codice

    ... 
    <uses-permission android:name="com.company.license.PERMISSION" /> 
    ... 
    
  • App gratuita per verificare l'intenzione (codice rilevante):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1"); 
    KeyApp.putExtra("com.company.license.challenge", 1); 
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown 
    try { 
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP); 
    } catch (Exception e) { 
        cancelStartUp(); 
    } 
    
  • Paid App manifesto (relativo codice):

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.company.installer.1" 
    ... 
    <permission 
        android:name="com.company.license.PERMISSION" 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:protectionLevel="normal" > 
    </permission> 
    
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoDisplay" > 
    
        <activity 
         android:name="com.company.license.auth" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:permission="com.company.license.PERMISSION" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="com.company.license.action.AUTH_1" /> 
    
          <category android:name="android.intent.category.DEFAULT" /> 
         </intent-filter> 
        </activity> 
    
        <activity 
         android:name="com.company.installer.redirect" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
    
          <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter> 
        </activity> 
    </application> 
    
    </manifest> 
    

risposta

11

Inserire lo stesso elemento <permission> in entrambe le app. Inoltre, poiché questo è specifico per le tue due app, vorrei utilizzare android:protectionLevel="signature" anziché normal - questo significa che l'utente non avrà mai bisogno di approvare l'autorizzazione e nessun altro sarà in grado di richiedere l'autorizzazione. E questa ricetta consentirà l'installazione in entrambi gli ordini.

UPDATE: nota, tuttavia, che l'utilizzo delle autorizzazioni personalizzate si apre potential vulnerabilities, due to Android's "first one in wins" approach.

UPDATE # 2: E questo è ora no longer supported as of Android 5.0, come due applicazioni non entrambi possono avere lo stesso <permission> elemento a meno che non sono firmate con la stessa chiave di firma.

+1

Questo ha fatto il trucco. Grazie! –

+4

Problema: se la prima applicazione installata specifica e per la stessa autorizzazione, l'utente non viene informato della richiesta di autorizzazione al momento dell'installazione. Dopo aver installato la seconda app, la prima app può accedere ai componenti della seconda app che richiedono tale autorizzazione. Grande problema di sicurezza? –

+0

@MarkCarter: l'utente sicuramente non verrà richiesto per le autorizzazioni a livello di 'firma'. Tuttavia, ciò non dipende in realtà dall'ordine di installazione; Le autorizzazioni a livello di firma non vengono mai visualizzate. Poiché le autorizzazioni a livello di firma sono per codice scritto da uno sviluppatore (o un team), l'assunto è che queste autorizzazioni controllino le quantità di aggregazione delle comunicazioni interne e l'utente non deve essere disturbato. Se, tuttavia, stai vedendo il tuo comportamento descritto con le autorizzazioni personalizzate 'normal' o' dangerous', questo mi sorprenderebbe e avrei bisogno di fare ulteriori ricerche. – CommonsWare

2

Sono stato in grado di aggirare il problema @CommonsWare menzionato nel suo aggiornamento n. 2. Semplicemente da solo dichiarando il permesso nell'app che verrà installata per prima.

Spiegazione: Ho app A e app B, firmate con diverse firme. L'app A deve utilizzare l'app B per accedere, ma l'app A viene installata per prima e si assicura che l'utente installa l'app B.

Poiché l'app B sembra essere il servizio (di accesso), ho dichiarato l'autorizzazione personalizzata nell'app B. App B ha un servizio (intento) che altre app possono utilizzare, purché utilizzino il permesso e siano nella nostra lista bianca. Quindi l'app B ha dichiarato il servizio e l'autorizzazione.

Ma poiché l'app A è installata prima della scoperta della BI dell'app, dovevo aggiungere anche l'autorizzazione all'app A. In caso contrario, l'app A non sembrava avere il permesso dopo l'installazione dell'app B. La mia ipotesi migliore è che questo sia dovuto al fatto che le informazioni sui permessi sono fatte al momento dell'installazione. E poiché l'app A non ha dichiarato il permesso, al momento dell'installazione non è successo nulla. Ma poi viene installata l'app B che ha il permesso ma l'app A continua a non ricevere questa autorizzazione.

Ma poi ho provato su Android 5 e ho eseguito le loro uniche modifiche ai permessi.Così ho testato alcuni flussi e dichiarazioni di autorizzazione e ho trovato una soluzione funzionante: Dichiarare l'autorizzazione personalizzata nell'app che viene installata per prima! Ovviamente questo funziona solo quando sai quale applicazione verrà installata per prima. Ma nel mio caso, dove l'app A dipende dall'app B e dall'app A installa l'app B, questa era la soluzione :)