21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidアプリのgradleビルドでbuildTypeごとにいろいろ変えてみた

Posted at

#パッケージ名

android {
    ...

    buildTypes {
        hoge {
            packageNameSuffix "hoge.$param"
        }
    }
}

ビルド実行時に -Pparam=fuga を付ければパッケージ名が my.app.hoge.fuga のようになります。
buildTypesではsuffixのみ指定できます。
productFlavorsを使用する場合は、packageName "my.app.hoge" とすればパッケージ名全体を指定できます。

ただし、この変更は AndroidManifest.xml でのパッケージ定義が変わるだけで、Javaクラスのパッケージは変わりません。
アプリ内でcontext.getPackageName()などとすると "my.app.hoge.fuga" が取れますが、MyActivity.class.getPackage().getName() などでは "my.app" (変更前のパッケージ名)となるので注意が必要です。

#バージョン名

android {
    ...

    buildTypes {
        hoge {
            versionNameSuffix ".hoge.$param"
        }
    }
}

ビルド実行時に -Pparam=fuga を付ければversionNameが 1.0.0.hoge.fuga のようになります。
パッケージ名と同様、buildTypesで指定できるのはsuffixのみで、productFlavorではversionName全体が指定できます。
アプリ内からどのビルドかを判別可能にしたい場合などに便利です。
パッケージ名と違い、既存のバージョンの後ろに . が勝手に付くわけではありません。

#アプリ名

android {
    ...

    applicationVariants.all { variant ->
        variant.processManifest.doLast {                                      // ①
            if (variant.buildType.name.equals("hoge")) {                      // ②
                def manifestDir = "$buildDir/manifests/${variant.dirName}"
                def newManifestDir = "$manifestDir/new"
                file("$newManifestDir").mkdir()                               // ③
                copy {
                    from("$manifestDir") {
                        include "AndroidManifest.xml"                         // ④
                    }
                    into("$newManifestDir")
                    filter {                                                  // ⑤
                        String line -> line.replaceAll('@string/app_name', "new app name")
                    }
                    variant.processResources.manifestFile = file("$newManifestDir/AndroidManifest.xml")
                                                                              // ⑥
                }
            }
        }
    }
}

①Manifestに関する処理のあとで
②特定のbuildTypeのときに、
③ディレクトリを生成して
④AndroidManifest.xmlをコピーし、
⑤その際にアプリ名部分を新しい名前に置換し、
⑥Manifestの定義を新しいファイルに変更します。
パッケージ名やバージョン名のように、気軽に変更できるメソッドがなかったため、Manifestファイルを書き換えました。
他のManifest設定値などをbuildTypeごとに変えたい場合にも応用できそうです。

#おまけ:パラメータ未指定でもエラーにならないようにする
$paramのようにパラメータを使用する際、パラメータが不要なbuildTypeでもパラメータを指定しないとエラーになってしまいますが、以下のようにしておくとパラメータ未指定でもエラーにならないようにできます。

android {
    ...

    def param
    if (project.hasProperty('param')) {
        param = project.param
    }
}

(パラメータ未指定の場合はthrow GradleException("message")でビルドが失敗するようにしてあげたほうがより親切かもしれません)

21
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?