web-dev-qa-db-ja.com

Android Studio gradle buildsから特定のファイルを除外するには?

私はAndroid Studio with Google Driveを使用しています。これにより、隠しシステムファイル(Iconや_desktop.ini_など)が表示され、説明されているようにエラーが発生します here 。これらのファイルを削除するスクリプトを実行するのではなく、gradle 2.14に無視するよう指示します。

ファイルを除外する方法を見つけようとして、ディレクトリ_\app\src\main\res\values_および_\app\src\main\Java\com\hfad\stopwatch\_に「excludeme.txt」という名前のファイルを作成しました。プロジェクトの2つの_build.gradle_ファイルにさまざまな変更を試みましたが失敗しました。ファイルは正常に除外されませんでした。

具体的には、 この質問 ごとに_build.gradle_の_Module: app_ファイルに次の変更を加えました。

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

この質問 ごとに、これを同じ_build.gradle_ファイルのAndroidセクションにも追加しました。

_aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}
_

私も追加しました:

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

ビルドをトリガーした_Build > Clean Project_を選択すると、次の出力が得られました。これは、resourcesフォルダー内のファイルが無視されなかったことを示しています。

_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.
_

感嘆符を削除した場合、結果は同じでした:

_aaptOptions {
    ignoreAssetsPattern "!excludeme.txt"
}
_

Androidプロジェクトをビルドするときに、特定のパターンを含むファイルを無視するようにgradleに適切に指示するにはどうすればよいですか?

アップデート1

以下のStefanの提案に従って、_build.gradle_の_Module: app_ファイルに次を追加しました。

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

_whatever.txt_という名前のファイルを_res/layout_ディレクトリに追加しましたが、ビルドは次のように失敗しました:

_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
_

更新2

ネイサンの提案に従って、私は追加しました:

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

Androidセクションのbuild.gradle (Module: app)に。改善なし:

_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
_

(この最後のビルドは、Windows上にある他のものとは異なり、Mac上にありました。)

13
Ellen Spertus

Gradleの最近の変更によりsourceSetsのDSLが変更されたように見えるため、フィルターフィールドでexcludeを指定する必要があります。

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

AndroidプラグインにはSourceSetsの独自の概念があります: http://tools.Android.com/tech-docs/new-build-system/user-guide#TOC-Configuring -the-Structure

だからあなたはおそらく次のようなことをしたいと思うでしょう

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

子プロジェクトでは、あなたの場合、:APPであると思いますが、build.gradleファイルに以下を追加します。

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

PackagingOptions DSLオブジェクト を使用すると、APKに含めるファイルを制御できます。 excludeは、名前またはパターンでファイルまたはディレクトリを無視できるようにする引数として文字列またはパターンを取ります。

[〜#〜] edit [〜#〜]Android Studio docs から保持するリソースをカスタマイズします。

  1. プロジェクトで<resources>タグを使用してXMLファイルを作成します。
  2. tools:keep="[list resources]"を追加
  3. `tools:discard =" [list resources] "を追加します
  4. res/raw/keep.xmlのプロジェクトリソースにファイルを保存します。ビルドにはこのファイルは含まれません。

終了ファイルは、 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

キーボードに対して頭を強く叩いた後、これは私のために働いた:

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.クレジット: gradleで現在のフレーバーを取得する方法 getCurrentFlavorメソッドを記述するため、

0
user330844