2015-03-06 15 views
15

jestem importowania android biblioteki w aplikacji zbudowanej z Gradle, tak:wydziela aktywów za zwolnienie typu build

dependencies { 
    compile 'com.example:great-lib:0.1-SNAPSHOT' 
} 

Ta biblioteka zawiera tylko aktywa, JS, CSS i obrazy, aby być stosowany w WebView , z układem tak:

assets/ 
|-> great.css 
|-> great.min.js 
|-> great.min.js.map 
|-> js/ 
| |-> plop.js 
| |-> foo.js 
| ... 
|-> img/ 
| ... 

Folder js zawiera pliki źródłowe (do wykorzystania z mapami źródłowych). Chciałbym dołączyć to i plik .map do kompilacji debugowania i mam tylko miniony js w kompilacjach wydań, ale nie mogę znaleźć sposobu, aby to zrobić.

Do tej pory próbowałem:

android { 
    // this doesn't exclude anything 
    packageOptions { 
     exclude 'assets/js' 
    } 
    buildTypes { 
     release { 
      // this does exclude the js folder, but in both release and debug 
      aaptOptions { 
       ignoreAssetsPattern "!js" 
      } 
     } 
    } 
} 

Każdy pomysł, jeśli to, co chcę, możliwe jest osiągnięcie, a jeśli tak, to w jaki sposób?

(ja też myślałem publikowania dwie wersje biblioteki (great-lib i great-lib-debug), i zależność w debugCompile i releaseCompile, ale wolałbym uniknąć tego i opublikowanie jednej wersji)

Odpowiedz

9

I skończyło się w następujący sposób:

android.applicationVariants.all { variant -> 

    if (variant.name.contains('Release')) { 
    // exclude source and sourcemap from release builds 
    def noJsSourceTask = task("delete${variant.name}JsSource", type: Delete) { 
     delete "${buildDir}/intermediates/assets/${variant.dirName}/js" 
     delete "${buildDir}/intermediates/assets/${variant.dirName}/great.min.js.map" 
    } 
    variant.mergeAssets.finalizedBy noCeJsSourceTask 
    } 
} 

to działa ok, ale jest kilka rzeczy, których nie lubię:

  • Dotyka plików wygenerowanych przez zadanie po jego zakończeniu (finalizedBy), więc nie działa dobrze z "aktualnym" sprawdzaniem. Ale to tylko w przypadku wersji wydań, robię debugowania częściej
  • ścieżka do plików do usunięcia jest ręcznie budowana. Nie jestem pewien, czy jest on wystarczająco ogólny, aby można go było ponownie wykorzystać w innych projektach - jest to
  • Wybieram warianty na podstawie ich nazwy. Chciałbym mieć coś bardziej uporządkowanego.
+1

Dziękujemy za udostępnienie rozwiązania! Wciąż mam nadzieję na rozwiązanie, które jest mniej kłopotliwe/kruche. –

1

Myślę, że można użyć proguard. Proguard jest dostępny w studiu android, zaciemnij kod i usuń nieużywane klasy, a jeśli chcesz usunąć wszystkie zasoby, których nie używasz. Tylko umieścić w swoim build.gradle to:

release { 

      minifyEnabled true //remove classes, obfuscate code and zipalign 
      shrinkResources true //remove resources 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//autogenerated files 
     } 

To powiązanie informacji o tym:

można personalizować, wykluczyć poszczególne pliki lub zignorować poszczególnych plików

+0

Dziękujemy za sugestię użycia proguard. Korzystam już z proguard, ale nie mogę znaleźć żadnej dokumentacji o używaniu go do usuwania/nieuwzględniania konkretnych plików. Czy mógłbyś to sprecyzować? –

+0

Tak, powinieneś aktywować shrinkResources w gradle.build, to powinno usunąć wszystkie zasoby nieużywane w projekcie, to powinno usunąć wszystkie pliki js, ponieważ zachowaj niektóre zasoby, które powinieneś utworzyć plik xml, wewnątrz tego pliku określ jakie pliki lub zasoby przechowują z usunięcia. w tym [link] (http://tools.android.com/tech-docs/new-build-system/resource- shrinking) w sekcji KeepResources. Potem powinieneś się dobrze przetestować, rozwinąć jego skomplikowaną konfigurację i zrozumieć. Mam nadzieję, że to ci pomoże – encastellano

+0

Mam już aktywowane 'shrinkResources'. Nie usuwa zasobów, których nie chcę, ponieważ biblioteka, której używam, używa tych plików. Jednak nie używam tej części biblioteki, więc mogę i chcę się bez nich obejść. –

0

Nie jest to możliwe przez filtr.

Możesz mieć jednak dwa foldery zasobów. główny (src/main/assets) używany zarówno dla debug i release i jeden (src/debug/assets) używany tylko do kompilacji debugowania.

source

+0

Witam, to nie jest opcja dla mnie, ponieważ niechciane zasoby są w bibliotece, której używam. –

1

Gradle zapewnia "aaptOptions, ignoreAssetsPattern" filtrować/wykluczyć foldery i pliki aktywa z uwolnienia lub debugowania kompilacji.

Przykład debugowania (js folderu i great.css pliki):

debug {    
     aaptOptions { 
      ignoreAssetsPattern '!js:!great.css:' 
     } 
    } 

przykładu dla kompilacji uwalniania (js folderu i great.css plików):

release { 
     aaptOptions { 
      ignoreAssetsPattern '!js:!great.css:' 
     } 
    } 
+0

Czy próbowałeś tego? Dla mnie to nie zadziałało. – DenisGL

+0

Tak, działa dla mnie. –

+1

https://code.google.com/p/android/issues/detail?id=224167 – ecdpalma

9

miałem powodzenia z takim podejściem:

applicationVariants.all { variant -> 
    if (variant.buildType.name == 'release') { 
     variant.mergeAssets.doLast { 
      delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/js', '**/*.js.map'])) 
     } 
    } 
} 

To powinno rozwiązać problemy z odpowiedzią @ Xaviera:

  • Usunięcie odbywa się w ramach wariantu za mergeAssets zadania tak delecja znajduje odzwierciedlenie w wydajności zadanie i up-to-date kontrola powinna być nienaruszona.
  • Ścieżki są obliczane bez ciągów magicznych. Być może konieczne będzie dostosowanie wzorów włączania w przypadku, gdy mój przykład jest zbyt liberalny.
  • Wariant jest wybierany za pomocą nazwy buildType, co jest mniej problematyczne niż dopasowanie nazwy całego wariantu (choć jest nadal wpisywane w sposób ciągły).

Należy zauważyć, że takie podejście działa również dla res plików zamiast assets: wystarczy wymienić mergeAssets z mergeResources.

Inne odpowiedzi przywołujące i aaptOptions są szczekanie na złe drzewo, ponieważ są one zawężona do wszystkie warianty (są one zdefiniowane w zakresie android, nie buildType lub productFlavor).

+0

Działa jak urok! – Idolon

+0

Czy można to zrobić wewnątrz wariantów. Outputs.każdy? I sprawdź architekturę wyjściową? –

+1

Warto wspomnieć, że ten kod przechodzi przez sekcję 'buildTypes', która znajduje się w sekcji' android' pliku build.gradle twojej aplikacji. – Drarok

Powiązane problemy