2015-04-21 9 views
14

Sto cercando di creare un file AAR per un progetto Android di libreria utilizzando Android Studio e gradle.Come escludere un file da un archivio di libreria Android .AAR con gradle

Desidero escludere dall'archivio cartelle e file specifici ma non riesco a trovare una soluzione funzionante.

Il progetto ha 2 sapori.

app/ 
|--libs/ 
|--src/ 
    |--flavour1/ 
    | |--java/ 
    |  |--a1/ 
    |  | |--class_File1.java 
    |--flavour2/ 
    | |--java/ 
    |  |--a1/ 
    |  | |--class_File1.java 
    |--main/ 
     |--java/ 
     | |--... 
     |--res/ 
     | |--raw/ 
     | | |--comments.txt 
     | |--... 
     |--AndroidManifest.xml 

e io uso un file build.gradle come questo

apply plugin: 'com.android.library' 

android { 
compileSdkVersion 21 
buildToolsVersion "21.1.2" 

defaultConfig { 
    minSdkVersion 10 
    targetSdkVersion 21 
} 
packagingOptions { 
    exclude 'assets' 
    exclude '**/comments.txt' 
} 


sourceSets { 

     flavour1 { 
      resources { 
       exclude '**/comments.txt' 
      } 
     } 
     flavour2 { 

     } 

} 

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 

productFlavors { 

    flavour1 { 

     packagingOptions { 
      exclude 'assets' 
      exclude 'res/raw/comments.txt' 
     } 
    } 
    flavour2 { 
    } 
} 
} 

dependencies { 
compile 'com.google.android.gms:play-services:+' 
} 

In generale ho sperimentato molto. Ho provato packagingOptions, esclusione in sourceSets ma niente sembra funzionare. Quello che sto cercando di ottenere non è includere, ad esempio, nell'archivio .ARAR il file comments.txt e la cartella "assets" che è una cartella opzionale. Esaminerò ogni volta il file .ARR rinominandolo per zip e esaminando i file inclusi.

Ho anche esaminato la documentazione qui: http://simpligility.github.io/android-maven-plugin/aar-mojo.html#configurations dove forse le configurazioni potrebbero essere una soluzione, ma non sono sicuro di come usarlo o come andare avanti. Qualsiasi aiuto sarà apprezzato.

+0

Desiderate solo che vengano rimossi da un determinato aroma o per ogni build? – Mike

+0

Immagino che entrambi i casi saranno utili per sapere come. – andreasv

risposta

3

Problema relativo al problema this. In generale si potrebbe provare con:

  • set Fonte esclude
  • opzioni di packaging
  • opzioni
  • aapt

non ho potuto ottenere uno di loro di lavorare comunque.

Detto questo, si potrebbe creare alcuni hack brutto come questo:

def filterVariant = { variantToFilter, filterTask-> 
     def vv = android.sourceSets."${variantToFilter}".res.srcDirs 
     println "${variantToFilter} --> ${vv*.toString()}" 

     def variantRes = android.sourceSets."${variantToFilter}".res 
     variantRes.srcDirs.each{ resDir-> 
      def filterOutput = "${buildDir}/res-filter" 
      if (resDir.toString().contains(filterOutput)) { 
       return 
      } 

      println "begin filter ${resDir} to ${filterOutput}/${variantToFilter}" 

      filterTask.from fileTree(dir: resDir, exclude: '**/comment.txt') 
      filterTask.into "${filterOutput}/${variantToFilter}" 


      variantRes.srcDirs = ["${filterOutput}/${variantToFilter}"] 
     } 
    } 

    project.task('filterMainResources', type: Copy) { 
     filterVariant 'main', it 
    } 

    android.libraryVariants.all{ variant -> 
     project.task("filter${variant.name}Resources", type: Copy) { filterTask -> 
      filterVariant "${variant.name}", filterTask 
      filterTask.dependsOn "filterMainResources" 
     } 
     variant.mergeResources.dependsOn("filter${variant.name}Resources") 
    } 
+0

Ciao Samuil, grazie per la tua risposta. Questa soluzione ha funzionato. Ho solo dovuto cambiare la riga: filterTask.from fileTree (dir: resDir, exclude: 'raw/comments.txt') per specificare che il file era nella cartella raw poiché ** non funzionava. Grazie! – andreasv

0

non posso provare in questo momento, ma questo sarebbe probabilmente il mio approccio:

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     aidl.srcDirs = ['src'] 
     resources.srcDirs = ['src']   
     renderscript.srcDirs = ['src'] 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
    } 

    flavor1 { 
     java.srcDirs = ['src/main/java', 'src/flavor1/java']   
     res.srcDirs = ['src/flavor1/res'] //this differs from your structure 
     assets.srcDirs = [] 
    } 

    flavor2 { 
     java.srcDirs = ['src/main/java', 'src/flavor2/java'] 
     res.srcDirs = ['src/flavor2/res'] //this differs from your structure 
     assets.srcDirs = ['src/main/res/raw'] 
    } 
} 

Ancora una volta, ho non potrei provarlo, quindi questa potrebbe essere una totale assurdità. L'idea era di non escludere roba, ma includere solo i file/le dir che vuoi nel tuo gusto. Questo potrebbe portare alla duplicazione di file/cartelle per gusto!

Come fonti mi sento di raccomandare: Gralde Plugin User Guide, answer from Xavier Ducrohet e anche questo Gradle + Android, want to overwrite /assets with custom folder in buildFlavor.

+0

Ciao SateliteSD, grazie per la risposta, ma non sono sicuro di come risponda alla domanda. Ad esempio nel codice che hai fornito come faccio a mantenere la cartella res/raw ma escludo un file specifico da esso, ad esempio comments.txt come indicato nella domanda? Dalla mia comprensione stai solo specificando dove cercare src, assets e res nei diversi gusti, nient'altro che non è in realtà il problema qui dato che con la struttura dei sapori del progetto guardiamo alle cartelle giuste durante il tempo di costruzione. – andreasv

Problemi correlati