AndroidManifest.xmlにAPIキーを書いたコードをGitHubにコミットしないために

More than 1 year has passed since last update.

はじめに

個人開発なんかでAPIのチュートリアルなんかにしたがってコードを書いていると、利用するためのAPIキーをAndroidManifest.xmlに書くことがあるのですが、そのコードをつい何も考えずGitHub上に上げてしまいがちです。

AWSですが、こんな記事も見かけたので、APIキーは安易にGitHub上にコミットしていいものではなさそうですね。
かと言って、そこだけ手書きで毎回書き換えるという運用もしたくはありません。

(なお現状はGitHubで検索(GoogleMapsAPIキーの例)してみると、ベタ書きされていたり、良くてもstrings.xmlにベタ書きされたものが多くある模様)

そこで今回は、どうにかしてAPIキーをコミットせずコードに反映させるかを調べてみました。

開発環境

  • OS X 10.9.5
  • AndroidStudio 2.0

やること

  • ※APIキーだと反映されているかの確認が色々面倒…
  • 同じくManifestに記載して確認が簡単なMainActivity.javaのlabelの文字列をコミットせずに反映させる。

やったこと

ManifestManagerのmanifestPlaceHoldersを利用して、設定したい値を環境変数から取得します。

  • ManifestManagerの利用
  • build.gradleの値を環境変数から取得
  • 環境変数の設定
  • デバッグAPKをインストールして確認

ManifestManagerの利用

manifestPlaceHoldersでは${}で囲って変数を埋め込みます。

AndroidManifest.xml
        <activity
            android:name=".MainActivity"
            android:label="${label}"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

build.gradleの値を環境変数から取得

manifestPlaceholdersに先ほどManifest側で埋め込んだ変数を定義していく。
今回はLABELという環境変数を参照させる。

※ベタ書きでも動くがそれだと本末転倒なので更に環境変数を参照するようにする。

app/build.gradle
    buildTypes {
        debug {
            minifyEnabled false
            signingConfig signingConfigs.debug
            //manifestPlaceholders = [label: "testlabel"] #ベタ書きの例、これでも動くが...
            manifestPlaceholders = [label: System.getenv("LABEL")]
        }
    }

環境変数の設定

ターミナル上でlaunchctlを使って設定してく。

#LABELという環境変数に"testlabel"を設定する
$ launchctl setenv LABEL testlabel

#設定されていることを確認する
$ launchctl getenv LABEL
testlabel

デバッグAPKをインストールして確認

設定したら反映のためにAndroidStudioを再起動して、作成したデバッグapkを入れてみる。

無事に「testlabel」がlabelに反映されました。
image

おわりに

複数人や複数デバイスで開発する際などは環境変数を揃えないといけないのが面倒な気がします。
これが正しい方法かどうか分からないので、もっといい方法をご存知の方はぜひ教えて下さい。

参考

初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 - Qiita : http://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694

Manifest Merger - Android Studio Project Site : http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support

Android Studio(Gradle)でapkファイルを作成する時にstorePassword/keyAlias/keyPasswordの指定方法をいくつか検証してみた。 - Qiita : http://qiita.com/shiraji/items/8f55b5295094487ce71a

AndroidStudioに環境変数を渡す - Qiita : http://qiita.com/tmiyamon/items/ed660dff7846f5ec95d3