Android 用Gradle脚本代码检查

开篇废话

在项目中写代码时偶尔会不注意,从而导致了隐形的bug产生,平时也发现不了,比如说在自定义View时使用了TypedArray却忘记了recycle()回收,所以我就想到通过写Gradle脚本的方式来检查代码。

先讲思路

  • 遍历所有的java文件
  • 检查代码是否有问题
  • 检查比较耗时设定每2小时检查一次

直接上代码

废话就不再多说了,直接上代码。

import groovy.json.JsonSlurper
import groovy.json.JsonOutput

task(CheckCodeSpec) {
    def nowTime = System.currentTimeMillis()

    def CHECK_CODE_JSON_PATH = "gradle/check_code_spec_config.json" //生成的文件
    def CHECK_LAST_TIME = "check_last_time" //文件json的Key值,Value是上次检查的时间
    def CHECK_CYCLE_MINUTE = 2 //每过多久检查一次,单位小时
    def CHECK_CYCLE_MS = CHECK_CYCLE_MINUTE * 60 * 60 * 1000

    def file = file(CHECK_CODE_JSON_PATH)

    if (!file.exists()) {
        file.createNewFile()
        file.write("{}")
    }

    def slurper = new JsonSlurper()
    def checkCodeMap = slurper.parseText(file.text)

    if (checkCodeMap[CHECK_LAST_TIME] != null) {
        def lastTime = checkCodeMap[CHECK_LAST_TIME]
        if (nowTime - lastTime > CHECK_CYCLE_MS) {
            startCheckCodeSpec()
            checkCodeMap[CHECK_LAST_TIME] = nowTime
        } else {
            println "\nNot check spec code within $CHECK_CYCLE_MINUTE hour\n"
        }
    } else {
        println "\nNot find check spec code lastTime\n"
        checkCodeMap[CHECK_LAST_TIME] = 0
    }

    def output = new JsonOutput()
    def checkCodeJson = output.toJson(checkCodeMap)

    file.write(checkCodeJson)
}

def startCheckCodeSpec() {
    def startTime = System.currentTimeMillis()

    println "\nStart check spec code ..."

//    def appSrcDir = file('src/main/java/com/soft/blued/')
    def appSrcDir = file(rootDir.getAbsoluteFile())

    def javaSrcFile
    def javaSrcFileName
    def javaSrcFileText
    def javaSrcFileCount = 0

    appSrcDir.eachFileRecurse(groovy.io.FileType.FILES, new Closure<Void>(null) {
        void doCall(Object[] args) {
            javaSrcFile = (File) args[0]
            javaSrcFileName = javaSrcFile.name
            if (javaSrcFileName.matches("\\w*\\.java")) {
                javaSrcFileText = javaSrcFile.text
                javaSrcFileCount += 1

                if (javaSrcFileText.indexOf("android.content.res.TypedArray") > 0) {
                    if (javaSrcFileText.indexOf("recycle()") <= 0) {
                        showForbiddenWithLack("recycle()", javaSrcFileName)
                    }
                }
                if (javaSrcFileText.indexOf("android.os.Message") > 0) {
                    if (javaSrcFileText.indexOf("new Message()") > 0) {
                        showForbiddenWithDisable("new Message()", javaSrcFileName)
                    }
                }
            }
        }

        def showForbiddenWithLack(forbiddenMethod, fileName) {
            def message = "\'" + forbiddenMethod + "\' is missing of Class!! [ " + fileName + " ]"
            throw new Exception(message)
        }

        def showForbiddenWithDisable(forbiddenMethod, fileName) {
            def message = "\'" + forbiddenMethod + "\' is not available of Class!! [ " + fileName + " ]"
            throw new Exception(message)
        }
    })

    def takeTime = System.currentTimeMillis() - startTime
    println "Check spec code finish! \n[Total Scan " + javaSrcFileCount + " File in " + takeTime + "ms]\n"
}

整个代码还是比较简单的,只对两点进行了检查:

  • TypedArray是否使用recycle()。
  • Handler中的Message的创建是否使用了推荐的Message.obtain()。

脚本写完了,具体如何在项目中使用呢?
在项目工程的build.gradle中添加以下代码:

//=====================code spec check=====================
apply from: './gradle/check_code_spec.gradle'

因为我是每2小时检查一次,所以会生成一个json文件来记录上次检查的时间,为了多人协作开发比较方便,所以还需要在.gitignore文件中添加配置:

# 代码检查生成的配置文件
check_code_spec_config.json

写在后面

现在只是对两点进行了检查,如果你们还有什么其它更好的想法,也可以留言给我,我可以添加到代码中,谢谢大家。

更多内容戳这里(整理好的各种文集)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容