Gradle, ProGuard, intellij-plugin周りの備忘録
intellij plugin開発時に難読化したbuildを生成しようとした時の備忘録。
流れ
- intellij marketplaceドキュメントを見て、ProGuardがいいかなと適当に判断
- ざっとググったらandroid関係の記事ばかりでよくわからなかったのでProGuardドキュメントへ
- そもそもgradleの書き方わからないし、javaのcompileからbuild生成の流れもわからないと厳しそうだったので遠回り。
- gradleのドキュメント でgradleの基本とjava pluginについての記事を読む
- java pluginのタスクを順に実行してみてcompile - buildの流れを把握
- proguardのタスクをどう組み込めばいいかを gradle-intellij-pluginのコードを見ながら検討
- 一旦proguardタスクを単体で実行できるかtry
- lib/rt.jarがない周りの問題にハマり、
dontwarn
でいいんじゃないかと判断 - (proguard設定のサンプル集)https://github.com/Guardsquare/proguard/tree/master/examples/gradle を見ながらkeep周りの設定
- lib/rt.jarがない周りの問題にハマり、
- gradleのドキュメントをなんども見返しながら、なんとかproguard taskをbuildに組み込み
理解したことmemo
- defaul scopeがproject
- DSL Referene Home のCoreTypeのProjectを見れば大体わかる
- projectがビルドのベース。multi projectというのもあるらしい。
- java pluginがprojectを拡張している
sourceCompatibility
とかはjava pluginが拡張したもの
manualの見方
- DSL Referene Home に主要なclassの説明がある
- 落ち着いて時間をかけて読んで大体わかるようになった
configurations
- implements fileList
- content is dependency files(because configurations is dependency configuration)
- Railsっぽい魔法感がある
- ビルドツールとしてのeasyさを追求している感じ
- 最初は訳がからないけど少しわかってきたら便利
- implements fileList
configuration fase and execution fase
file path convention
life cycle task
- Base Plugin が提供するtaskに色々紐付ける形になっている
build.build
とintellij.buildPlugin
どっちでも同じようにbuildできるのが不思議だった
task間のやりとり
- dependeOnで指定したtaskから色々情報が得られる
- taskの取得はdocumentのTaskContainerを見れば大体わかる
- AbstractTaskのpropertyを使う
- 必要であればsubTypeのcastして固有のpropertyを使う
configurations.compile.collect {}
のように、configurationsのdependencyからとるようなケースもある
- dependeOnで指定したtaskから色々情報が得られる
java compile flow outline
- what is fat jar
- compile java to class files
- jdk
- library jars
- jar
- class files
- resources
- build
- jar
- runtime dependency jars
proguard
- ${javaHome}/libs/rt.jar
- javaのcoreが入ったjar
- libraryjarsにこれを指定するのがデファクトスタンダードぽい
- javaのversionや配布元によってなかったりする
- shrink, optimazeするため、dependenciesのjarを指定する必要があって、適切に指定しないとwarnが出る
- obfuscateだけしたいなら
dontwarn, dontshrink, dontoptimize
を指定すれば、 jarを指定しなくてもok- depedency jarを省くとdependency内のclassをoverrideしたメソッド名も変更されてしまって壊れる(dependecy jarを指定して試してないからもしかして関係なく壊れる?)
- keepを指定することで避けられる。例えば下記のような
- depedency jarを省くとdependency内のclassをoverrideしたメソッド名も変更されてしまって壊れる(dependecy jarを指定して試してないからもしかして関係なく壊れる?)
- ${javaHome}/libs/rt.jar
keepclassmembers '!public class * { \ public protected <methods>; \ }'
振り返り
- Gradle魔法感があってとっつきにくそうと思ったけど、ドキュメントが丁寧に書かれていたので、ちゃんと読めばなんとか理解できた
- 既存のbuildの流れにちょっとしたタスクを組み込みたいだけでも色々理解しなければならないことが多くて大変だったけど、結局理解していく過程は充実感があるから、これもプログラマの醍醐味?
- 難読化も魔法じゃない