2015-11-20 8 views
6

Ho pubblicato un'app con 2 Build Flavors: una versione "normale" che include annunci e una versione senza pubblicità.Flavor multipli con e senza pubblicità (nuova politica per gli sviluppatori di Google)

Nella Console per gli sviluppatori di Google Play ora devi contrassegnare la tua app se utilizza annunci. Questo è ok per la versione normale, ma la versione senza pubblicità utilizza le stesse dipendenze della versione pro (in particolare i servizi di Google Play). Quindi ricevo un avviso quando imposto questa versione per la pubblicità senza annunci perché sono stati trovati annunci pubblicitari.

È possibile modificare le dipendenze in base al sapore di gradle build?

build.gradle:

android { 
    (...) 
    productFlavors { 
     lite { 
      signingConfig signingConfigs.Release 
      versionCode 14 
      versionName '1.1.5' 
      buildConfigField "boolean", "IS_PRO", "false" 
     } 
     pro { 
      applicationId 'com.example.exampleadfree' 
      signingConfig signingConfigs.Release 
      targetSdkVersion 21 
      versionCode 14 
      versionName '1.1.5' 
      buildConfigField "boolean", "IS_PRO", "true" 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:21.0.3' 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:cardview-v7:21.0.2' 
    compile 'com.google.android.gms:play-services:6.1.+' 
    compile project(':libraries:SharedItems') 
    compile 'com.android.support:recyclerview-v7:21.0.2' 
} 
+0

Credo che si possa usare flavorNameCompile per una dipendenza specifica di sapore. Nel tuo caso, potresti aggiungere un 'liteCompile "" – cwbowron

+0

Sei sicuro che Google stia controllando quali librerie sono nella tua app? Dichiari l'AdActivity nel tuo AndroidManifest nella versione a pagamento? –

risposta

7

È possibile modificare

compile 'com.google.android.gms:play-services:6.1.+' 

a

liteCompile 'com.google.android.gms:play-services:6.1.+' 

e che includerà il lib Play Services solo con la tua versione lite.

Ma non hai finito, perché ora il codice nella tua app che crea l'AdView e le classi correlate dalla libreria dei servizi di riproduzione non verrà compilato quando crei la versione pro.

La mia soluzione in una situazione simile (con la libreria di fatturazione) era quella di spostare tutto il codice che fa riferimento alla libreria esclusa e alle classi correlate a un file sorgente che è anche costruito solo con il gusto lite, e quindi fornire un manichino implementazione per la versione pro che non si riferisce alla libreria.

Ad esempio, creare due directory src specifici sapore con lo stesso nome di classe java in ciascuna:

src/lite/java/com/example/myapp/util/AdUtil.java 
src/pro/java/com/example/myapp/util/AdUtil.java 

Nella versione lite di AdUtil, è possibile effettuare chiamate ai servizi Google Play e ottenere un AdView per tornare:

View getAdView(...) 
{ 
    View adView = new AdView(...); 
    adView.setAdSize(...); 
    adView.setAdUnitId(...); 
    ... 
    return adView; 
} 

e nella versione pro di quella classe, si può semplicemente mettere un'implementazione fittizio che non fa riferimento ai servizi di gioco lib:

View getAdView(...) 
{ 
    return null; 
} 

Quindi nel codice dell'app principale, quando si chiama AdUtil.getAdView(), si otterrà una vista nella versione lite che è possibile posizionare sullo schermo. Nella versione pro otterrai un valore nullo, quindi salterai l'aggiunta della vista (ma probabilmente stai già controllando se sei pro o lite prima di provare a creare l'adview in primo luogo).

1

Quando un progetto dichiara Sapori del prodotto, quali della durata la configurazione principale.

Da here. Quindi, Product Flavors aggiunge in modo efficace nuove configurazioni per ogni gusto dichiarato. In gradle è possibile aggiungere dipendenze specifiche per una configurazione. Ad esempio,

dependencies { 
    <configname> <dependency> 
} 

Se si desidera elencare tutte le configurazioni che il progetto ha aggiunto:

configurations.findAll().each{println "$it.name"} 

Nel caso se il progetto si vedrà configurazioni che hanno lo stesso nome come il vostro prodotto sapori. Così come @cwbowron commentato, per aggiungere una dipendenza in fase di compilazione per il sapore lite:

dependencies { 
    liteCompile <dependency> 
} 
0

Dalla chat di assistenza di Google Play mi sono rivolto a dire "No" in Google Play Console, nonostante il rilevamento. Quindi non ci dovrebbero essere problemi nell'includere le librerie di Google.

D'altra parte, la risposta di Doug è elegante.

Cordiali saluti,

Problemi correlati