Gradle Tips

Toru Hosokawa
twitter:@anton0825
facebook:toru.hosokawa1
github:hosokawa0825
blog:http://d.hatena.ne.jp/anton0825/

2015.3.12

Product Flavor

主な用途

  • Pro版、Free版など少し仕様が異なるAPKを一つのコードベースから作成する。
  • サーバのURLなど、開発環境毎に異なる値をコードを修正することなく切り替える。

Product Flavorの例


                    android {
                        productFlavors {
                            aVersion {
                                applicationId "jp.co.sample.aVersion"
                                buildConfigField "String", "SERVER_URL", '"http://dummy"'
                            }
                            aVersionStaging {
                                applicationId "jp.co.sample.aVersion.staging"
                                buildConfigField "String", "SERVER_URL", '"http://dummy"'
                            }
                            aVersionDevelopment {
                                applicationId "jp.co.sample.aVersion.development"
                                buildConfigField "String", "SERVER_URL", '"http://dummy/"'
                            }
                            bVersion {
                                applicationId "jp.co.sample.bVersion"
                                buildConfigField "String", "SERVER_URL", '"http://dummy"'
                            }
                            bVersionStaging {
                                applicationId "jp.co.sample.bVersion.staging"
                                buildConfigField "String", "SERVER_URL", '"http://dummy"'
                            }
                            bVersionDevelopment {
                                applicationId "jp.co.sample.bVersion.development"
                                buildConfigField "String", "SERVER_URL", '"http://dummy/"'
                            }
                        }
                    }
                

問題点1

strings.xmlなどのリソースが各Flavor毎に分かれる。でも、リソースはすべての環境でほぼ同じなので、ほとんど同じリソースが沢山出来てしまう。

解決策

各環境のsourceSetを同じPathにする。サーバURLなど各環境毎に変更する値はbuildConfigFieldで定義する。


                    android {
                        ...

                        sourceSets {
                            aVersionStaging.setRoot('src/aVersion')
                            aVersionDevelopment.setRoot('src/aVersion')
                            bVersionStaging.setRoot('src/bVersion')
                            bVersionDevelopment.setRoot('src/bVersion')
                        }
                    }
                

問題点2

不要なBuildVariantが出来てしまう。

例えば、aVersionDevelopmentReleaseなど。本番以外の環境ではDebugビルドだけでいい。

解決策

BuildVariantの一部をビルド対象外にする


                    android {
                        // ステージング環境・開発環境用モジュールはdebugビルドのみとする
                        variantFilter { variant ->
                            if (variant.buildType.name.equals('release')) {
                                if (variant.getFlavors().get(0).name.contains('Staging') || variant.getFlavors().get(0).name.contains('Development')) {
                                    variant.setIgnore(true);
                                }
                            }
                        }
                    }
                

Icon versioning

アプリアイコンにビルドしたブランチ名、コミットHash等を表示する。これによって、テスト対象のアプリが古かったということが少なくなる。
Gradle Pluginを使用する

導入方法

プロジェクトトップのbuild.gradleに以下を追加


                    buildscript {
                        dependencies {
                            classpath 'com.github.splatte:gradle-android-appiconoverlay:1.1'
                        }
                    }
                

app/build.gradleに以下を追加


                    // アプリアイコンにブランチ名、コミットのhash値、ビルド日時を表示する場合は
                    // ビルド引数に -PiconVersioningを渡すこと。
                    if (project.hasProperty('iconVersioning')) {
                        apply plugin: 'app-icon-overlay'
                        appiconoverlay {
                            textColor '#000000FF'
                            backgroundColor '#BEBEBEEE'
                            format '$branch\n$commit\n' + new Date().format('yyyy/MM/dd')
                            imageMagick 'convert'
                        }
                    }
                    // androidセクションより上にappiconoverlayセクションを定義する
                    android {...}
                

注意点

  • ImageMagickの他にGhostScriptもインストールしないと動かない。しかも、エラーメッセージが出ずビルドが止まるので原因を特定しづらい
  • ImageMagickとGhostScriptがインストール済みの環境でないとビルドが止まるようになってしまう。よって、ビルド時の引数でアイコンを書き換えるかどうかを判定している。

注意点