Android Studio最速入門~効率的にコーディングするための使い方

第6回 Android StudioとGradle[後編]

この記事を読むのに必要な時間:およそ 9 分

[TIPS#7]build.gradle に日本語のコメントを入れたらエラーになりました

ビルドスクリプトもいろいろ設定を追加すればコメントを書きたくなると思うのですが,こちらも先ほどのJavaのソースコードと同じく,デフォルトエンコードの影響を受けます。

図26 日本語のコメントを含む build.gradle の実行例(エラーになる)

図26 日本語のコメントを含む build.gradle の実行例(エラーになる)

こちらもJavaのソースコードと同様に,

  • build.gradleをプラットフォームのデフォルトエンコードに合わせる
  • build.gradleのエンコードを明示する

の2通りの対策が考えられますが,Javaのソースコードと異なり後者の対応が簡単ではありません。なるべくエンコード設定の範囲を狭めたいと思ったのですが,コマンドライン,Android Studioの両方で有効だったのは環境変数JAVA_OPTSを使う方法でした。

表2 build.gradleのエンコードの指定箇所

エンコードの指定箇所Android Studioコマンドライン
<HOME>/.gradle/gradle.propertiesに設定無効有効
環境変数JAVA_OPTSに設定有効有効

リスト6 エンコードの指定方法

<HOME>/.gradle/gradle.properties
  org.gradle.jvmargs=-Dfile.encoding=UTF-8

環境変数 JAVA_OPTS
  export JAVA_OPTS='-Dfile.encoding=UTF-8'

このいずれの方法もbuild.gradleのエンコード指定」ではなく「デフォルトエンコードを強制的に変更する」という意味にあたります。この設定をしてしまうと,先ほど紹介した「Javaのソースコードのエンコード指定」も軒並み影響を受けるため,個人的には身もフタも無いやり方だと思っています。build.gradleに対するスマートなエンコード指定があって欲しいものです(なおGroovyスクリプトのエンコード指定であるgroovy.source.encodingはGradleには有効ではないようです⁠⁠。

このあたりの詳細についてはJGGUGのuehajさんが自身のブログで説明されています。

この説明で言及のあった3つの解決策のうち,最後の1つがGradleで日本語コメントを使う妥協点なのでは?と思いました。

教訓は,デフォルトエンコーディングとスクリプトのエンコーディングが異なるなら(1)文字コード変換するか(2)実行時に正しくencodingを指定せよ (3)スクリプトのコメントについて文字コードなんてこまけーこたあ良いんだよ,といいたい場合は,/**/を推奨。⁠or行末に空白でも入れとけ)

コメントに何を書いてもいい」と思うのは,/**/については正しいが,//については正しくない - uehaj's blog

つまりは,図27のようなコメントスタイルを用いた方が良いのでは?という話です。

図27 ブロックコメントだと日本語が含まれても平気

図27 ブロックコメントだと日本語が含まれても平気

「行コメントの後に空白を入れておく」のは,エディタの設定で『不要な空白を除去する』事が可能なため推奨しません。

[TIPS#8]Android Studioに「Gradleの割り当てメモリが足りない」と怒られます

図28 Gradleの割り当てメモリ不足エラー

図28 Gradleの割り当てメモリ不足エラー

このエラーはWindowsで32bit JVMを使っている場合に見かけます(Mac版では見かけたことがありません⁠⁠。どうもAndroid Studioが内部で実行しているGradleに割り当てているメモリが 1024MB(-Xmx1024m)であることが起因しているようです<AS_SYSTEM>/log/idea.logで確認できます⁠⁠。

これを回避するために<HOME>/.gradle/gradle.propertiesリスト7のような設定を追加します。

リスト7 gradle.propertiesに割り当てメモリの指定をする

org.gradle.jvmargs=-Xmx512m

 The Build Environment - Gradle User Guideより

[TIPS#9]インクリメンタルビルドは無いの?

無いです。

そもそもインクリメンタルビルドはEclipse固有の特徴で,これがあるからEclipseを使っているという人もいるほどです。多少,情報に詳しい人は「IntelliJもver12から自動ビルドが付いたでしょ?」と思われるかもしれません。

Android Studioのビルドが「Gradleベースになった」という罠がここにもありまして,たしかにAndroid Studioにも「Preferences / Compiler」「Make project automatically」という項目がありますが,これを有効にしても自動ビルド(インクリメンタルビルド)は有効になりません。

図29 ⁠Preferences / Compiler」の設定画面

図29 「Preferences / Compiler」の設定画面

なにより,この「Preferences / Compiler」の設定画面そのものがほとんど意味を持たないと思っていた方がよいでしょう。⁠Preferences / Compiler / Android DX Compiler」といういかにもな設定画面も同様です。

まとめ

ここまで読んで「あぁ,しばらくAndroid Studio使うの止めた」と思った人も少なからずいると思います。そこはやっぱりEAP(Early Access Preview)ですので,そう判断するのも正解のひとつではないでしょうか。

Android Studioがv0.1~v0.1.3までにアップデートを繰り返したのを見て,気付いたことはこの2点です。

  • 本気でビルドをGradleベースbuild.gradleが原本)にしようとしている
  • Project Structureを何とかしてbuild.gradleと連携させようとしている

Android Studioが開発中でGradleとの連係がままならない中で,ちょっとでも凝ったビルドをしようと思うと,GradleおよびAndroid Studioの両方に対して深い知識が必要になります。Android Studio側に至っては推理力も必要で,ややもすればAndroid Studioのソースを追いかけないと困ることもありました。さすがに,そこまで来ると本末転倒も甚だしいなと思い,すんでの所で留まりましたが……。

不毛だなと思う反面,Android StudioとGradle連係部分は未開の地であるため,先駆者になれるチャンスが埋まっています。我こそはと思う方には,ぜひこの荒野を開拓していって欲しいと願うばかりです。

前後編に分けて説明したAndroid StudioとGradle連係については,これでおしまいとします。次回からは,Android Studioが(IntelliJから受け継いで)もともと備えている便利な機能について説明していきます。

おまけ

本文中に細切れで紹介していたbuild.gradlegradle.propertiesの完全なリストを載せておきます。

リスト8 <PROJECT_HOME>/MyFirstApp/build.gradle

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

repositories {
    /* Mavenリポジトリの指定 */
    mavenCentral()
}

dependencies {
    compile files('libs/android-support-v4.jar')
    compile 'com.google.code.gson:gson:2.2.4'
    /* ちまちま面倒な場合は,上の2行を消して次の行を有効にする */
    //compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

tasks.withType(Compile) {
    /* コンパイル系のタスクでエンコードをUTF-8に指定する*/
    options.encoding = 'UTF-8'
}

リスト9 <HOME>/.gradle/gradle.properties

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
#org.gradle.jvmargs=-Xmx512m -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx512m

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai