about 5 years ago

環境

  • Eclipse
  • Android SDK Tools はv22以上(恐らく)

build.gradleを作成する

コンテキストメニューを開く。Export->Generate Gradle build files->build.gradleを作りたいプロジェクトをチェックしてFinish

以下のような内容のbuild.gradleが生成される。ここで、恐らくgradlew(bash)、gradlew.bat(Windows)も一緒に生成される。もしされないなら、sdk/tools/templates/gradle/wrapper以下のファイルをプロジェクトルートにコピーする。gradlew、gradlew.batはラッパースクリプトになり、Gradle による管理に必要なjarなど自動的に持ってきてくれる。今後、これを使ってGradle による管理ができる。

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

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    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')
    }
}

環境変数ANDROID_HOMEを設定する

環境変数ANDROID_HOMEへAndroid SDKへのパスを設定する。環境変数の設定方法は各OSに依存する。

プロキシサーバの設定をする(オプション)

インターネット接続がプロキシサーバ経由のみの環境であれば、HOME/.gradle/gradle.propertiesへプロキシサーバへのアクセス方法を示すことができる。

systemProp.http.proxyHost=192.168.11.1
systemProp.http.proxyPort=8080

ビルドする

$ ./gradlew build

buildタスクが成功した場合したならapkはbuild/apkへデバッグとリリースの両方が非署名の状態で生成される。他のタスクはtasksタスクで確認できる。

文字コード関連の問題への対処

"警告:この文字は、エンコーディング MS932 にマップできません"に対する対処

ビルドでこのエラーがでたならばbuild.gradleに設定を加える

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

build.gradleのコメントに日本語があるとタスクの実行に失敗

gradlew.batのDEFAULT_JVM_OPTSへ"-Dfile.encoding=UTF-8"を設定する

proguardの設定したい

proguardを加えたビルドをしたい場合sourceSets の下に後述の設定を加える。ビルドが成功すると、/build/proguard/release/にmapping.txtなどproguardの成果物が生成される

buildTypes {
    release {
        runProguard true
        proguardFile getDefaultProguardFile('proguard-android.txt')
        proguardFile file('proguard-project.txt')
    }
}

/build/proguard/release/を保存したい

mapping.txtはあとで必要になる可能性があるので自動的にアーカイブしてどこかに保存したい

task archiveProguardDocs (dependsOn: 'build', type: Zip){
    description = "copy proguard files after the build task"
    version = getManifestVersionName()
    from 'build/proguard/'
    doLast {
        println archiveName
        println relativePath(destinationDir)
        println relativePath(archivePath)
    }
}

String getManifestVersionName() {
    File manifestFile = file("$project.projectDir/AndroidManifest.xml")
    return (manifestFile.getText() =~ /android:versionName="(.+)"/)[0][1]
}

getManifestVersionName()については、https://plus.google.com/110774282522099816721/posts/MuK3mj6vFCW

出力先は、デフォルトでbuild/distributionsとなるが、intoメソッドで別の場所も指定可能。

外部ライブラリを使いたい

dependencies 内で依存関係を解決する。buildscript 内で記述を行うとビルドスクリプト自体で利用するライブラリの依存性を解決する。外ならアプリビルドの依存性解決を行う。ビルドエラーで依存性解決ができない場合(Could not resolve all dependencies for configuration)はdependencies を見直す

Maven Central 管理されているライブラリならば

buildscript {
    repositories { mavenCentral() }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
        classpath 'net.sf.json-lib:json-lib:2.3:jdk15'
    }
}

プロジェクトのディレクトリにおいたライブラリを使いたいならば

buildscript {
    repositories { mavenCentral() }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
        classpath fileTree(dir: 'dirname', include: '*.jar')
    }
}

javadoc生成

task generateJavadoc(type: Javadoc) {
    source = ['src', 'gen']
    destinationDir = new File("doc/javadoc")
    options.setEncoding("UTF-8")
    ArrayList<File> doclavaPath = new ArrayList<File>()
    doclavaPath.add(file("exlibs/doclava.jar"))
    options.setDocletpath(doclavaPath)
    options.setDoclet("com.google.doclava.Doclava")
    ArrayList<File> classPath = new ArrayList<File>()
    classPath.add(file("$System.env.ANDROID_HOME/platforms/android-17/android.jar"))
    classPath.add(file("libs/android-support-v4.jar"))
    options.classpath(classPath)
    options.showFromPrivate()
    options.bootClasspath(new File('$System.env.JAVA_HOME/jre/lib/rt.jar'))
    options.optionFiles(file('doc/javadoc.options'))
    doLast {
        println 'generating javadoc'
    }
}

docletとしてdoclavaを使用した例。doclava固有のオプションについてはoptions.optionFiles()で設定する。javadoc.optionsは単にオプションとその引数が書かれているだけである。

-generatesources -templatedir doc/doclava_templates

なお、gradleで-windowtitle,-doctitleオプションが自動的に設定される場合は、doclava側のソースコードを修正しないとdoclavaが動作しないかもしれない。

別プロジェクトに依存している

アプリケーションが他のライブラリに依存しており、ライブラリをソースコードからビルドする必要がある場合はsettings.gradleでマルチプロジェクトを扱えるようにする必要がある。

例えばアプリケーションプロジェクトappとライブラリプロジェクトlibがあるとする。settings.gradleには

include 'app'
include 'lib'

または

include 'app', 'lib'

と書ける

これでappからlibを参照してビルドすることができる。settings.gradleはappとlibと同じディレクトリにあればいい。

appのbuild.gradleには

dependencies {
  compile project (':lib')
}

これでappをビルドするときはlibが必ずビルドされるようになる。基本的にはこれで問題無いと思うが、build.gradle(setteings.gradleと同じディレクトリにおく)にさらに設定が必要かもしれない。

以下はgithubで公開されるOSSのPhotoViewと一緒にビルドをするために必要な設定である。ここのbuildscriptでlibとappのビルドスクリプトに必要なライブラリを使うための設定ができる。project(':PhotoView:library')内でversionとgroupを設定しているが、なぜこれが必要になるか実はよくわからない。ただ、これが無いとエラーでlibのビルドが失敗する。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

project(':PhotoView:library') {
    group = 'uk.co.senab.photoview'
    version = '1.2.2-SHAPSHOT'

    repositories {
        mavenCentral()
    }

    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
}

もっと知りたい

Android固有

http://tools.android.com/tech-docs/new-build-system/user-guide

Gradle全般

http://gradle.monochromeroad.com/docs/userguide/userguide.html

← markdownのテスト Android Studio →