読者です 読者をやめる 読者になる 読者になる

メヘンニミン

たくさんの言語に触れたい.走り書きで見る整理ブログです.

Eclipse開発者視点のAndroid Studio+Gradle理解

スマートフォン向けアプリ開発の話題です.先日も本屋さんに行ってびっくりしました.
こんなに開発環境増えてたの!

Androidネイティブアプリの開発現場ではIDEEclipseが採用されがちですが,このほかにも日本ではNetBeans,海外ではIntelliJ IDEAという環境も次点で選ばれているそうです(もちろん,どれもオープンソース).Android Studioは,このうちの3つ目をAndroid開発に特化させた公式IDEです.公式,つまり提供元がGoogleさんなのです.特化,公式,それは正義

というわけで今回は,Android Studioの導入と,理解の決め手となるビルドツールGradleの話です.

環境構築

細かいエディタ設定なども含め,ここ2つを参考に.

AndroidStudio - Android Studio のインストールから一通り設定するまでのメモ - Qiita
第 3 回・新 IDE : Android Studio を使ってみよう! | ピックアップ | ギャップロ

Tools => AndroidSDKマネージャがあります.Android SDKもここでインストールしましょう.相変わらず長い.

Eclipseとの違いは?

f:id:enlosph:20150131131930j:plain:w500
個人的にはエラー箇所がわかりやすい,という細かなデザインが好きですが…

僕がEclipseをやめてAndroid Studioを使っている10の理由 - ナカザンドットネット

どうやら標準で付いているビルドツールGradle(グレイドル)が最大の相違点であり,長所であり,理解のクセモノであるようです.

Gradleをマスターして「ビルドもいける人」になる | 翔泳社の本

ビルドツールにも変遷があります.Maven(メイブン)といえば,Eclipseと組み合わせて使うと,例えば指定したライブラリjarファイルを自動で探してきてDL,導入コストを軽減してくれます.

Mavenでは,このようなビルド時の設定をXMLファイルに記述します.一方でGradleは,Groovy(グルービー)というスクリプト言語を用います.つまり,こいつを勉強すればイイわけですね.よーし.

なお,Gradle自体はEclipseでも利用できます.

Gradle入門 - Qiita

Android + Gradleの基礎理解

新規作成したプロジェクトフォルダに含まれる.gradleファイルは以下の3つ.
(1) setting.gradle
(2) build.gradle
(3) app\build.gradle
Android Studioはマルチプロジェクト対応です.(1)(2)はメインプロジェクトに1つずつ.(3)は各サブプロジェクト(ここではapp)に置かれるファイルです.記述内容の違いは以下が詳しいです.

AndroidStudioのbuild.gradle、setting.gradleについて - Qiita

上記を参考に,ここで(2)build.gradleの中身を覗いてみます.

buildscript { // ビルドツールの設定
    repositories { // 外部からインポートするjarリポジトリ
        jcenter() // Bintray
    }
    dependencies { // 依存関係にあるファイル
        // Android Gradle Pluginを導入
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

allprojects { //サブプロジェクトを含む全プロジェクトの設定
    repositories {
        jcenter()
    }
}

(3)app\build.gradleも見てみましょう.実のところ,こちらをいじることの方が多いようです

// Android Gradle Pluginの適用
apply plugin: 'com.android.application'

android { // Android Gradle Pluginの設定
    // SDKバージョン.なるべく最新に
    compileSdkVersion 21 // 必須プロパティ
    buildToolsVersion "21.1.2"

    defaultConfig { // Google Playなどが必要とする設定
        applicationId "com.example.sample.mytestapplication"
        minSdkVersion 15 // 最低動作SDKバージョン
        targetSdkVersion 21 // 開発テスト済みのSDKバージョン
        versionCode 1 // Google Playの識別用バージョン
        versionName "1.0" // アプリ利用者に見せるバージョン
    }
    buildTypes { // apkごとの設定
        release { // リリース用
            minifyEnabled false //デバッグモード
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies { //依存関係
    //ローカルライブラリの取得
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    //AppCompatライブラリをリモートで取得
    compile 'com.android.support:appcompat-v7:21.0.3'
}

ご覧のとおり,すでに書かれている記述を見るだけでも,それなりの設定をGradleが担っていることがわかります.

buildTypes

Release時に必要な署名情報を書けるほか,Build Variantという概念を理解することで,複数のAPK作成に対応しやすくなります.例えばリリース版/デバッグ版/β版,無料版/有料版…という風に組み分けて,署名情報や参照するresフォルダを別々に与えてあげる,なんてことができます.開発者には嬉しい自動化です!

この機能に備えるように,Android StudioにはBuild Variantという項目があります.試しに,以下のコードを(3)のbuildTypes内に記述し,Android Studioに戻って[Sync Project with Gradle Files]ボタンを押して更新してみてください.このボタンは,.gradleファイルのエラーチェックにも対応しています.

debug{
    applicationIdSuffix = '.debug'
    versionNameSuffix = 'd'
}
alpha{
    applicationIdSuffix = '.alpha'
    versionNameSuffix = 'a'
}
beta{
    applicationIdSuffix = '.beta'
    versionNameSuffix = 'b'
}

f:id:enlosph:20150131121635j:plain:w200 alpha,betaが増えました.すぐに同期するイイ子.
Build Variantの書き方,詳しい設定はこちらがわかりやすいです.

AndroidStudio - Android Studio で Build Variants - Qiita

dependencies

ライブラリファイルは,app\libsに入れると機能します.一方,リモートで取得する場合(今回はQRデコードライブラリZXingを導入します),(3)に以下のように記述しました.

repositories {
    mavenCentral()
    maven {
        url "http://dl.bintray.com/journeyapps/maven"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'

    compile 'com.google.zxing:core:3.1.+' // +は最新版を取得の意味
    compile 'com.journeyapps:zxing-android-embedded:2.0.1@aar'
    compile 'com.journeyapps:zxing-android-integration:2.0.1@aar'
}

そして実装..java内で,IntentIntegratorクラスが使えることを確認してください.

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

protected void startScan(){ // QRデコーダの設定と起動
    IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
    
    integrator.setResultDisplayDuration(0);
    integrator.setWide();
    integrator.setCameraId(0);
    integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES);
}
 
@Override // QRデコード結果を取得
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    TextView message = (TextView)findViewById(R.id.resultText);

    String result = scanResult.getContents();
    message.setText(result);
}

f:id:enlosph:20150201181510j:plain:w600
QRデコーダができました.

ほか,build.gradleでやれること.

僕の考えた最強で平凡なbuild.gradle

おわりに

プロジェクト管理やバージョン管理は,アプリ開発者における細かな悩み種のひとつ.ソースやデザインはよしとしても,ここらの設定で「うそー!うまくいかない!」こともあるでしょう.

次世代ビルドツール・Gradleの利用環境では,GUIに頼らない簡潔な記述に,これらの設定を集約します.僕はその本屋で,「へー.ビルドツール.面白いなー」と感じました(小並)

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

次回のAndroidネタでは,ログデータ取得手法を考えます.