lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Gradle のヒントと手法

Gradle と Android プラグインを使用すると、Android アプリやライブラリを柔軟にコンパイル、ビルド、およびパッケージ化できます。このページでは最適なビルドを実施するための有用な情報や設定をご紹介します。ビルドを高速化するための詳しい情報については、ビルド速度の最適化をご覧ください。

Gradle を初めて利用する方は、ビルドの設定で基本的な内容を学ぶことができます。このページで使用しているプロパティの詳細は、Android プラグインの DSL リファレンス ドキュメントでもご覧いただけます。

プロジェクトとソースの管理

ここではプロジェクトのモジュールとそのソースを管理するための設定をご紹介します。プロジェクトとモジュールの作成や管理に関する詳細は、プロジェクトの概要をご覧ください。

デフォルト ソースセットの設定の変更

モジュール レベルの build.gradle ファイル内の sourceSets ブロックでは、Gradle がソースセットの各コンポーネントのファイルを収集するためにチェックする場所を変更できます。

android {
  ...
  sourceSets {
    // Encapsulates configurations for the main source set.
    main {
      // Changes the directory for Java sources. The default directory is
      // 'src/main/java'.
      java.srcDirs = ['other/java']

      // When you list multiple directories, Gradle uses all of them to collect
      // sources. You should avoid specifying a directory which is a parent to one
      // or more other directories you specify.
      res.srcDirs = ['other/res1', 'other/res2']

      // For each source set, you can specify only one Android manifest.
      // The following points Gradle to a different manifest for this source set.
      manifest.srcFile 'other/AndroidManifest.xml'
      ...
    }

    // Create additional blocks to configure other source sets.
    androidTest {

      // If all the files for a source set are located under a single root
      // directory, you can specify that directory using the setRoot property.
      // When gathering sources for the source set, Gradle looks only in locations
      // relative to the root directory you specify. For example, after applying
      // the configuration below for the androidTest source set, Gradle looks for
      // Java sources only in the src/tests/java/ directory.
      setRoot 'src/tests'
      ...
    }
  }
}
...

プロジェクト全体のプロパティ設定

複数のモジュールを含むプロジェクトの場合は、プロジェクト レベルでプロパティを定義して、それをすべてのモジュールで共有すると便利です。そのためには、トップレベルの build.gradle ファイル内の ext ブロックで、追加のプロパティを定義します。

buildscript {...}
allprojects {...}

// This block encapsulates custom properties and makes them available to all
// modules in the project.
ext {
    // The following are only a few examples of the types of properties you can define.
    compileSdkVersion = 26
    buildToolsVersion = "27.0.3"

    // You can also use this to specify versions for dependencies. Having consistent
    // versions between modules can avoid behavior conflicts.
    supportLibVersion = "27.1.1"
    ...
}
...

同じプロジェクトのモジュールからこれらのプロパティにアクセスするには、モジュール レベルの build.gradle ファイル内で次の構文を使用します。

android {
  // Use the following syntax to access properties you defined at the project level:
  // rootProject.ext.property_name
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion
  ...
}
...
dependencies {
    compile "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    ...
}

ライブラリと依存関係の管理

Gradle の堅牢なメカニズムでは、リモート ライブラリでもローカルのライブラリ モジュールでも、依存関係を管理できます。

依存関係コンフィグレーションで特定のビルドを対象に指定

特定のビルド バリアントのソースセットまたはテスト用のソースセットでのみ依存先が必要な場合は、依存関係コンフィグレーション名の先頭を大文字にして、その先頭に対象のビルド バリアントまたはテスト用のソースセットの名前を付加します。

android {...}

// Creates Gradle dependency configurations to use in the dependencies block.
configurations {
  // For variants that combine a product flavor and build type, you need to
  // intitialize a placeholder for its dependency configuration.
  freeDebugApk {}
  ...
}

dependencies {
    // Adds a compile dependency only to the "free" product flavor.
    freeCompile 'com.google.firebase:firebase-ads:9.8.0'
    // Adds an apk dependency only to the "freeDebug" build variant.
    freeDebugApk fileTree(dir: 'libs', include: ['*.jar'])
    // Adds a remote binary dependency only for local tests.
    testCompile 'junit:junit:4.12'
    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.2'
}

デフォルトではないライブラリのバリアントを公開

build.gradle ファイルに次の内容を追加すると、Gradle で他のモジュールに公開するデフォルトのライブラリ バリアントを変更できます。

android {
  ...
  // If the library configures product flavors, you must specify
  // a build variant by its full configuration name. The following
  // sets the "demoDebug" build variant as the default version
  // of the library that Gradle should publish.
  defaultPublishConfig "demoDebug"
}

利用可能なライブラリのバリアントをすべて公開するように、Gradle に指定することも可能です。

android {
  ...
  // Note that this might increase build times because Gradle must
  // build multiple AARs, instead of only one.
  publishNonDefault true
}

publishNonDefault true を指定して、アプリ モジュールの build.gradle ファイルを設定すると、各バリアントではそれぞれ必要なバージョンのライブラリのみを使用できます。

android {...}
...

// Creates Gradle dependency configurations to use in the dependencies block.
configurations {
  // Initializes placeholders for the demoDebugCompile and fullReleaseCompile
  // dependency configurations.
  demoDebugCompile {}
  fullReleaseCompile {}
  ...
}

dependencies {
  // If the library configures multiple build variants using product flavors,
  // you must target one of the library's variants using its full configuration name.
  demoDebugCompile project(path: ':my-library-module', configuration: 'demoDebug')
  fullReleaseCompile project(path: ':my-library-module', configuration: 'fullRelease')
  ...
}

複数バージョンのアプリの作成

Gradle と Android プラグインを使用してビルド バリアントを設定すると、単一のモジュールから複数バージョンのアプリを作成することができます。

複数 APK サポートの設定

Android プラグインを用いて、ABI と画面密度をそれぞれ指定して複数の APK を作成すると、Google Play の複数 APK のサポートを利用することができます。

画面密度ごとに異なる APK を設定

画面密度に応じて別々の APK を作成するには、モジュールの build.gradle ファイルに android.splits.density ブロックを追加します。

android {
  ...
  splits {

    // Configures multiple APKs based on screen density.
    density {

      // Enables building multiple APKs.
      enable true

      // Specifies a list of screen densities Gradle should not create APKs for.
      exclude "ldpi", "mdpi"

      // Alternatively, you can use the following to clear the default list of
      // screen densities and specify only the screen densities you want to build
      // APKs for:
      // reset()
      // include "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"

      // Specifies a list of compatible screen size settings. This property
      // configures the <compatible-screens> element in the manifest. You
      // typically don't need to configure this manifest property, but it's
      // important when building multiple APKs based on screen density.
      compatibleScreens 'normal', 'large', 'xlarge'
    }
  }
}

ABI ごとに異なる APK を設定

ABI に応じて別々の APK を作成するには、モジュールの build.gradle ファイルに android.splits.abi ブロックを追加します。

android {
  ...
  splits {

    // Configures multiple APKs based on ABI.
    abi {

      // Enables building multiple APKs.
      enable true

      // By default all ABIs are included, so use reset() and include to specify that we only
      // want APKs for x86, armeabi-v7a, and mips.
      reset()

      // Specifies a list of ABIs that Gradle should create APKs for.
      include "x86", "armeabi-v7a", "mips"

      // Specify that we want to also generate a universal APK that includes all ABIs.
      universalApk true
    }
  }
}

動的なバージョン コードの設定

Gradle でプロジェクトから APK を生成すると、デフォルトではモジュール レベルの build.gradle ファイルに指定されたバージョン情報が、すべての APKに一貫して含まれることになります。Google Play ストアでは、1 つのアプリに対する複数の APK に同一のバージョン情報が含まれることを禁止しているため、Play ストアにアップロードする際は、各 APK の versionCode が固有の値になっていることを確認してください。

ビルド時に各 APK に異なるバージョン コードを割り当てるには、カスタムビルド ロジックを使用します。たとえば次のように自動で APK のバージョニングを行うと、ABI ごとに別々の APK が生成されます。

android {
  ...
  defaultConfig {
    ...
    versionCode 4
  }
  splits {
    ...
  }
}

// Map for the version code that gives each ABI a value.
ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]

// For per-density APKs, create a similar map like this:
// ext.densityCodes = ['hdpi': 1, 'xhdpi': 2, 'xxhdpi': 3, 'xxxhdpi': 4]

import com.android.build.OutputFile

// For each APK output variant, override versionCode with a combination of
// ext.abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode
// is equal to defaultConfig.versionCode. If you configure product flavors that
// define their own versionCode, variant.versionCode uses that value instead.
android.applicationVariants.all { variant ->

  // Assigns a different version code for each output APK
  // other than the universal APK.
  variant.outputs.each { output ->

    // Stores the value of ext.abiCodes that is associated with the ABI for this variant.
    def baseAbiVersionCode =
            // Determines the ABI for this variant and returns the mapped value.
            project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))

    // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes,
    // the following code does not override the version code for universal APKs.
    // However, because we want universal APKs to have the lowest version code,
    // this outcome is desirable.
    if (baseAbiVersionCode != null) {

      // Assigns the new version code to versionCodeOverride, which changes the version code
      // for only the output APK, not for the variant itself. Skipping this step simply
      // causes Gradle to use the value of variant.versionCode for the APK.
      output.versionCodeOverride =
              baseAbiVersionCode * 1000 + variant.versionCode
    }
  }
}

複数のプロダクト フレーバーの組み合わせ

複数のプロダクト フレーバーの設定を組み合わせる必要がある場合があります。このような場合、Android Plugin for Gradle を使うと、フレーバー ディメンションと呼ばれるプロダクト フレーバーのグループを作成できます。

次のコードサンプルでは、flavorDimensions プロパティを使用して "mode" フレーバー ディメンションを作成し、"full" と "demo" プロダクト フレーバーをグループ化しています。さらに、"api" フレーバー ディメンションを作成して、API レベルに応じたプロダクト フレーバー設定をグループ化しています。このようにすると、Gradle は "mode" ディメンションのプロダクト フレーバーと "api" ディメンションのプロダクト フレーバーを組み合わせます。

android {
  ...
  buildTypes {
    debug {...}
    release {...}
  }

  // Specifies the flavor dimensions you want to use. The order in which you
  // list each dimension determines its priority, from highest to lowest,
  // when Gradle merges variant sources and configurations. You must assign
  // each product flavor you configure to one of the flavor dimensions.
  flavorDimensions "api", "mode"

  productFlavors {
    demo {
      // Assigns this product flavor to the "mode" flavor dimension.
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }

    // Configurations in the "api" product flavors override those in "mode"
    // flavors and the defaultConfig block. Gradle determines the priority
    // between flavor dimensions based on the order in which they appear next
    // to the flavorDimensions property above--the first dimension has a higher
    // priority than the second, and so on.
    minApi24 {
      dimension "api"
      minSdkVersion '24'
      // To ensure the target device receives the version of the app with
      // the highest compatible API level, assign version codes in increasing
      // value with API level. To learn more about assigning version codes to
      // support app updates and uploading to Google Play, read Multiple APK Support
      versionCode 30000 + android.defaultConfig.versionCode
      versionNameSuffix "-minApi24"
      ...
    }

    minApi23 {
      dimension "api"
      minSdkVersion '23'
      versionCode 20000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi23"
      ...
    }

    minApi21 {
      dimension "api"
      minSdkVersion '21'
      versionCode 10000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi21"
      ...
    }
  }
}
...

バリアントのフィルタリング

使用したくないビルド バリアントをフィルタリングするには、モジュールの build.gradle ファイルの variantFilter ブロックを使用します。次の例では、"minApi21" および "demo" プロダクト フレーバーを組み合わせたバリアントをビルドしないよう Gradle に指定しています。

android {
 ...
 buildTypes {...}

 flavorDimensions "api", "mode"
 productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
    def names = variant.flavors*.name
    // To check for a build type instead, use variant.buildType.name == "buildType"
    if (names.contains("minApi21") && names.contains("demo")) {
      // Gradle ignores any variants that satisfy the conditions above.
      setIgnore(true)
    }
  }
}
...

アプリのテスト

ローカルまたは統合環境でのユニット テストの実施については、アプリのテストのページで詳細をご覧ください。

lint オプションの設定

特定の lint オプションを指定するには、モジュール レベルの build.gradle ファイル内で lintOptions ブロックを使用します。Android プロジェクトでの lint の使用については、lint によるコードの改善のページで詳細をご覧ください。

android {
  ...
  lintOptions {
    // Turns off checks for the issue IDs you specify.
    disable 'TypographyFractions','TypographyQuotes'
    // Turns on checks for the issue IDs you specify. These checks are in
    // addition to the default lint checks.
    enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled'
    // To enable checks for only a subset of issue IDs and ignore all others,
    // list the issue IDs with the 'check' property instead. This property overrides
    // any issue IDs you enable or disable using the properties above.
    check 'NewApi', 'InlinedApi'
    // If set to true, turns off analysis progress reporting by lint.
    quiet true
    // if set to true (default), stops the build if errors are found.
    abortOnError false
    // if true, only report errors.
    ignoreWarnings true
  }
}
...

インストルメンテーション テスト向けのマニフェスト設定

Gradle でテスト用の APK をビルドすると、自動で AndroidManifest.xml ファイルが生成され、<instrumentation> ノードで設定が行われます。このノードの設定を変更するには、テストソース セットで別のマニフェストを生成するか、次のコードサンプルのようにモジュール レベルの build.gradle ファイルで設定します。

android {
  ...
  // Each product flavor you configure can override properties in the
  // defaultConfig block. To learn more, go to Configure Product Flavors.
  defaultConfig {
    ...
    // Specifies the application ID for the test APK.
    testApplicationId "com.test.foo"
    // Specifies the fully-qualified class name of the test instrumentation runner.
    testInstrumentationRunner "android.test.InstrumentationTestRunner"
    // If set to 'true', enables the instrumentation class to start and stop profiling.
    // If set to false (default), profiling occurs the entire time the instrumentation
    // class is running.
    testHandleProfiling true
    // If set to 'true', indicates that the Android system should run the instrumentation
    // class as a functional test. The default value is 'false'
    testFunctionalTest true
  }
}
...

テストするビルドタイプの変更

デフォルトでは、すべてのテストは、デバッグ ビルドタイプに対して実行されます。対象を別のビルドタイプに変更するには、モジュール レベルの build.gradle ファイル内で testBuildType プロパティを使用します。たとえば、"staging" ビルドタイプに対してテストを実行する場合は、次のスニペットのようにファイルを編集します。

android {
    ...
    testBuildType "staging"
}

Gradle テスト オプションの設定

オプションを指定して、すべてのテストにおける Gradle の実行方法を変更するには、モジュール レベルの build.gradle ファイル内の testOptions ブロックを設定します。

android {
  ...
  // Encapsulates options for running tests.
  testOptions {
    // Changes the directory where Gradle saves test reports. By default, Gradle saves test reports
    // in the path_to_your_project/module_name/build/outputs/reports/ directory.
    // '$rootDir' sets the path relative to the root directory of the current project.
    reportDir "$rootDir/test-reports"
    // Changes the directory where Gradle saves test results. By default, Gradle saves test results
    // in the path_to_your_project/module_name/build/outputs/test-results/ directory.
    // '$rootDir' sets the path relative to the root directory of the current project.
    resultsDir "$rootDir/test-results"
  }
}

ローカルのユニット テストのみを対象にオプションを指定するには、testOptions.unitTests ブロックを設定します。

android {
  ...
  testOptions {
    ...
    // Encapsulates options for local unit tests.
    unitTests {
      // By default, local unit tests throw an exception any time the code you are testing tries to access
      // Android platform APIs (unless you mock Android dependencies yourself or with a testing
      // framework like Mockito). However, you can enable the following property so that the test
      // returns either null or zero when accessing platform APIs, rather than throwing an exception.
      returnDefaultValues true

      // Encapsulates options for controlling how Gradle executes local unit tests. For a list
      // of all the options you can specify, read Gradle's reference documentation.
      all {
        // Sets JVM argument(s) for the test JVM(s).
        jvmArgs '-XX:MaxPermSize=256m'

        // You can also check the task name to apply options to only the tests you specify.
        if (it.name == 'testDebugUnitTest') {
          systemProperty 'debug', 'true'
        }
      }
    }
  }
}

ビルドの最適化

このセクションでは、フルビルドおよび増分ビルドの速度向上に役立つ設定をいくつかご紹介します。

コードの圧縮

Android Studio では ProGuard を使用してコードを圧縮します。新しいプロジェクトには、Android SDK の tools/proguard/folder にあるデフォルトの設定ファイル(proguard-android.txt)が使用されます。コードをさらに圧縮する場合は、同じ場所にある proguard-android-optimize.txt ファイルを使用してください。

android {
  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                                           'proguard-rules.pro'
    }
  }
  ...
}
...

各ビルド バリアントに固有の ProGuard ルールを追加するには、それぞれのフレーバーに対して追加で proguardFiles プロパティを設定します。たとえば次の例では、"flavor2" に対して flavor2-rules.pro を追加しています。これにより、release ブロックも適用されるため、"flavor2" のリリース バージョンには 3 つの ProGuard ルールがすべて使用されます。

android {
  ...
  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'),
             'proguard-rules.pro'
    }
  }
  productFlavors {
    flavor1 {
      ...
    }
    flavor2 {
      proguardFile 'flavor2-rules.pro'
    }
  }
}
...

Instant Run によるコード圧縮の有効化

Instant Run によるコード圧縮を有効化するには、単純に useProguardfalse に設定(minifyEnabledtrue に設定したままに)します。ここで使用される試験運用版のコード圧縮ツールでは、コードの難読化や最適化は行いません(よって "debug" ビルドタイプに対してのみ、この圧縮ツールを有効にしてください)。

android {
  buildTypes {
    debug {
      minifyEnabled true
      useProguard false
      proguardFiles getDefaultProguardFile('proguard-android.txt'),
              'proguard-rules.pro'
    }
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'),
              'proguard-rules.pro'
    }
  }
}

DEX オプションの設定

次のプロパティを使用すると、Gradle でコードを DEX ファイルにコンパイルする際のビルド時間が短縮されます。

android {
  ...
  dexOptions {
    // Sets the maximum number of DEX processes
    // that can be started concurrently.
    maxProcessCount 8
    // Sets the maximum memory allocation pool size
    // for the dex operation.
    javaMaxHeapSize "2g"
    // Enables Gradle to pre-dex library dependencies.
    preDexLibraries true
  }
}

アプリの公開

Google Play へのアプリ公開方法については、アプリを公開するのページで詳細をご覧ください。

アプリの署名

Android Studio では、UI から簡単にリリースビルドの署名設定ができますが、モジュールの build.gradle ファイル内の signingConfigs ブロックで手動で設定することも可能です。

android {
  ...
  defaultConfig { ... }

  // Encapsulates signing configurations.
  signingConfigs {
    // Creates a signing configuration called "release".
    release {
      // Specifies the path to your keystore file.
      storeFile file("my-release-key.jks")
      // Specifies the password for your keystore.
      storePassword "password"
      // Specifies the identifying name for your key.
      keyAlias "my-alias"
      // Specifies the password for your key.
      keyPassword "password"
    }
  }
  buildTypes {
    release {
      // Adds the "release" signing configuration to the release build type.
      signingConfig signingConfigs.release
      ...
    }
  }
}
...

プロジェクトからプライベートな署名情報を削除

デフォルトでは、署名設定は書式なしテキストとしてモジュールの build.gradle ファイルに記録されます。チームやオープンソース プロジェクトで作業している場合は、このプライベートな情報を次の手順でビルドから除外することができます。

  1. プロジェクトのルート ディレクトリに keystore.properties というファイルを作成して、次の内容を含めます。
    storePassword=myStorePassword
    keyPassword=myKeyPassword
    keyAlias=myKeyAlias
    storeFile=myStoreFileLocation
    
  2. build.gradle ファイルで、次のように keystore.properties ファイルを読み込みます(これは android ブロックの前に追加してください)。
    // Creates a variable called keystorePropertiesFile, and initializes it to the
    // keystore.properties file.
    def keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initializes a new Properties() object called keystoreProperties.
    def keystoreProperties = new Properties()
    
    // Loads the keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
    android {
      ...
    }
    ...
    
  3. keystoreProperties オブジェクトに保存された署名情報を入力します。
    android {
      signingConfigs {
        config {
          keyAlias keystoreProperties['keyAlias']
          keyPassword keystoreProperties['keyPassword']
          storeFile file(keystoreProperties['storeFile'])
          storePassword keystoreProperties['storePassword']
        }
      }
      ...
    }
    ...
    
  4. 通知バーの [Sync Now] をクリックします。

アプリの署名の詳細については、アプリの署名のページをご覧ください。

アプリ開発の簡略化

以下では、Android アプリをより簡単に開発するための情報をご紹介します。

カスタム フィールドとリソース値をアプリのコードと共有

Gradle ではビルド時に BuildConfig クラスを生成し、アプリのコードはこのクラスを参照して現在のビルド情報を確認します。Gradle のビルド設定ファイルで buildConfigField() メソッドを使用して、BuildConfig クラスにカスタム フィールドを追加すると、アプリのランタイム コードでその値にアクセスできます。同様に resValue() でアプリのリソース値を追加できます。

android {
  ...
  buildTypes {
    release {
      // These values are defined only for the release build, which
      // is typically used for full builds and continuous builds.
      buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"")
      resValue("string", "build_time", "${minutesSinceEpoch}")
      ...
    }
    debug {
      // Use static values for incremental builds to ensure that
      // resource files and BuildConfig aren't rebuilt with each run.
      // If they were dynamic, they would prevent certain benefits of
      // Instant Run as well as Gradle UP-TO-DATE checks.
      buildConfigField("String", "BUILD_TIME", "\"0\"")
      resValue("string", "build_time", "0")
    }
  }
}
...

アプリのコードでは次のように、そのプロパティにアクセスできます。

...
Log.i(TAG, BuildConfig.BUILD_TIME);
Log.i(TAG, getString(R.string.build_time));

マニフェストとプロパティを共有

マニフェストとコードで同一プロパティの宣言が必要な場合もあります(FileProvider の権限を宣言する場合など)。このような場合は、同じプロパティを複数の箇所で更新して変更を反映する代わりに、次のようにモジュールの build.gradle ファイル内で単一のプロパティを宣言し、それをマニフェストとコードの両方で利用できるようにします。詳細については、マニフェストへのビルド変数の追加のページをご覧ください。

android {
  // For settings specific to a product flavor, configure these properties
  // for each flavor in the productFlavors block.
  defaultConfig {
    // Creates a property for the FileProvider authority.
    def filesAuthorityValue = applicationId + ".files"
    // Creates a placeholder property to use in the manifest.
    manifestPlaceholders =
      [filesAuthority: filesAuthorityValue]
      // Adds a new field for the authority to the BuildConfig class.
      buildConfigField("String",
                       "FILES_AUTHORITY",
                       "\"${filesAuthorityValue}\"")
  }
  ...
}
...

マニフェストでは、次のようにプレースホルダにアクセスします。

<manifest>
  ...
  <application>
    ...
    <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="${filesAuthority}"
      android:exported="false"
      android:grantUriPermissions="true">
      ...
    </provider>
  </application>
</manifest>

アプリのコードで FILES_AUTHORITY フィールドにアクセスするには、次のようにします。

...
Uri contentUri = FileProvider.getUriForFile(getContext(),
  BuildConfig.FILES_AUTHORITY,
  myFile);