ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Gradle プラグイン vc-android-sdk-manager 0.1.0 をリリースしました

リポジトリ

Git プロジェクトを GitHub 上に置いています。 Maven リポジトリGitHub 上に置いてあります。

このプラグインの目的

Android プロジェクトの Gradle ビルドスクリプトから Android SDKandroid update sdk を実行することです。

通常、既存の Android プロジェクトの開発に携わるとき、最初に次のようなことを行う必要があります。

  1. Android SDK (と IDE など) をダウンロードしてくる。 (まだしていない場合。)
  2. 既存の Android プロジェクトを手元に持ってくる。 (git clone とか。)
  3. Android SDK アップデートを行い、プロジェクトで必要なコンポーネントをダウンロードする。 (← これ)
  4. 開発を始める。

上の流れの中の、「これ」 と書かれた部分を自動化します。 (ビルドスクリプトの実行時に行うようにする。)

こういう問題を解決します

  • 手元でビルドする場合: Android SDK をインストールした後、Android SDK Manager でどのコンポーネントをインストールすればいいのかわかりづらい。
  • Jenkins で CI している場合: build.gradle の設定を書きかえた後、Jenkins 上でコンポーネントのインストールやバージョンアップをしないと Jenkins 上でのビルドに失敗するようになってしまう。

使い方

GitHub 上に Maven リポジトリを展開していますので、次のようにビルドスクリプトの依存を記述すれば使用できるようになります。 これはルートプロジェクトにのみ記述すればよいです。

buildscript {
    repositories {
        maven {
            url 'https://raw.githubusercontent.com/nobuoka/vc-gradle-android-sdk-manager/mvn-staging/m2repo/'
        }
    }
    dependencies {
        classpath 'info.vividcode.android.build:android-sdk-manager:0.1.+'
    }
}

次に、プラグインを使用するプロジェクトにプラグインを適用します。

apply plugin: 'vc-android-sdk-manager'

そうすると、そのプロジェクトでは androidSdkManager という変数が使えるようになります。 androidSdkManagerupdateSdkComponents メソッドや updateSdkPlatformAndBuildToolsAfterEvaluate メソッドを持っていて、次のように実行することで、Android SDKコンポーネントのインストールや更新を行います。 (まだ最新のリビジョンがインストールされていない場合。)

// このメソッド呼び出し時に、指定のコンポーネントをインストールする。
// コンポーネントの指定は、android update sdk コマンドの filter オプションに指定する値。
androidSdkManager.updateSdkComponents(['tools', 'platform-tools', 'extra-android-m2repository'])
// プロジェクトの評価後に 'build-tools-XXX' と 'android-XXX' をインストールする。
// プロジェクトの `android` extension に設定された値を見て、どのバージョンをインストールするか決定する。
androidSdkManager.updateSdkPlatformAndBuildToolsAfterEvaluate()

また、上のように実行すると、インストール時のライセンスに同意するかどうかの入力はユーザーに委ねますが、次のように acceptLicenseAutomatically オプションを使うと、自動でライセンスに同意します。 自動でライセンスに同意しますので、使用する際には自身の責任でもって使用してください。

androidSdkManager.updateSdkComponents(['tools', 'platform-tools'],
        acceptLicenseAutomatically: true)
androidSdkManager.updateSdkPlatformAndBuildToolsAfterEvaluate(
        acceptLicenseAutomatically: true)

必要な場合にのみ実行するようにする

Android SDK の更新は毎回のビルド時にする必要はないので、次のように指定の Gradle プロパティがある場合にのみ実行するようにすれば良いでしょう。

// `setupAndroidSdk` プロパティがある場合にのみ SDK の更新を行う。
if (project.hasProperty('setupAndroidSdk')) {
    apply plugin: 'vc-android-sdk-manager'
    androidSdkManager.updateSdkComponents(['tools', 'platform-tools'])
    androidSdkManager.updateSdkPlatformAndBuildToolsAfterEvaluate()
}

上のようにビルドスクリプトに書いておくと、通常時は Android SDK の更新は実行されず、次のように setupAndroidSdk プロパティを設定したときには Android SDK の更新が実行されます。

./gradlew -PsetupAndroidSdk assembleDebug

内部でやっていること

内部的には次のことを行います。

  1. android list sdk --extended を実行し、指定されたコンポーネントが含まれているかどうか確認する。
    • 含まれているもののみをカンマで連結し、文字列 filters 生成。
  2. android update sdk --no-ui --all --filter filters を実行し、コンポーネントをインストール。

ただし、build-tools に関しては、未インストールでも android list sdk の出力に現れないため、インストール先ディレクトリが存在するかどうかを見てインストール済みかどうか判別しています。

(android コマンドは Android SDK の tools ディレクトリに入っているものです。)

類似のプロジェクト

Cookpad による類似のプロジェクトがあります。