android gradle plugin でAop(2016/9時点)
導入するライブラリ
を参考にして作られたpluginらしいです。
自分が、uPhycaさんの試していたときは、依存関係が解決できなかったので
結局自前でタスク書いてました
configurations { ajc aspects ajInpath } dependencies { //aspectj ajc 'org.aspectj:aspectjtools:1.8.+' compile 'org.aspectj:aspectjrt:1.8.+' } android.applicationVariants.all { variant -> //aspectj compile variant.javaCompile.doLast { def iajcClasspath = files(android.getBootClasspath(), variant.javaCompile.classpath).toList().join(File.pathSeparator) ant.taskdef( resource:"org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: configurations.ajc.asPath) ant.iajc ( source:sourceCompatibility, target:targetCompatibility, //destDir:"${project.buildDir}/classes/${variant.dirName}", destDir:"${project.buildDir}/intermediates/classes/${variant.dirName}",//move destDir 1.1.x maxmem:"512m", fork:"true", showWeaveInfo:true, //complianceLevel:sourceCompatibility, //not support ant-task verbose:false, Xlint:'ignore', encoding:options.encoding,//'UTF-8' aspectPath:configurations.aspects.asPath, inpath:configurations.ajInpath.asPath, sourceRootCopyFilter:"**/.svn/*,**/*.java", classpath:iajcClasspath ){ sourceroots{ android.sourceSets.main.java.srcDirs.each{ pathelement(location:it.absolutePath) } pathelement(location:"${project.buildDir}/generated/source/r/${variant.dirName}") pathelement(location:"${project.buildDir}/generated/source/buildConfig/${variant.dirName}") pathelement(location:"${project.buildDir}/generated/source/aidl/${variant.dirName}") pathelement(location:"${project.buildDir}/generated/source/rs/${variant.dirName}") } } } }
動いた環境
- android gradle plugin 2.1+
- 2.2.+ では動かず
- ここらへんはaptのpluginとかも普通に動かないのでそういうものかとは思う*1
- ただ kotlin-gradle-plugin も2.2.+ で動かないらしいので、追跡調査は必要
- gradle wraper
- 2.14.1-bin.zip
- 3.0-bin.zip は動かず。*2
動かす上での注意点など
- app/build.gradle
apply plugin: 'android-aspectjx' aspectjx { includeJarFilter "${rootProject.name}/library" excludeJarFilter 'universal-image-loader' }
たとえば下記の状態の時
- プロジェクト名:AspectJX-Demo
- libraryプロジェクトの中にaop対象のソースが有る
build/〜/exploded-aar/AspectJX-Demo/library
と展開されてしまうからそう参照している形になっているよう。
外部参照 aar/jar の場合は excludeJarFilter の記述のような aar名だけで良いイメージ
いじってたサンプル
このサンプルのいい所はaop用のコードがlibrary-projectの形で外だし
本体側のコードに、デバック専用コードっぽいコードを同梱する(git等で管理する)のは
結構嫌がられますしね。。
- 動かす上での注意点など の記述コードが本体側になければ尚良でしたが。。
aspectjのruntimeだけは、library-projectの方だけにかけたりするので、この調査は凄く評価できる*3
- library/build/gradle
dependencies { testCompile 'junit:junit:4.12' compile 'org.aspectj:aspectjrt:1.8.+'//☆ }
改変した箇所
- build.gradle
buildscript { dependencies { //〜略〜 classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.+' classpath 'com.android.tools.build:gradle:2.1.+' //〜略〜 } } allprojects { //-XlintのワーニングをASのMessageタブに表示させる gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } } //pgradle.sh/pgradle.bat用 //こう書かないとFlavorとか使っている場合 gradlew tasks で一覧に表示されない task build_tasks << { tasks.each{task-> if(task.group == "build"){ println(task.name) } } } tasks.whenTaskAdded { task -> if (task.name.indexOf("assemble")!=-1) { task.group = "build" } } } project.ext{ compileSdkVersion=24 buildToolsVersion="24.0.2" supportVersion="24.1.+" }
- app/build.gradle
- debugタスクが指定されている時だけ動くように改変。
def found_aspect_target = false project.gradle.startParameter.taskNames.each {cmd_task -> if (cmd_task !=null && cmd_task.toLowerCase().indexOf("debug")!=-1) { found_aspect_target = true return } } if (found_aspect_target) { apply plugin: 'android-aspectjx' ant.echo "[AspectJX]:"+rootProject.name aspectjx { includeJarFilter "${rootProject.name}/library" excludeJarFilter 'universal-image-loader','appcompat-v7' } dependencies { compile project(':library') } }
android { compileSdkVersion project.compileSdkVersion buildToolsVersion project.buildToolsVersion } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile "com.android.support:appcompat-v7:$supportVersion" compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
ココらへんのバージョンは揃えないと、check task でエラーが出る今日この頃なので仕方なし。
//LibrarySDK.init();
触ってて気づいたこと
- 下記のログが出ていないとaspectjのビルドタスクが正常に動いていないよう
aspect do work.......... aspect jar merging.......... aspect done...................
一応AOPの同梱が成功していると、実行時にlogcatで以下のログが確認できる