トップ «前の日記(2021-01-05) 最新 次の日記(2021-01-12)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2021-01-06 [Android]Gradleについての備忘録

_ ビルド要素

ビルド構成ファイル(build.gradle)の要素に対応。

  • ビルドタイプ(debug, release, etc)
    パッケージ化で使用するプロパティを定義。
  • プロダクト・フレーバー(例: 無料版, 有料版)
    異なる種類の定義。
  • ビルド・バリアント
    ビルドタイプとプロダクト・フレーバーを組み合わせたもの。
  • マニフェスト・エントリ
    ビルド・バリアント毎にマニフェスト・ファイルの一部のプロパティ値を設定。
  • 署名
    ビルドの種類毎に署名の内容を設定。
  • コードとリソースの圧縮
    ビルド・バリアント毎にProGuard ルールファイルを指定。
  • 複数 APK サポート
    ビルドの種類毎のコードとリソースを設定。

_ プロジェクト構造

プロジェクト構造の例を図にしてみる。

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

_ Gradle 設定ファイル(settings.gradle)

ビルド対象のモジュールを設定。

include ‘:app’

_ トップレベル・ビルド構成ファイル(build.gradle)

ルート・プロジェクト・ディレクトリにある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}"
    ...
}

_ モジュール・レベル・ビルド構成ファイル(build.gradle)

モジュール固有の定義。

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 プロパティ ファイル

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);

トップ «前の日記(2021-01-05) 最新 次の日記(2021-01-12)» 編集