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
  • gradleのドキュメントをなんども見返しながら、なんとかproguard taskをbuildに組み込み

理解したことmemo

  • defaul scopeが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さを追求している感じ
      • 最初は訳がからないけど少しわかってきたら便利
  • configuration fase and execution fase

  • file path convention

  • life cycle task

    • Base Plugin が提供するtaskに色々紐付ける形になっている
    • build.buildintellij.buildPlugin どっちでも同じようにbuildできるのが不思議だった
  • task間のやりとり

    • dependeOnで指定したtaskから色々情報が得られる
      • taskの取得はdocumentのTaskContainerを見れば大体わかる
      • AbstractTaskのpropertyを使う
      • 必要であればsubTypeのcastして固有のpropertyを使う
    • configurations.compile.collect {} のように、configurationsのdependencyからとるようなケースもある
  • java compile flow outline

    • what is fat jar
    • compile java to class files
      • jdk
      • library jars
    • jar
      • class files
      • resources
    • build
  • proguard

    • ${javaHome}/libs/rt.jar
    • shrink, optimazeするため、dependenciesのjarを指定する必要があって、適切に指定しないとwarnが出る
    • obfuscateだけしたいなら dontwarn, dontshrink, dontoptimize を指定すれば、 jarを指定しなくてもok
      • depedency jarを省くとdependency内のclassをoverrideしたメソッド名も変更されてしまって壊れる(dependecy jarを指定して試してないからもしかして関係なく壊れる?)
        • keepを指定することで避けられる。例えば下記のような
keepclassmembers '!public class * { \
    public protected <methods>; \
}'

振り返り

  • Gradle魔法感があってとっつきにくそうと思ったけど、ドキュメントが丁寧に書かれていたので、ちゃんと読めばなんとか理解できた
  • 既存のbuildの流れにちょっとしたタスクを組み込みたいだけでも色々理解しなければならないことが多くて大変だったけど、結局理解していく過程は充実感があるから、これもプログラマの醍醐味?
  • 難読化も魔法じゃない