sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Android Studio で Google Play sevicesを含んだGradleベースの新規プロジェクトを作る方法

2013/06/07追記

Android Studio 0.1.3 - 0.1.8で もっと簡単にGoogle Play servicesを含んだGradleベースの新規プロジェクトを作る方法 New!

ADT r22でGoogle Play servicesの組み込みがもっと簡単になりましたので、それにあわせた記事を書きました。 0.1.3&ADT r22からはこちらの新しい方法を使う方が良いと思います。

2013/05/31追記

Ver.0.1.2アップデートの記事に書いたように、0.1.2で再びProject Structureが表示されるようになりました。

2013/05/29追記

Ver.0.1.1アップデートの記事でも書きましたが、Android Studio 0.1.1はProjectStructureの設定画面が開きません。

この記事の内容を試すには、ProjectStructureを使う方が簡単ですので、 しばらくは0.1も残したままにしておく方が安全です。 (手作業で設定ファイルを編集すれば0.1.1でもたぶん可能だとは思いますが…)



Gradleを見ない振りの後ろ向きな開発環境のままでAndroidStudioを使うことに決めてはみましたが、やっぱりテストとかも走らせてみたいなということで、Gradleの勉強も兼ねてここ数日こっそり格闘していたのですが、id:kimukou_26 さんにアドバイスをいただきながら、無事に環境を構築できるようになりました。

Gradleがどんなものなのかもなんとなく理解できたし頑張った甲斐がありました。どうもありがとうございました > id:kimukou_26 さん

参照元ページ

Android Studio で ABSにチャレンジしてみた - exception think

やり方はここに書いてあるとおりなのですが、はまるポイントがものすごくたくさんあるので、私の方でも備忘がてら手順をメモ。

ちなみに、Google Play servicesだけじゃなく、いろんなライブラリプロジェクトでも応用できると思います。

目的

AndoroidStudioからの実行や、./gradlewでのコマンドラインでの各種操作が可能な、 Gradleベースの新しいアプリの開発環境を構築する。

必須

Google Play serviceや、自作のライブラリも組込むこと。

手順

新規プロジェクト作成

f:id:sos_jp:20130524130731p:plain

いつもの画面です。 アプリ名、アプリモジュール名、パッケージ名、プロジェクトの保存先、SDKのバージョン等。

0.1.2からProject Locationのデフォルトがアプリモジュール名+'Project'になりました。見分けやすくなりましたね。

あとは適当にnextを押していってプロジェクトを作成。

f:id:sos_jp:20130524131339p:plain

この段階でRunすると、Hello Worldなアプリが動きます。

Google Play services 追加

既にAndroid SDK Managerで Google Play servicesがPCにインストールされているものとします。

私の環境だと、ANDROID_SDK_HOMEは以下

/Users/shinjiotsubo/googledev/android-sdk-macosx

Google Play servicesのライブラリプロジェクトはさらにそこから下の

extras/google/google_play_services/libproject/google-play-services_lib

余談ですが、AndroidStudioのSDKのパスを eclipseのと同じものに変更して使用しています。環境特有のものもなさそうですし、今のところ問題はでていませんが推奨もされていませんので、自己責任でお願いします。 まぁ壊れても落とし直せば済む話なんですけど(^^;

さて、これをプロジェクトに追加するために、ProjectStructureを開きます。 Projectのペーンで、プロジェクトやアプリモジュール(ここではMyStudioPrjやMyStudioApp) を選び、コマンド+Enter(か、View->Open Module Setting)で開きます。

f:id:sos_jp:20130524133957p:plain

左側のModuleを選んで、上の+記号を押し、Import Moduleを選ぶと、インポートするフォルダを選ぶダイアログがでますので、Google Play servicesのライブラリプロジェクトの場所を選んで OKを押してください。 (Google Play servicesのフォルダではなく、その下の方のライブラリです)

どんな手段でインポートするのかとか、どんなjarとかライブラリプロジェクトをインポートするか聞かれますが、基本そのままでOKです。やり直したりすると余計なライブラリが見つかったりしますが、

必要なディレクトリは

  • google-play-services_libとその下のgenとsrcの3つ

必要なライブラリは

必要なモジュールは

だけです。

これらを選んでいけば、Modulesにgoogle-play-services_libが追加され、 Librariesにもgoogle-play-servicesが作成されます

選択内容によっては、Librariesにもgoogle-play-services_libができますが、使わないのであってもなくてもどっちでも構わないはずです。

補完のための依存関係を設定

Android Studio(というかIDEA)で補完をさせるために、アプリモジュールにライブラリの依存関係を設定してやる必要があります。

f:id:sos_jp:20130524150332p:plain

+を押して、Library... ModuleDependency...で必要なライブラリ等を追加してください。

Gradle関係

Android用の新しいビルドシステムに採用されたGradleは、build.gradleというファイルの内容に従ってビルドを行います。(要するにビルド用のスクリプトファイルと思えばいいらしい)

build.gradleは、プロジェクトやアプリモジュール、ライブラリモジュール、それぞれに必要ですので、ここからはそれらの設定を行います。

現状のAndroidStudioさんはGradle関係の設定をほとんどなんにもしてくれません。Ver.0.1のツールにそんなものを求めちゃ駄目ってことなのかもしれませんが、いろいろと漢らしいツールのようです。

google-play-services_libのbuild.gradle

eclipseでGradleなexportをしていれば自動で作られているのですが、なければ自分で作ります。 たんなるテキストファイルなので、google-play-services_libを選んでコマンド+NでFileを新規作成。ファイル名はbuild.gradleにします。

f:id:sos_jp:20130524141449p:plain

[/google-play-services_lib/build.gradle]

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android-library'

dependencies {
    compile files('libs/google-play-services.jar')
}

android {
    compileSdkVersion 8
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 8
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
}

プロジェクトのbuild.gradleとsettings.gradle

お次はプロジェクト本体のbuild.gradleとsettings.gradle

プロジェクトのbuild.gradleは、アプリモジュールのbuild.gradleのすぐ下に並んでいて紛らわしいので気をつけてください。

f:id:sos_jp:20130524140841p:plain

[/build.gradle]

repositories {
    mavenCentral()
}
apply plugin: 'idea'

[/settings.gradle]

include ':MyStudioApp'

androidSdkDir = System.getenv('ANDROID_SDK_HOME')

// Google Play services Library Project
library_alias = 'gpslib'

includeFlat library_alias
lib_prg = project(":$library_alias");
lib_prg.projectDir = new File(androidSdkDir,
        'extras/google/google_play_services/libproject/google-play-services_lib')
println "[name]=" + lib_prg.name
println "[dir ]=" + lib_prg.projectDir

library_aliasにライブラリのエイリアス名を設定し、lib_prg.projectDirで実際のフォルダの場所を指定してあげます。

フォルダをプロジェクトからの相対指定なら new File(settingsDir, '../hogehoge') にします。 絶対指定なら2つに分けないと変になります。(ANDROID_SDK_HOMEとその下にすると良い)

この辺りはAndroidStudioの未熟さ故の対応ですので、将来は不要になる可能性が大です。

環境変数を参照できるとコメントをいただきましたので、ANDROID_SDK_HOMEを参照するものに書き換えています。

アプリモジュールのbuild.gradle

いよいよアプリモジュール本体の設定。

[/MyStudioApp/build.gradle]

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
    compile project(':gpslib')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 17
    }
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['assets']
        }
        instrumentTest.setRoot('tests')
    }
}

肝はdependenciesの compile project(':gpslib')の中の文字列。見覚えがありますよね?

プロジェクトのsettings.gradleの中で定義した、ライブラリプロジェクトのエイリアス名の前に:を加えたものです。 settings.gradleの方は :無し、こっちは:有りで設定します。

自作ライブラリを追加する場合も、まずはプロジェクトにImportし、build.gradleを記述。プロジェクトのsettings.gradleにライブラリの所在を定義し、アプリモジュールのbuild.gradleのdependenciesに追加という手順になります。

.bash_profile

JDK6はデフォルトがSJISですので、環境変数の_JAVA_OPTIONSを使ってUTF-8として解釈するように設定しておきます。

[~/.bash_profile]

export _JAVA_OPTIONS='-Dfile.encoding=UTF-8 -Dgroovy.source.encoding=UTF-8'

こうしておけばOKです。

.gradle/gradle.properties

Gradleのデフォルトセッティングでも同様のことをやっておきます

[~/.gradle/gradle.properties]

systemProp.ANDROID_HOME=/Users/shinjiotsubo/googledev/android-sdk-macosx
systemProp.JAVA_OPTS=-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8

Gradle 1.6からは build.propertiesではなくgradle.propertiesが利用されるそうです。
ファイルのUTF-8の設定だけなら、.bash_profileが効いてるので、こちらは特に設定しなくてもOKかもしれません。私のところでは、AndroidStudio上からだとうまくfile.encodingの設定をjavaに伝播させられなかったのでもういいかなと。

完了

ここまでやっていれば、Android Studioでちゃんとビルドできるはず。

また、プロジェクトのフォルダで ./gradlew build ってしても BUILD SUCCESS です。


なんだかおかしな方向に情熱と工数をかけてみましたが、凄い人はNDKのプロジェクトのビルドもされていたりしますし、GoogleがGradleで行くっていってるんだから、少しは備えておかないといけないですよね、と少し言い訳:)

ということで、みなさんのAndroidStudio生活のお役に立てれば幸いです。

間違ってる所や足りない所のご指摘をお待ちしております!