Lint
開發(fā)中使用靜態(tài)代碼檢測工具對代碼進(jìn)行檢查,達(dá)到規(guī)范代碼減少bug的目的。常用的檢測工具有FindBugs、PMD技俐、Coverity,Checkstyle。
Android工程使用Lint是最方便统台。Lint作為官方配套工具雕擂,功能完善,自定義擴(kuò)展性強(qiáng)贱勃,常規(guī)需求基本可以做到無需修改井赌。
自定義Lint網(wǎng)上相關(guān)文章也很多,不在本篇討論范圍之中贵扰。
現(xiàn)實(shí)
雖然Lint很好族展,能夠在代碼中實(shí)時(shí)提示,但只要不影響到編譯流程拔鹰,改不改,全看開發(fā)者自覺贵涵。所以我們需要增加一些強(qiáng)制性列肢,不修改就不能繼續(xù)恰画。
- 將Lint任務(wù)部署到CI中,Pull Request進(jìn)行Lint任務(wù)瓷马,不通過則不允許提交
- hook到git commit拴还,在git commit時(shí)執(zhí)行Lint任務(wù)
- 本地編譯時(shí)執(zhí)行Lint任務(wù),不通過中斷編譯
根據(jù)實(shí)際情況選擇即可欧聘,下面對方案3講解一下
插入到編譯過程中
眾所周知片林,apk生成或者aar生成會執(zhí)行assemble
任務(wù),子module時(shí)在不輸出aar并不會執(zhí)行這個(gè)任務(wù)怀骤,經(jīng)過
觀察會執(zhí)行bundleLibRuntimeToDirxxxx
任務(wù)费封,所以可以把Lint任務(wù)插入到這兩個(gè)任務(wù)之前執(zhí)行。
common.gradle
, 基于AGP7.0+
/**當(dāng)設(shè)置為true時(shí)每次運(yùn)行都會進(jìn)行l(wèi)int,設(shè)置為false時(shí)只會在發(fā)布版本時(shí)檢查*/
def lintAlways = true
def isAppModule = plugins.hasPlugin('com.android.application')
def isLibraryModule = plugins.hasPlugin('com.android.library')
//lint檢測
if (isAppModule) {
android.applicationVariants.all { variant ->
def lintTask = tasks["lint${variant.name.capitalize()}"]
variant.assembleProvider.get().dependsOn lintTask
}
} else if (isLibraryModule) {
android.libraryVariants.all { variant ->
def lintTask = tasks["lint${variant.name.capitalize()}"]
if (lintAlways) {
def runTask = tasks["bundleLibRuntimeToDir${variant.name.capitalize()}"]
if (runTask != null) {
//直接運(yùn)行時(shí)也進(jìn)行l(wèi)int
runTask.dependsOn lintTask
}
}
//打包成aar
variant.assembleProvider.get().dependsOn lintTask
}
}
最后在每個(gè)模塊引入這個(gè)gradle即可蒋伦。
Lint配置
只有error或者fatal級別的issue弓摘,才會中斷編譯。如果我們想修改issue等級或者我們想忽略某些文件錯(cuò)誤痕届∪拖祝可以在工程根目錄添加lint.xml
文件,
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Disable the given check in this project -->
<issue id="IconMissingDensityFolder" severity="ignore" />
<!-- Ignore the ObsoleteLayoutParam issue in the specified files -->
<issue id="ObsoleteLayoutParam">
<ignore path="res/layout/activation.xml" />
<ignore path="res/layout-xlarge/activation.xml" />
</issue>
<!-- Ignore the UselessLeaf issue in the specified file -->
<issue id="UselessLeaf">
<ignore path="res/layout/main.xml" />
</issue>
<!-- Change the severity of hardcoded strings to "error" -->
<issue id="HardcodedText" severity="error" />
</lint>
配置好后,當(dāng)有error級別的issue未解決時(shí)就不編譯不通過研叫,督促開發(fā)人員進(jìn)行修改锤窑。