[Kotlin]ApplicationIDなどKey情報をソース管理させたくないときの設定方法

スポンサーリンク

AdMobという広告を試そうとしたときのこと。

Git環境にコミットする際に、アプリ ID(Application ID)や広告ユニット ID()ってソースコードに直書きするのよくない。
アクセスキー(Access key)も同様で、一元管理して、バージョン管理システムを使っていても運用しやすいようにしたいな。
でも、どんな方法がいいかなと思い、調べたので情報を残しておきます。

参考:AdMob公式のスターとガイド

開始する  |  Android  |  Google for Developers
Android アプリを開発している Google AdMob パブリッシャー向けのモバイル広告用 SDK です。

こんな感じに書くって示してくれている。
けど、テストならまだしも、これでリリースはよくないなと。

<manifest>
    <application>
        <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
    </application>
</manifest>

雑な解決方法としては、テスト用のIDはコミットして、本番用は、リリースしないとか?
個人で一回ぐらいならいいかもだけど、気持ちよくないなと。

解決策

コミットしない環境変数系を格納する箇所に書いてアクセスするようにしました。

定義と意味

値の定義

gradle.properties

admobAppIdDeub=ca-app-pub-XXXXXXXXX~XXXXXXXXX
admobAppIdRelease=ca-app-pub-XXXXXXXXX~XXXXXXXXX
admobUnitIdforDebug=ca-app-pub-XXXXXXXXX/XXXXXXXXX
admobUnitIdforRelease=ca-app-pub-XXXXXXXXX/XXXXXXXXX

テスト用は公式でも表示されているので、隠さなくてもよさそう。

変数の定義

build.gradle

android {
・・・省略・・・
    buildTypes {
        debug {
            manifestPlaceholders = [admob_app_id: project.property("admobAppIdDeub")]
            buildConfigField("String", "admob_app_id", "\"{$admobAppIdDeub}\"")
            resValue "string", "ad_unit_id", "$admobUnitIdforDebug"
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [admob_app_id: project.property("admobAppIdRelease")]
            buildConfigField("String", "admob_app_id", "\"{$admobAppIdRelease}\"")
            resValue "string", "ad_unit_id", "$admobUnitIdforRelease"
        }
    }
・・・省略・・・
}

意味

manifestPlaceholders
 → AndroidManifest.xmlで参照できるようにするための設定
buildConfigField
 → ktファイル内で参照できるようにするための設定
resValue
 → xmlリソースファイル内で参照できるようにするための設定

呼び出し方法

Manifest

AndroidManifest.xml

<manifest ・・・省略・・・
    <application
    ・・・省略・・・
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="${admob_app_id}" />
    ・・・省略・・・
    </application>
</manifest>

ktファイル

例えば、MainActivity.ktのonCreate内とか

MobileAds.initialize(this, BuildConfig.admob_app_id)

リソースファイル

例えば、activity_main.xmlのConstraintLayout内とか

   <com.google.android.gms.ads.AdView xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        ads:adSize="SMART_BANNER"
        ads:adUnitId="@string/ad_unit_id"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

値を定義しているgradle.propertiesは管理対象外にしておくこと

.gitignoreに以下が追加されていなければ追加しておくこと

gradle.properties

もし、gradle.propertiesが他の用途などでダメな理由があれば、local.properties等、別のファイルを検討します。

参考

Build Variantsで開発版Androidアプリを分ける - ninjinkun's diary
Androidアプリを開発していると、開発版とリリース版のアプリを同時に入れておきたいことがあると思います。通常Appliction ID (com.ninjinkun.njkappのようなやつ) が同一だとアプリが上書きされてしまうのです...
Build Variantsで開発版Androidアプリを分ける - ninjinkun's diary
Androidアプリを開発していると、開発版とリリース版のアプリを同時に入れておきたいことがあると思います。通常Appliction ID (com.ninjinkun.njkappのようなやつ) が同一だとアプリが上書きされてしまうのです...

https://wandering-engineer.tech/2019/05/01/how-to-use-gradle-properties/

コメント

タイトルとURLをコピーしました