2015年10月9日金曜日

eclipseADT から Android Studio への移行

 mac が EL Capitan に変わって Java 6 とかゴッソリ削られて eclipse で build するのが面倒臭くなってきたのをきっかけに、Android 開発環境の移行をしました。 eclipse ADT がサポートを打ち切られるのも年内がリミットですしね。
 自分は、巷に解説されるように プロジェクトとサブプロジェクトでライブラリも構築するという事はやっていませんでした。 複数プロジェクトからライブラリを参照しているからで、基本 jar ファイルを参照する方式をとっていました。
|-- Application
|   |- Foo
|   |- Bar
|
|-- Libraries
|   |-- Hoge
|   |-- Fuga
|
|-- Ref
      |-- Java
      |      hoge.jar
      |      fuga.jar
      |
      |-- Key
             debug.keystore
             release.keystore
eclipse ADT は、こんな感じですわ。
それを
   |- Foo
   |- Bar
   |-- Hoge
   |-- Fuga
   |-- Ref
      |-- Java
      |      hoge.jar
      |      fuga.jar
      |
      |-- Key
             debug.keystore
             release.keystore
という構成に Android Studio では、しました。
まずは、ライブラリの移行です。
Android Studio から、 import project (eclipse ADT, gradle, etc) を選択しライブラリを変換します。
依存関係の構築を行うために
Hoge/app/build.gradle
ファイルを編集します。
apply plugin: 'com.android.application'

android {
    compileSdkVersion 13
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "jp.co.company.Hoge"
        minSdkVersion 13
        targetSdkVersion 13
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

// ここに依存関係で使用しているライブラリを指定します。
dependencies {
    compile files('../../Ref/Java/helper.jar')
    compile files('../../Ref/Java/calc.jar')
    compile files('../../Ref/Java/sqlcipher.jar')
}

// 古い jar ファイルが存在した場合は削除するタスク
task cleanDebugJar {
    def classes = new File('build/intermediates/bundles/debug/classes.jar')
    if( classes.exists() ) {
        delete '../../Ref/Java/hoge.jar'
    }
}

// debug でビルドした時は Hoge/app/build/intermediates/bundles/debug/classes.jar が
// 生成されるようになっているので、それを共通のディレクトリにコピーするタスク
task generateDebugJar(type: Copy, dependsOn: [cleanDebugJar,assembleDebug] ) {
    from 'build/intermediates/bundles/debug/'
    into '../../Ref/Java/'
    include('classes.jar')
    rename('classes.jar', 'hoge.jar')
}

/*
// debug でビルドされる jar ファイルは、そのまま流用できる。
// release で自前で作成しても debug で作成されるものと同じなので
// コメントアウトしている=必要ない。
// 将来的にデバッグ情報が付加された jar が生成されるとか
// 状況が変われば、この辺のコードは有用かもしれない。

// release でビルドした時は、jar ファイルが生成されない。
// よって、自前で jar ファイルを生成するためのタスク
task makeReleaseJar(type: Jar, dependsOn: assembleRelease) {
    from fileTree(dir: 'build/intermediates/classes/release')
    from fileTree(dir: 'src/main/resources/')
    into 'build/intermediates/bundles/release/classes.jar'
}

// 古い jar ファイルが存在した場合は削除するタスク
task cleanReleaseJar {
    def classes = new File('build/intermediates/bundles/release/classes.jar')
    if( classes.exists() ) {
        delete '../../Ref/Java/release/hoge.jar'
    }
}

// jarファイルを共通のディレクトリにコピーするタスク
task generateReleaseJar(type: Copy, dependsOn: [makeReleaseJar, cleanReleaseJar, assembleRelease]) {
    from 'build/intermediates/bundles/release/'
    into '../../Ref/Java/release/'
    include('classes.jar')
    rename('classes.jar', 'hoge.jar')
}
*/

// 間抜けな事に Android Studio のビルドから Java class ファイルを
// コンパイル生成した後に task を実行する手段が見つけられない。
// (Build -> Clean Project, Build -> Rebuild Project)
// これは、ビルド・プロセスにおけるクリーンナップが行われる前に、前回生成した
// *.class ファイルを jar 化したものに対して、コピー操作を行うという方法
// 2回ビルドしないと最新の jar にならない。
// IDEからビルドしただけでは動作しないので、皆ターミナルから、
// task を指定する形で実行している。
//assembleDebug.dependsOn(generateDebugJar)
//assembleRelease.dependsOn(generateReleaseJar)
コメントに書いてあるように、ターミナル・ウィンドウから
./gradlew generateDebugJar
を実行します。

0 件のコメント: