proguardの設定をCLIから追加できるGradleプラグイン書いた

hotchemi/gradle-proguard-plugin

表題通りのGradle Pluginを書いた.

詳しい使い方はREADMEに書いてあるのでそちらを参照して欲しい.

ハンズオンを撮影したのでこれを見ればどういうのか分かる.

なぜ作ったのか

Androidにはproguardという仕組みがあり、ソースコードの難読化や最適化を行ってくれる.

defaultの設定だとリフレクションを使っている箇所やAnnotation Processingをしている様な実装は参照なしと見なされてソースコードから消されるので、それを防ぐ為に記述を追加しないといけない. 例えばAndroidに最適化されたEventBus実装であるOttoは以下の様な記述を必要とする.

-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

ライブラリを入れる度にこういう記述をサイト見に行ってコピペするのは辛い.

ちょっと前にkrschultz/android-proguard-snippetsというプロジェクトを見つけた.これは上記の記述を1つのリポジトリに集約してしまおうというawesomeな取り組みで大変良かった.ただproguardファイルが次々に増えていくのが嫌だったのとイチイチここに見に来るのは嫌だったので今回プラグインを作った.

使い方

インストールはAndroidのrootのbuild.gradleに以下を追加する.

apply plugin: 'add.proguard'

buildscript {
    repositories {
            jcenter()
    }
    dependencies {
        classpath 'com.github.hotchemi:gradle-proguard-plugin:0.1.0'
    }
}

後は単純でこんな感じのコマンドを打つ.

./gradlew aP -Plib=butterknife

こうするとプロジェクト内の.proファイル(proguardの設定ファイル)に、butterknifeに関する設定を追加してくれる.

実態はここにあるファイルを取得してきているだけ.

当然ここに無いものは取得できないので必要な場合はandroid-proguard-snippetsの方にpull requestを出して欲しい.

複数指定する事もできる.

./gradlew aP -Plib="butterknife gson rx-java"

既に.proファイルにライブラリに関する記述がある場合は、ミスって上書きしてしまうと嫌なので一旦確認しろって警告出してくれる.気が利く.

proguard-rules.pro already contains library's snippet. Do you continue(y/n)?

Android開発者が使いやすいようにGradle Pluginとして書いたが、CLIからの引数の渡し方があまりスマートでないのでPythonで書けば良かったと思っている.