iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
ビルド構成ファイル(build.gradle)の要素に対応。
プロジェクト構造の例を図にしてみる。
.
`-- MyApp Project(ルート・プロジェクト・ディレクトリ)
|-- gradle.properties Gradle プロパティ・ファイル
|-- local.properties Gradle プロパティ・ファイル
|-- build.gradle トップレベル・ビルド構成ファイル
|-- settings.gradle Gradle設定ファイル
`-- app Module
|-- build.gradle モジュール・レベル・ビルド構成ファイル
|-- build
|-- libs
`-- src
|-- main Sourceset
| |-- java
| | `-- com.example.myapp
| |-- res
| | |-- drawable
| | |-- layout
| | `-- ...
| `-- AndroidManifest.xml
|-- buildType 特定のビルドタイプのSourceset
|-- productFlavor 特定のプロダクト・フレーバーのSourceset
`-- productFlavorBuildType 特定のビルド・バリアントのSourceset
ビルド対象のモジュールを設定。
include ‘:app’
ルート・プロジェクト・ディレクトリにあるbuild.gradle。buildscriptブロックにモジュール共通のGradleリポジトリと依存関係(Android Plugin for Gradle など)を定義。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
ext {
compileSdkVersion = 28
supportLibVersion = "28.0.0"
}
extブロックにモジュール共通のプロパティを定義。このプロパティは、モジュール・レベル・ビルド構成ファイルから利用できる。
android {
compileSdkVersion rootProject.ext.compileSdkVersion
...
}
...
dependencies {
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
...
}
モジュール固有の定義。
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "29.0.2"
defaultConfig {
applicationId 'com.example.myapp'
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "tier"
productFlavors {
free {
dimension "tier"
applicationId 'com.example.myapp.free'
}
paid {
dimension "tier"
applicationId 'com.example.myapp.paid'
}
}
splits {
density {
enable false
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
dependencies {
implementation project(":lib")
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
デフォルトのソースセットの設定は変更できる。
android {
...
sourceSets {
main {
// デフォルトは'src/main/java'
java.srcDirs = ['other/java']
res.srcDirs = ['other/res1', 'other/res2']
manifest.srcFile 'other/AndroidManifest.xml'
...
}
androidTest {
setRoot 'src/tests'
...
}
}
}
...
gradle.propertiesにはGradle設定をlocal.propertiesにはローカル環境プロパティ(ndk.dirやsdk.dirなど)を定義する。
モジュールのbuild.gradleで署名が設定できる。
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "password"
keyAlias "my-alias"
keyPassword "password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
...
}
}
}
...
build.gradleに署名情報を記述したくない場合は、ルート・プロジェクト・ディレクトリにkeystore.propertiesを置く。
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation
モジュールのbuild.gradleのandroidブロックの前にkeystore.propertiesを読み込む定義を記述する。
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
signingConfigs {
config {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
...
}
...
ビルドするとBuildConfigクラスが生成されるが、カスタムフィールドを追加することができるので、これを使ってアプリのコードに値を渡せる。
android {
...
buildTypes {
release {
buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"")
resValue("string", "build_time", "${minutesSinceEpoch}")
...
}
debug {
buildConfigField("String", "BUILD_TIME", "\"0\"")
resValue("string", "build_time", "0")
}
}
}
...
アプリのコードでは、以下のように参照する。
...
Log.i(TAG, BuildConfig.BUILD_TIME);
Log.i(TAG, getString(R.string.build_time));
マニフェストにも値を渡せる。
android {
defaultConfig {
def filesAuthorityValue = applicationId + ".files"
manifestPlaceholders =
[filesAuthority: filesAuthorityValue]
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>
アプリのコードからの参照は以下の通り。
...
Uri contentUri = FileProvider.getUriForFile(getContext(),
BuildConfig.FILES_AUTHORITY,
myFile);