meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

【Android】複数人開発における署名鍵の管理方法と署名方法

      2021/01/06

Android Studio

最近、Androidのアプリを複数人で開発する機会があり、署名の方法や署名鍵の管理の仕方で困ることがありました。

ネットで調べても良い方法が見つからず、結局は自分で考えました。

今日は、その方法を紹介したいと思います。

予備知識

署名鍵の作成方法や署名方法などについては下記のページが参考になるかと思います。

Androidの署名の仕組みについて調べたことをまとめます。ローカルでreleaseバリアントをビルドするところまでで、Play Storeへのリリースまでは扱いません。内容は基本的に公式ドキュメントのまとめです。https:...

やりたいこと

  1. 複数人でアプリを開発したい
  2. コードはGitHubで管理したい
  3. 署名済みのアプリは特定の人のみがビルドできるようにしたい
  4. 署名鍵は特定の人のみが管理するようにしたい(開発者全員には見せたくない)
  5. GitHubからコードをCloneしてきた時点で、ビルドが通るような運用にしたい(署名済みのアプリをビルドできる人とできない人それぞれが、何らかの設定をしなければビルドが通らないような状況は避けたい ← 超重要

特に5番目が重要です。

ネットで調べても良い解決方法が見つからず、結局は自分で方法を考えました。

方法

方法はとても簡単です。

アプリ署名に関するgradleファイルが存在すれば、署名済みアプリのビルドができるようにする。そうでなければ、なにもしない、というだけの話です。

 

やるべきことは下記です。

  1. build.gradleにrelease.gradleの情報を追記する
  2. .gitignoreにrelease.gradleを追記する
  3. release.gradleを追加する(署名済みアプリのビルドを行いたい人のみ)

 

最終的なプロジェクトの構成は下記のようになります。
(人によっては構成が違うかもしれませんが、この記事の情報を応用して運用すれば良いので参考になると思います)

/app
   |--- src/
        (...省略...)
   |--- build.gradle  ← ファイルに追記
release.gradle        ← ファイルを追加
.gitignore            ← ファイルに追記

(署名鍵の運用方法に関するファイルとフォルダのみを記載している。その他は省略)

 

1. build.gradleにrelease.gradleの情報を追記する

build.gradleに下記の「~~~~~ ↓ここから↓ ~~~~~」「~~~~~ ↑ここまで↑ ~~~~~」を追記してください。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "com.example.xxx"
        minSdkVersion 26
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            ~~~~~ ↓ここから↓ ~~~~~
            File f = new File(project.projectDir.toString() + "/../release.gradle")
            if (f.exists()) {
                println("release.gradle is found")
                apply from: project.projectDir.toString() + "/../release.gradle", to: android
                signingConfig signingConfigs.release
            }
            else {
                println(f.getAbsolutePath())
                println("release.gradle is not found")
            }
            ~~~~~ ↑ここまで↑ ~~~~~
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation project(path: ':sdk')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

 

読んでいただければ分かる通り、プロジェクトの親ディレクトリにrelease.gradleが見つかれば、署名を有効にする、というような内容を追記しています。

2. .gitignoreにrelease.gradleを追記する

手順3で追加するrelease.gradleは、署名済みアプリをビルドできる人だけ追加すれば良いファイルなので、Gitで管理しません。

.gitignoreに追記します。

(~~省略~~)
release.gradle
(~~省略~~)

 

この記事を読んでくれている人は、.gitignoreの書き方なんて説明するまでもないと思いますが、念の為に紹介しておきます…

手順1, 2の作業が完了したら、このままコミットしてGitHubにプッシュします。

3. release.gradleを追加する(署名済みビルドを行いたい人のみ)

署名済みアプリをビルドを行いたい人は、プロジェクトの親ディレクトリにrelease.gradleというファイルを追加します。

signingConfigs {
    release {
        storeFile file('C:\\Users\\meideru\\Document\\hogehoge\\xxx.jks') ← 署名鍵のファイルパスを記載
        storePassword 'password'  ← 署名鍵生成時に設定したパスワードを記載
        keyPassword 'passwqord'   ← 署名鍵生成時に設定したパスワードを記載
        keyAlias 'xxx'            ← 署名鍵生成時に設定したエイリアス名を記載
    }
}

 

署名鍵のファイルパスは、プロジェクト内ではない任意の場所を記載することになります。

以上です。

 

ここまでの話を整理して、運用方法を説明すると…

署名済みビルドを行いたい人は、ローカルの開発環境に署名鍵を置いておき、release.gradleをプロジェクトの親ディレクトリに追加する。

署名済みビルドができなくて良い人は、特に何もする必要なし。

ということです。

プロジェクトの差分としては、プロジェクトの親ディレクトリにrelease.gradleが存在するかしないか、ということだけです。

GitHubに存在するコードは常にビルドが通るような運用が可能です。(release.gradleが存在するときとしないときで場合分けする処理を実行しているため)

所感

ネットで探しても良い方法が見つからず、上記の方法を自分で考えました。

何か他に良い方法がありましたら、教えてください。

 - 技術系