2014-11-12 10 views
6

Attualmente sto lavorando a un'applicazione che dispone di 5 sapori e questa è la parte dei miei file build.gradle che conta:Gradle: Come creare due applicazioni per ciascuna variante con attività diverse cartelle:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.14.0' 
    } 
} 

apply plugin: 'com.android.application' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 20 
    buildToolsVersion '20.0.0' 

    signingConfigs { 
     release { 
      storeFile file("") 
      storePassword "password" 
      keyAlias "alias" 
      keyPassword "password" 
     } 
    } 

    lintOptions { 
     abortOnError false 
    } 

    defaultConfig { 
     minSdkVersion 14 
     targetSdkVersion 20 

     applicationId 'application.package' 
     signingConfig signingConfigs.release 
    } 

    buildTypes { 
     release { 
      signingConfig signingConfigs.release 
     } 
    } 

    productFlavors { 
     flavor1{ 
      applicationId 'com.flavor1.package' 
     } 
     flavor2{ 
      applicationId 'com.flavor2.package' 
     } 
     flavor3{ 
      applicationId 'com.flavor3.package' 
     } 
     flavor4{ 
      applicationId 'com.flavor4.package' 
     } 
     flavor5{ 
      applicationId 'com.flavor5.package' 
     } 
    } 
} 

dependencies { 
    compile project(':SDK') 
} 

Ho dovuto apportare alcune modifiche al file, ma in fondo è questo.

La domanda: Ho un obbligo di fornire per ciascuno di questi sapori un diverso insieme di file di risorse nella cartella degli asset che creerà un file apk differente ma avrà lo stesso nome di pacchetto. Questi file apk verranno caricati su Google Play come la stessa applicazione, ma per regioni diverse. Quindi il nome del pacchetto deve rimanere lo stesso. Quindi, in sostanza, ho bisogno di creare un meccanismo che invece di 5 sapori creerà 10 sapori quando ognuno di essi ha lo stesso nome di pacchetto ma una diversa cartella di risorse. Come si può fare usando gradle?

ho cercato attuare questo utilizzando BuildTypes in questo modo:

buildTypes { 
    release { 
     signingConfig signingConfigs.release 
     sourceSets.main.assets.srcDirs = ['assets'] 
    } 
    releaseAlt { 
     signingConfig signingConfigs.release 
     sourceSets.main.assets.srcDirs = ['assetsalt'] 
    } 
} 

Ma per qualche motivo il releaseAlt prende anche i file che si trovano nella directory di attività e non la directory assetsalt. Qualcuno potrebbe indicarmi la giusta direzione riguardo a questo? Grazie in anticipo.

risposta

15

È possibile utilizzare buildTypes per questo.

buildTypes { 
    release { 
    // ... the usual stuff here 
    } 
    releaseAlt { 
    // .. the usual stuff here too like signing config etc... 
    } 
} 

Ora la gerarchia di file:

si dovrebbe avere

project/ 
- app/ 
- src/ 
    - main/ 
    - assets/ 
    - logo.png // Generic assets go here 
    - java/ 
    - res/ 
    - ... 

    - flavor1/ 
    - assets/ 
    - logo.png // Specific assets for all the flavor1 Variants 

    - releaseAlt/ 
    - asset/ 
    - logo.png // Specific assets for all the releaseAlt Variants. 

    - flavor1ReleaseAlt/ 
    - assets/ 
    - logo.png // very specific assets for the flavor1ReleaseAlt Variant 
- SDK/ 

Con questa gerarchia di file, quando si genera la variante flavor1Release, si avrà il file logo.png da flavor1/assets/, ma quando costruirai la variante flavor1ReleaseAlt, questa png verrà sostituita dalla cartella on flavor1ReleaseAlt/assets/.

Spiegazione:

Gradle sta usando le convenzioni sulle configurazioni (per impostazione predefinita). Soprattutto quando si tratta di struttura del progetto. Quando viene creata la variante flavor1ReleaseAlt, Gradle (il plug-in Android in realtà;)) sta cercando una cartella denominata flavor1ReleaseAlt/con alcune risorse, risorse, java ecc. All'interno. Queste sono le risorse di app più specifiche che Gradle potrebbe trovare per questa variante. Quindi Gradle cercherà una cartella chiamata semplicemente flavor1/per alcune risorse di app meno specifiche. Quindi in una cartella ancora meno specifica chiamata releaseAlt/e infine nella cartella generica (main /).

Le diverse cartelle devono avere nomi molto rigorose al fine di corrispondere la ricerca Variante:

  • flavorBuildType /. (l'ordine è importante).
  • sapore/
  • buildtype/
  • principale/

Spero che questo aiuti.

+0

Grazie per il vostro aiuto, ma speravo in una soluzione in cui non avrei dovuto creare di nuovo un intero sapore per un'applicazione con lo stesso pacchetto, ma per fornire lo stesso sapore con una directory di risorse diversa per creare due apk che l'unica differenza tra loro è questa cartella delle risorse. Pensi che questo possa essere fatto senza creare il sapore del sapore? –

+1

Non è necessario creare un nuovo sapore. In Android Gradle, il concetto di sapore è legato al concetto di Variante. Una variante è BuildType + Flavor. Ad esempio, se hai un debug buildType e un flavor Flavor1, la variante completa è flavor1Debug. Con la mia soluzione, stai usando un buildType personalizzato per avere più varianti sugli stessi sapori. Devi solo definire un nuovo BuildType e tutti i tuoi Flavori già definiti avranno una nuova Variante. – pdegand59

+0

Con Gradle, la gerarchia delle cartelle è basata su Variant. Se sai che ogni Flavor condivide le stesse risorse per il BuildType di ReleaseAlt, puoi semplicemente aggiungere una nuova cartella 'releaseAlt/assets /' e inserire tutte le tue risorse alternative all'interno. Modifica della risposta – pdegand59

Problemi correlati