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なら動かせるっぽい