Android AOP面向切面編程和Gradle插件編寫(二)

上一篇主要記錄了一些Android的AOP編程的筆記
Android AOP面向切面編程和Gradle插件編寫(一)

這一篇就大概記錄一下我的關(guān)于編寫Gradle插件的筆記吧

如何用Android Studio編寫一個Gradle插件呢

可以參考如何使用Android Studio開發(fā)Gradle插件
首先我們需要先建立一個Android Library的模塊
保留一個build.gradle文件然后其他的就刪掉吧
建立如下目錄結(jié)構(gòu)

.
├── build.gradle
└── src
    └── main
        ├── groovy
        │   └── com
        │       └── sundae
        │           └── aoplib
        │               └── plugin
        │                   └── AopLibPlugin.groovy
        └── resources
            └── META-INF
                └── gradle-plugins
                    └── aoplibplugin.properties
image.png

像這樣

建立src/main/groovy/包名/文件.groovy 的文件

這個文件使用來編寫插件內(nèi)容的假哎,注意是.groovy結(jié)尾的文件
在文件中編寫如下內(nèi)容

package com.sundae.aoplib.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class AopLibPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println("==================")
        println("      Gradle插件   ")
        println("==================")
}
然后在src/main/resources/META-INF/gradle-plugins(這個路徑不能變撤嫩,這是用來識別插件的路徑)

在目錄下建立 插件名.properties的文件
文件內(nèi)編寫

implementation-class=com.sundae.aoplib.plugin.AopLibPlugin
(這個路徑對應(yīng)了編寫的插件的路徑)
接著編寫module的build.gradle文件
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

這樣一個簡單的gradle插件就編寫好了
然而這樣還不好使用這個插件

要使用這個插件我們需要將它編譯發(fā)布到本地的maven中央倉庫里
繼續(xù)在module的build.gradle文件中寫入

group='com.sundae.aoplib.plugin'
version='0.0.1'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

上面的group和version的定義會被使用,作為maven庫的坐標(biāo)的一部分汗茄,group會被作為坐標(biāo)的groupId,version會被作為坐標(biāo)的version,而坐標(biāo)的artifactId組成即module名,我們讓其取一個別名moduleName踱阿。然后maven本地倉庫的目錄就是當(dāng)前項(xiàng)目目錄下的repo目錄。
這時候钦铁,右側(cè)的gradle Toolbar就會在module下多出一個task

image.png

點(diǎn)擊這個Task就會將這個插件模塊發(fā)布到本地maven倉庫里了

image.png

這樣就發(fā)布完成了软舌,要使用它我們只需要在app的build.gardle中加入

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath 'com.sundae.aoplib.plugin:aoplib-plugin:0.0.1'
        //包名:插件類名:版本號
    }
}
apply plugin: 'aoplibplugin'    ///插件名

然后build編譯或點(diǎn)sync now一下,就可以看到gradle console中出現(xiàn)了這樣的輸出

image.png

這樣一個編寫gradle的插件的流程就結(jié)束了

接下來就是重點(diǎn)了育瓜,接著之前的問題葫隙,如何使用gradle插件自動加入一些編譯器的配置呢

需要在插件類內(nèi)編寫如下內(nèi)容

package com.sundae.aoplib.plugin

import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main


class AopLibPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
//        println("==================")
//        println("      Gradle插件         ")
//        println("==================")

        if (!project.android) {
            throw new IllegalStateException('Must apply \'com.android.application\' or \'com.android.library\' first!')
        }

////    需要分辨是在app的gradle中使用插件還是在module中使用插件
        def isApp = false
        def isLib = false
        isApp = project.plugins.withType(AppPlugin)
        isLib = project.plugins.withType(LibraryPlugin)
        if (!isApp && !isLib) {
            throw new IllegalStateException("'android' or 'android-library' plugin required.")
        }

        final def log = project.logger
        final def variants
        if (isApp) {
            variants = project.android.applicationVariants
        } else {
            variants = project.android.libraryVariants
        }
//////////////////////////////////////////////////////////////////////////
        project.dependencies {
            compile 'org.aspectj:aspectjrt:1.8.9'
        }

        variants.all { variant ->
            JavaCompile javaCompile = variant.javaCompile
            javaCompile.doLast {
                String[] args = ["-showWeaveInfo",
                                 "-1.5",
                                 "-inpath", javaCompile.destinationDir.toString(),
                                 "-aspectpath", javaCompile.classpath.asPath,
                                 "-d", javaCompile.destinationDir.toString(),
                                 "-classpath", javaCompile.classpath.asPath,
                                 "-bootclasspath", project.android.bootClasspath.join(
                        File.pathSeparator)]

                MessageHandler handler = new MessageHandler(true);
                new Main().run(args, handler)

                for (IMessage message : handler.getMessages(null, true)) {
                    switch (message.getKind()) {
                        case IMessage.ABORT:
                        case IMessage.ERROR:
                        case IMessage.FAIL:
                            log.error message.message, message.thrown
                            break;
                        case IMessage.WARNING:
                        case IMessage.INFO:
                            log.info message.message, message.thrown
                            break;
                        case IMessage.DEBUG:
                            log.debug message.message, message.thrown
                            break;
                    }
                }
            }
        }

    }
}

因?yàn)樾枰猘spectj和gradle tool的包的緣故,所以需要將插件的build.gradle內(nèi)容改為

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
    compile 'com.android.tools.build:gradle:2.3.0'      ///add
    compile 'org.aspectj:aspectjtools:1.8.9'            ///add
    compile 'org.aspectj:aspectjrt:1.8.9'               ///add
}

repositories {
    mavenCentral()
}

group='com.sundae.aoplib.plugin'
version='0.0.1'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

點(diǎn)擊uploadArchives重新編譯發(fā)布插件模塊

app項(xiàng)目中重新應(yīng)用這個插件
這樣原本需要配置的二十幾行的編譯器配置代碼就可以直接用幾行代碼調(diào)用插件來完成啦躏仇,是不是不僅方便快捷恋脚,而且代碼一下子清爽了不少呢,哈哈哈哈??

上一波我的源碼(GitHub)一個Android的AOP面向切面編程的小例子

明天十一放假啦焰手,準(zhǔn)備去張家界旅(qiong)游一趟糟描,怕玩結(jié)束回來都忘得差不多了,所以今天熬夜記錄下來书妻。
好了 船响,完事 ,上床睡覺躲履!

ps:菜鳥上路见间,有問題的地方請多指教??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市工猜,隨后出現(xiàn)的幾起案子米诉,更是在濱河造成了極大的恐慌,老刑警劉巖篷帅,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件史侣,死亡現(xiàn)場離奇詭異,居然都是意外死亡魏身,警方通過查閱死者的電腦和手機(jī)惊橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箭昵,“玉大人税朴,你說我怎么就攤上這事。” “怎么了掉房?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵茧跋,是天一觀的道長。 經(jīng)常有香客問我卓囚,道長,這世上最難降的妖魔是什么诅病? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任哪亿,我火速辦了婚禮,結(jié)果婚禮上贤笆,老公的妹妹穿的比我還像新娘蝇棉。我一直安慰自己,他們只是感情好芥永,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布篡殷。 她就那樣靜靜地躺著,像睡著了一般埋涧。 火紅的嫁衣襯著肌膚如雪板辽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天棘催,我揣著相機(jī)與錄音劲弦,去河邊找鬼。 笑死醇坝,一個胖子當(dāng)著我的面吹牛邑跪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呼猪,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼画畅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宋距?” 一聲冷哼從身側(cè)響起轴踱,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乡革,沒想到半個月后寇僧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沸版,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年嘁傀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视粮。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡细办,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笑撞,我是刑警寧澤岛啸,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站茴肥,受9級特大地震影響坚踩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓤狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一瞬铸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧础锐,春花似錦嗓节、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至信姓,卻和暖如春鸵隧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背财破。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工掰派, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人左痢。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓靡羡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俊性。 傳聞我的和親對象是個殘疾皇子略步,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)定页,斷路器趟薄,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具,雖然在Gradle 出現(xiàn)之...
    真笨笨魚閱讀 1,491評論 0 0
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評論 6 342
  • 不守信
    孫有騰閱讀 238評論 0 1