きょこみのーと

元六本木でGo書いてました。今はVRでGo書いてます。

gradleでCocos2d-x3.0alpha1のアプリをbuildしてAndroidのapkを作成する

はじめに

gradleいいよ!最近ハマってます。 Javaライクなshellスクリプトな感じなのかな?と思ったら、pluginが充実していてAndroidのbuildType分けでversion変えたりソースフォルダの向き先を変えたりできて、とても重宝してます。

AndroidStudioもまだ0.4.0でツンデレだけど今後が楽しみです。

今回は、Cocos2d-xの3.0alpha1で作ったプロジェクトをgradleでbuildして実機にinstallしちゃいます。 ちょっとやることが多いので、gradle慣れてない人は辛いかも;;

前提

  • MacOS
  • gradleがインストール済み(v1.9)
  • pythonがインストール済み
  • android ndkとsdkのpathが通っている
  • Cocos2d-x3.0alpha1(alpha0とかだとpathが異なるので注意)

やること一覧

  • build.gradleの作成
  • proj.android/build.gradleの作成
  • cocos/2d/platform/android/javaをサブプロジェクトとして組み込む(以降、libcocosと呼ぶ)
  • modules/libcocos/build.gradleの作成
  • settings.gradleの作成

build.gradleの作成

プロジェクト直下にbuild.gradleを作成します。

$ tree -L 1
.
├── Classes
├── Resources
├── build.gradle ★作成
├── modules
├── proj.android
├── proj.ios_mac
├── proj.linux
└── proj.win32

中身は一旦空でもいいんだけどあとで書くのもあれなので、先にlibcocosの設定を書いておく。

build.gradle

project(':modules:libcocos') {
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.7.+'
        }
    }
}

proj.android/build.gradleの作成

copyNativeLibsらへんがミソ。 これでcocos2d-xのlib.soをアプリのパッケージング時に含むことができるようになる。

proj.android/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

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

apply plugin: 'android'

dependencies {
  compile project(':modules:libcocos')
}

android {
  compileSdkVersion 19
  buildToolsVersion '19.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']
    }
  }
}

// https://gist.github.com/khernyo/4226923
task copyNativeLibs(type: Copy) {
        // libs/armeabi下にある*.soをすべてbuild/libs/armeabi下にコピーする
        from(new File('libs/armeabi')) { include '**/*.so' }
        into new File(buildDir, 'libs/armeabi')
}

// compileTask呼び出し時にcopyNativeLibsを呼び出すように指定
tasks.withType(Compile) { compileTask ->
        compileTask.dependsOn copyNativeLibs
}

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add(new File(buildDir, 'libs'))
}

// cleanの前にcleanCopyNativeLibsを依存するように指定
clean.dependsOn 'cleanCopyNativeLibs'

libcocosをサブモジュールに組み込む

プロジェクトの直下で以下のシンボリックリンクを生成する。

$ ln -s ../../../cocos/2d/platform/android/java modules/libcocos

libcocos/build.gradleの作成

module/libcocos/build.gradle

apply plugin: 'android-library'

android {
        compileSdkVersion 19
        buildToolsVersion "19.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']
                }
        }
}

settings.gradleの作成

$ tree -L 1
.
├── Classes
├── Resources
├── build.gradle
├── modules
├── proj.android
├── proj.ios_mac
├── proj.linux
├── proj.win32
└── settings.gradle ★作成

settings.gradle

include ':proj.android', ':modules:libcocos'

これで準備は完了。

ビルド手順

プロジェクト直下で以下のコマンドを実行でビルドとインストールが行える。

$ gradle clean

$ ./proj.android/build_native.sh clean

$ ./proj.android/build_native.sh

$ gradle installDebug

環境できてから記憶をたどってブログに書き起こしたので、もしかしたら抜けがあるかも。。。

eclipseに依存する開発スタイルからオサラバできるのは素敵ですね。

(別にeclipseをdisってるわけではないです!ecipseはとても素敵なIDEですよ( ^ω^))

2014/02/19 追記

kimukou_26さんに色々補足して頂いてとても参考になりました! http://d.hatena.ne.jp/kimukou_26/20140205/