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.)
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'
}
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'
}
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 .
XML
dans votre projet avec une balise <resources>
.tools:keep="[list resources]"
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" />
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