整理したものはTech sheetsにあるよ

2016年3月22日火曜日

[Android]Jackを有効にしているとButterKnifeがうまく動かない

こんにちは!

Android N Previewの登場とともに、Jackも登場したねー!JackとはJava Android Compiler Kitのことで、Javaのソースとかをdexにするまでのツールチェーンなんだ。詳しいことはここを読んでね!

Jackを使ってみるには、次の4つが必要!

  • Android Studio 2.1 preview版を使っている
  • gradle pluginは2.1.0-alpha3
  • buildToolsVersionは"24.0.0 rc2"
  • build.gradleに設定をいれる

build.gradleには、こんな風に「Jack使うよー」と、「Java 8を使うよー」と記述するよ。そう、Jackを有効にするとJava 8の構文とかが使えるようになるんだ。ラムダ式も使えるようになるので、コールバックの部分が多少読みやすくなるよね!

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.0 rc2"

    defaultConfig {
        applicationId "com.mokelab.demoapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

いいことばかりのJackさんなんだけど、開発中なのか、困った動きをしてるんだ。。。

それが、今回のタイトルであるButterKnifeがうまく動かないという問題。ButterKnife.bind()を呼んでも実行時にちゃんとバインドされず、@OnClick()をつけたメソッドが呼ばれなかったりするんだ。実行時にようやくわかるのでタチが悪いよね!

何が起きてるかをちょっとだけ調べてみたよ。

  • aptでViewBinderクラスは生成されてるみたい
  • apkをばらして.classを確認すると、生成されたはずのViewBinderクラスはいない
もちろん、jackOptionsのenabledをfalseにするとapkにちゃんとクラスは含まれてて、思った通りの動きをするよ。

Jackの問題だと思うので、改善されるのを待つばかり。。。