2015-04-21 14 views
14

Próbuję utworzyć plik AAR dla projektu biblioteki Android za pomocą Android Studio i gradle.Jak wykluczyć plik z archiwum biblioteki .AAR Android o gradle

Chcę wykluczyć z tego archiwum określone foldery i pliki, ale nie mogę znaleźć działającego rozwiązania.

Projekt ma 2 smaki.

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

i używam plik build.gradle jak ten

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:+' 
} 

Generalnie mam eksperymentował dużo. Próbowałem packageOptions, exclusion w sourceSets, ale nic nie działa. To, co próbuję osiągnąć, nie obejmuje na przykład w archiwum .AAR pliku comments.txt i folderu "assets", który jest folderem opcjonalnym. Za każdym razem sprawdzam plik .AAR, zmieniając jego nazwę na zip i przeglądając zawarte w nim pliki.

Zajrzałem również do dokumentacji tutaj: http://simpligility.github.io/android-maven-plugin/aar-mojo.html#configurations gdzie konfiguracje mogą być rozwiązaniem, ale nie jestem pewien, jak z niego korzystać lub jak iść naprzód. Każda pomoc zostanie doceniona.

+0

Czy chcesz, aby zostały usunięte z określonego smaku lub dla każdej kompilacji? – Mike

+0

Sądzę, że oba przypadki będą pomocne, aby wiedzieć, jak. – andreasv

Odpowiedz

3

Pomyśl, że jest to związane z numerem this. Generalnie można spróbować z:

  • zestaw Źródło wyklucza
  • opcji pakowania
  • opcji
  • aapt

nie mogłem dostać jeden z nich do pracy, choć.

Powiedział, że można dokonać pewnych brzydkie hacki tak:

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

Witaj Samuil, dziękuję za odpowiedź. To rozwiązanie działało. Musiałem tylko zmienić wiersz: filterTask.from fileTree (dir: resDir, wyklucz: "raw/comments.txt"), aby określić, że plik był w katalogu raw, ponieważ ** nie działał. dzięki! – andreasv

0

Nie mogę spróbować go teraz, ale to będzie prawdopodobnie moje podejście:

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'] 
    } 
} 

Znowu nie mogłem tego wypróbować, więc może to być kompletna bzdura. Pomysł polegał na tym, aby nie wykluczać rzeczy, ale zawierały tylko pliki/katalogi, które chcesz w swoim smaku. Może to doprowadzić do powielenia plików/folderów na smak!

Jako źródła polecam: Gralde Plugin User Guide, answer from Xavier Ducrohet, a także ten Gradle + Android, want to overwrite /assets with custom folder in buildFlavor.

+0

Witaj SateliteSD, dziękuję za odpowiedź, ale nie jestem pewien, w jaki sposób odpowiada na pytanie. Na przykład w podanym kodzie jak zachować folder res/raw, ale wykluczyć z niego określony plik, na przykład comments.txt, jak podano w pytaniu? Z mojego punktu widzenia właśnie określasz, gdzie szukać src, atrybuty i res w różnych smakach, nic więcej, co w rzeczywistości nie jest problemem, ponieważ struktura smaków projektu wygląda na właściwe foldery w czasie kompilacji. – andreasv

Powiązane problemy