web-dev-qa-db-fra.com

Comment exclure certains fichiers de la compilation Android Studio?

J'utilise Android Studio avec Google Drive, ce qui rend visibles les fichiers système masqués (tels que Icon et desktop.ini), provoquant des erreurs, comme décrit ici . Plutôt que d'exécuter des scripts pour supprimer ces fichiers, je voudrais demander à Gradle 2.14 de les ignorer.

Pour tenter de comprendre comment exclure des fichiers, j'ai créé des fichiers nommés "excludeme.txt" dans les répertoires \app\src\main\res\values et dans \app\src\main\Java\com\hfad\stopwatch\. J'ai essayé sans succès diverses modifications sur les deux fichiers build.gradle de mon projet. Aucun avec succès exclu le fichier.

Plus précisément, j'ai apporté la modification suivante au fichier build.gradle pour Module: app, par cette question :

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'], excludes: ['**/excludeme.txt'])
                                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12' 
}

J'ai également ajouté ceci à la section Android du même fichier build.gradle, par cette question :

aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}

J'ai aussi ajouté:

sourceSets {
    main {
        Java {
            srcDir "src"                [I also tried w/o this line]
            exclude "**/excludeme.txt"
        }
    }
}

Lorsque j'ai sélectionné Build > Clean Project, qui a déclenché une construction, j'ai obtenu cette sortie, qui indique que le fichier dans le dossier des ressources n'a pas été ignoré:

Information:Gradle tasks [clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources]
C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt
Error:(1, 1) Error: Premature end of file.
Error:Execution failed for task ':app:mergeDebugResources'.
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt:1:1: Error: Premature end of file.

Les résultats étaient les mêmes si je supprimais le point d'exclamation:

aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}

Comment ordonner à Gradle d'ignorer les fichiers contenant un certain motif lors de la création de projets Android?

Mise à jour 1

Selon la suggestion de Stefan ci-dessous, j'ai ajouté ce qui suit dans le fichier build.gradle pour Module: app:

Android {
    [omitted]
    sourceSets.main.res.exclude '**/whatever.txt'
}

J'ai ajouté un fichier nommé whatever.txt dans le répertoire res/layout et la construction a échoué avec:

Error:Execution failed for task ':app:mergeDebugResources'.
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Starbuzz\app\src\main\res\layout\whatever.txt: Error: The file name must end with .xml

Mise à jour 2

Par suggestion de Nathan, j'ai ajouté:

packagingOptions {
    exclude '**/whatever.txt'
    exclude 'src/main/res/layout/whatever.txt'
}

à build.gradle (Module: app) dans la section Android. Pas d'amélioration:

Information:Gradle tasks [:app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources]
/Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt
Error:Error: The file name must end with .xml
Error:Execution failed for task ':app:mergeDebugResources'.
> /Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt: Error: The file name must end with .xml
Information:BUILD FAILED

(Cette dernière version était sur un Mac, contrairement aux autres, qui étaient sur Windows.)

11
Ellen Spertus

On dirait qu'une récente modification de gradle a modifié la DSL pour sourceSets. Vous devez donc maintenant spécifier l'exclusion sur le champ de filtre:

Android {
    sourceSets.main.res.filter.exclude '**/whatever.txt'
}
2
Diarrhio

Le plugin Android a son propre concept de SourceSets: http://tools.Android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure

Donc, vous voudrez probablement faire quelque chose comme

Android {
    sourceSets.main.res.exclude '**/whatever.txt'
}
0
Stefan Oehme

Dans votre projet enfant, dans votre cas, j’estime que c’est :APP, ajoutez ce qui suit dans le fichier build.gradle

packagingOptions {
    //Exclude the file(s) in this method. Provide the path and file name.    
    exclude 'src\main\res\layout\whatever.txt' 
}

L'objet DSL de PackagingOptions vous permet de contrôler les fichiers inclus dans la variable APK. exclude prend comme argument une chaîne ou un motif qui vous permettra d'ignorer les fichiers ou les répertoires par leur nom ou leur motif. 

EDIT Personnalisation des ressources à conserver à partir de Documents Android Studio .

  1. Créez un fichier XML dans votre projet avec une balise <resources>.
  2. Ajouter tools:keep="[list resources]" 
  3. Ajoutez `tools: discard =" [liste des ressources] "
  4. Enregistrez le fichier dans les ressources du projet à res/raw/keep.xml La construction n'inclura pas ce fichier.

Le fichier de fin doit ressembler à celui de Android Studio Docs

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.Android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />
0
Nathan

Après avoir beaucoup taper la tête contre le clavier, cela a fonctionné pour moi:

apply plugin: 'com.Android.library'

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find())
        return matcher.group(1).toLowerCase()
    else {
        println "NO MATCH FOUND"
        return "";
    }
}

Android {
.
.
.
    sourceSets {
            main {
                if (getCurrentFlavor() == 'stripped') {
                    Java.exclude('**/excluded1.Java',
                    .
                    .)
            }
            Java {
              srcDir 'main'
            }
          }
        } 
     }         

N.B. Crédit pour: Comment obtenir la saveur actuelle dans les notes Pour écrire la méthode getCurrentFlavor

0
user330844