android gradle plugin でAop(2017/10時点)

あとで追記予定

はじめに

また仕事でAOPを使いたくなったので、再度調べてみた

というか、

  • 関数の開始終了ログ
  • 処理時間のログ

がほしいみたいなエビデンス欲しがる要望いつも多いよな・・・(苦笑

以前の記事は

動作環境

  • Windows 10
  • 8G
  • AS 3.0-RC2
  • gradle plugin 2.3.3
  • gradle runtime-4.1-bin

利用プラグイン

以前と同じく

を利用。

記述は以前のDemo Project記述では動かず、公式サイトの記載に修正すること*1

  • root/build.gradle
buildscript {
    repositories {
        jcenter()  //★ココのみでOKでした
    }
    dependencies {
        classpath ('com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.11',{
             exclude module 'junit'   //★★ test実行時に干渉する><
        })
    }
}
  • app/build.gradle
apply plugin: 'android-aspectjx'

で基本利用

動かない記述は?

メイン側にAOPコード書く場合は

includeJarFilterの記述はなくても動く*2

でexcludeJarFilterの記述のみで試してたんですが、ダブルクオート記述だとなぜかダメ。。。

以前より進化していて、下記もサポート(以前はモジュール名のみ)

  • group名 指定
  • .jar 指定(物理名指定)

基本aopやりたいのって src以下の修正コードだけだと思うので

dependencies系は全部除外フィルターにれたほうが動作安定するよう*3

  • app/build.gradle (OK)
aspectjx {
    excludeJarFilter 'com.android.support'
    //excludeJarFilter 'com.android.support' , 'gson' , '.jar'
}
  • app/build.gradle (NG)
aspectjx {
    excludeJarFilter "com.android.support"
}

検証状況

gradle runtime 4.1 まででしか動かない

plugin内部で使ってる org.gradle.Clock のコンストラクタが 4.2から引数ありになったのでエラーになります

3.0対応をしたコミットがあるが、、

3.0-betaで内部仕様がガラッと変わってPluginが動かなくなったというissueがあり

一応このissueで対応したとは書いてるんですけどね・・

plugin 2.3.3で動作は確認

Java8で動かせる?

aspectJ自体がJava8対応してないみたいなので無理みたいなissue記載が他のAOP pluginにあり*4

Java7でコンパイルして使ってください

InstantRunでつかえる?

ビルド時にエラーになるのでOFFにしてつかってください

AOP系は結構不安定になりますね(下記あたりのライブラリもよく)

  • data-binding
  • permission-dispatcher

appだけの構成の場合

  • app/build.gradle
def isIdeBuild = "false"

android{
    buildTypes {
        debug{
            debuggable true

            //AS上からInstantRunが実行されたときのみ適応☆
            def isIdeBuild = "false"
            def compilation = project.properties['android.optional.compilation'] as String
            if(compilation != null && compilation.indexOf("INSTANT_DEV")!= -1){
                  isIdeBuild = "true"
            }
            ant.echo "[isIdeBuild]:"+isIdeBuild 
       }
    }
}

if(!"true".equalsIgnoreCase(isIdeBuild)){
     apply plugin: 'android-aspectjx'
     aspectjx {
    excludeJarFilter 'com.android.support'
    //excludeJarFilter 'com.android.support' , 'gson' , '.jar'
     }
}

app/library の構成の場合

  • app/build.gradle
if(!"true".equalsIgnoreCase(isIdeBuild)){
     apply plugin: 'android-aspectjx'
     aspectjx {
        includeJarFilter "${rootProject.name}/library"
    excludeJarFilter 'com.android.support'
    //excludeJarFilter 'com.android.support' , 'gson' , '.jar'
     }
}
  • library/build.gradle

コチラ側にAOPコードが有る場合

dependencies {
    compile 'org.aspectj:aspectjrt:1.8.12' 
}

検証状況追記(2017/11)

gralde runtime 4.4 でも jake先生のHugoなら動かせるっぽい

yuki312.blogspot.jp

*1:Demo版の記述だと正常動作しない

*2:これlibraryProject側で使ってる時に書く記述らしい

*3:つかった時の体感。下手に記述を残すとビルドが凄く時間かかる

*4:Spring Aopだと大丈夫だよ?な話はあるけど、あれAspectJとは全然別物らしいです