最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android代碼檢查規(guī)則Lint的自定義與應(yīng)用詳解

 更新時(shí)間:2022年04月12日 11:37:19   作者:聆聽(tīng)Tech  
本文主要介紹了Android代碼檢查規(guī)則Lint的自定義與應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言:

在日常的代碼開(kāi)發(fā)中,此處相信每個(gè)開(kāi)發(fā)人員對(duì)代碼質(zhì)量都是高要求,有自己的一套代碼規(guī)范,但是我們不是單獨(dú)作戰(zhàn),往往大家都是團(tuán)隊(duì)作戰(zhàn),人是最大的變量,各人各異,如何保證團(tuán)隊(duì)的代碼質(zhì)量和代碼規(guī)范呢?靠開(kāi)發(fā)者自覺(jué)嗎?也許有的團(tuán)隊(duì)有嚴(yán)格的CR機(jī)制,在MR階段會(huì)進(jìn)行CR,CR不通過(guò)的MR是不允許合入的,但是這樣會(huì)使Reviewer花費(fèi)較多的時(shí)間去校驗(yàn),那么這時(shí)候我們就需要在編碼過(guò)程中提供一種代碼檢測(cè)機(jī)制。

例如:期望表現(xiàn)的效果就是在編碼時(shí)可以展示異常檢測(cè)的方法,高亮或者標(biāo)紅,當(dāng)鼠標(biāo)懸停在高亮的代碼上時(shí),會(huì)提供問(wèn)題的描述和解決方法。需要這種效果,就需要自定義lint了。

什么是Lint

在Android Studio中提供的代碼掃描工具Lint,可在無(wú)需實(shí)際執(zhí)行該應(yīng)用,也不必編寫(xiě)測(cè)試用例的情況下幫助開(kāi)發(fā)者發(fā)現(xiàn)代碼質(zhì)量問(wèn)題和提出一些改進(jìn)建議。

Lint工具可檢查您的 Android 項(xiàng)目源文件是否包含潛在錯(cuò)誤,以及在正確性、安全性、性能、易用性、便利性和國(guó)際化方面是否需要優(yōu)化改進(jìn)。在使用 Android Studio 時(shí),配置的 Lint 和 IDE 檢查會(huì)在您每次構(gòu)建應(yīng)用時(shí)運(yùn)行。不過(guò),您可以手動(dòng)運(yùn)行檢查或從命令行運(yùn)行 Lint。

android studio內(nèi)置了較多的lint規(guī)則,但內(nèi)置的lint規(guī)則無(wú)法滿足直觀的適合我們時(shí),就需要我們自定義lint了。

自定義Lint流程:

1. 新創(chuàng)建module,Module類(lèi)型選擇Java or Kotlin Library, 暫時(shí)命名lint_tools

2. 在build.gradle中引入lint的依賴

    dependencies {
        compileOnly 'com.android.tools.lint:lint-api:27.2.2'
        compileOnly 'com.android.tools.lint:lint-checks:27.2.2'
    }

在moudle中依賴了lint-api和lint-checks,其中l(wèi)int-api就是lint相關(guān)的api,lint-checks就是android studio里自定義的一些lint規(guī)則,我們自定義lint可以參考lint-checks里面的寫(xiě)法。

3. 本地創(chuàng)建個(gè)資源id命名檢查規(guī)則,用來(lái)規(guī)范項(xiàng)目中的id統(tǒng)一命名

創(chuàng)建ViewIdDetector,直接繼承LayoutDetector(也可以繼承ResourceXmlDetector 或者 繼承Detector實(shí)現(xiàn)的接口是XmlScanner,方式多樣)

import com.android.SdkConstants
import com.android.tools.lint.detector.api.*
import com.android.tools.lint.detector.api.Category.Companion.CORRECTNESS
import com.android.tools.lint.detector.api.Scope.Companion.RESOURCE_FILE_SCOPE
import org.w3c.dom.Element
?
class ViewIdDetector : LayoutDetector() {
    
    override fun getApplicableElements(): Collection<String>? {
        return listOf(
            SdkConstants.TEXT_VIEW,
            SdkConstants.IMAGE_VIEW,
            SdkConstants.BUTTON
        )
    }
?
    override fun visitElement(context: XmlContext, element: Element) {
        if (!element.hasAttributeNS(SdkConstants.ANDROID_URI, SdkConstants.ATTR_ID)) {
            return
        }
        val attr = element.getAttributeNodeNS(SdkConstants.ANDROID_URI, SdkConstants.ATTR_ID)
        val value = attr.value
        if (value.startsWith(SdkConstants.NEW_ID_PREFIX)) {
            val idValue = value.substring(SdkConstants.NEW_ID_PREFIX.length)
            var matchRule = true
            var expMsg = ""
            when (element.tagName) {
                SdkConstants.TEXT_VIEW -> {
                    expMsg = "tv"
                    matchRule = idValue.startsWith(expMsg)
                }
                SdkConstants.IMAGE_VIEW -> {
                    expMsg = "iv"
                    matchRule = idValue.startsWith(expMsg)
                }
                SdkConstants.BUTTON -> {
                    expMsg = "btn"
                    matchRule = idValue.startsWith(expMsg)
                }
            }
            if (!matchRule) {
                context.report(
                    ISSUE, 
                    attr, 
                    context.getLocation(attr), 
                    "ViewIdName建議使用view的縮寫(xiě)_xxx; ${element.tagName} 建議使用 `${expMsg}_xxx`"
                )
            }
        }
    }
?
    companion object {
        val ISSUE: Issue = Issue.create(
            "ViewIdCheck",
            "ViewId命名不規(guī)范",
            "ViewIdName建議使用 view的縮寫(xiě)加上_xxx,例如tv_xxx, iv_xxx",
            CORRECTNESS,
            5, Severity.ERROR,
            Implementation(
                ViewIdDetector::class.java,
                RESOURCE_FILE_SCOPE
            )
        )
    }
}

自定義Detector可以實(shí)現(xiàn)一個(gè)或多個(gè)Scanner接口,選擇實(shí)現(xiàn)哪種接口取決于你想要的掃描范圍。
Lint API 中內(nèi)置了很多 Scanner:

Scanner 類(lèi)型Desc
UastScanner掃描 Java、Kotlin 源文件
XmlScanner掃描 XML 文件
ResourceFolderScanner掃描資源文件夾
ClassScanner掃描 Class 文件
BinaryResourceScanner掃描二進(jìn)制資源文件
GradleScanner掃描Gradle腳本

4. 實(shí)現(xiàn)IssueRegistry并添加對(duì)應(yīng)的自定義Issue:

class IMockIssueRegistry: IssueRegistry() {
    override val issues: List<Issue>
        get() = listOf(
            ViewIdDetector.ISSUE
        )
?
}

5. 在module(lint_tools)中對(duì)應(yīng)的build.gradle中配置如下信息:

jar {
    manifest {
        attributes("Lint-registry-v2": "com.imock.lint.IMockIssueRegistry")
    }
}

6. 在需要進(jìn)行l(wèi)int檢查的module中或者app目錄現(xiàn)的build.gradle中引用對(duì)應(yīng)的lint_tools即可使用。

dependencies {
    lintChecks project(path: ':lint-tools')
}

至此你可以試著自己自定義Lint了,相關(guān)語(yǔ)法api都可參考lint-checks中提供的Detector實(shí)現(xiàn),來(lái)實(shí)現(xiàn)自己的Lint檢查規(guī)則。

拓展一下:

1. 針對(duì)Issue.create參數(shù)了解一下:

companion object {
    /**
     * Creates a new issue. The description strings can use some simple markup;
     * see the [TextFormat.RAW] documentation
     * for details.
     *
     * @param id the fixed id of the issue
     * @param briefDescription short summary (typically 5-6 words or less), typically
     * describing the **problem** rather than the **fix**
     * (e.g. "Missing minSdkVersion")
     * @param explanation a full explanation of the issue, with suggestions for
     * how to fix it
     * @param category the associated category, if any
     * @param priority the priority, a number from 1 to 10 with 10 being most
     * important/severe
     * @param severity the default severity of the issue
     * @param implementation the default implementation for this issue
     * @return a new [Issue]
     */
    @JvmStatic
    fun create(
        id: String,
        briefDescription: String,
        explanation: String,
        category: Category,
        priority: Int,
        severity: Severity,
        implementation: Implementation
    ): Issue {
        val platforms = computePlatforms(null, implementation)
        return Issue(
            id, briefDescription, explanation, category, priority,
            severity, platforms, null, implementation
        )
    }
}
  • 參數(shù)id 唯一的id,簡(jiǎn)要表面當(dāng)前提示的問(wèn)題。
  • 參數(shù)briefDescription 簡(jiǎn)單描述當(dāng)前問(wèn)題
  • 參數(shù)explanation 詳細(xì)解釋當(dāng)前問(wèn)題和修復(fù)建議
  • 參數(shù)category 問(wèn)題類(lèi)別
  • 參數(shù)priority 優(yōu)先級(jí),從1到10,10最重要
  • 參數(shù)Severity 嚴(yán)重程度:FATAL(奔潰), ERROR(錯(cuò)誤), WARNING(警告),INFORMATIONAL(信息性),IGNORE(可忽略)
  • 參數(shù)Implementation Issue和哪個(gè)Detector綁定,以及聲明檢查的范圍。Scope有如下選擇范圍:RESOURCE_FILE(資源文件),BINARY_RESOURCE_FILE(二進(jìn)制資源文件),RESOURCE_FOLDER(資源文件夾),ALL_RESOURCE_FILES(所有資源文件),JAVA_FILE(Java文件), ALL_JAVA_FILES(所有Java文件),CLASS_FILE(class文件), ALL_CLASS_FILES(所有class文件),MANIFEST(配置清單文件), PROGUARD_FILE(混淆文件),JAVA_LIBRARIES(Java庫(kù)), GRADLE_FILE(Gradle文件),PROPERTY_FILE(屬性文件),TEST_SOURCES(測(cè)試資源),OTHER(其他);

到此這篇關(guān)于Android代碼檢查規(guī)則Lint的自定義與應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Android代碼檢查規(guī)則Lint內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android SharedPreferences實(shí)現(xiàn)保存登錄數(shù)據(jù)功能

    Android SharedPreferences實(shí)現(xiàn)保存登錄數(shù)據(jù)功能

    這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences實(shí)現(xiàn)保存登錄數(shù)據(jù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android串口操作方法實(shí)例

    Android串口操作方法實(shí)例

    這篇文章主要介紹了Android串口操作方法實(shí)例,本文共分5個(gè)步驟講解了Android串口操作方法,并給出代碼實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Android組合式自定義控件實(shí)現(xiàn)購(gòu)物車(chē)加減商品操作

    Android組合式自定義控件實(shí)現(xiàn)購(gòu)物車(chē)加減商品操作

    這篇文章主要介紹了Android組合式自定義控件實(shí)現(xiàn)購(gòu)物車(chē)加減商品操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android Dialog仿ios9中UIAlertController控件

    Android Dialog仿ios9中UIAlertController控件

    這篇文章主要為大家詳細(xì)介紹了Android Dialog仿ios9中UIAlertController控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android ActivityManagerService啟動(dòng)流程詳解

    Android ActivityManagerService啟動(dòng)流程詳解

    這篇文章主要介紹了Android ActivityManagerService啟動(dòng)流程,AMS,即ActivityManagerService,是安卓java framework的一個(gè)服務(wù),運(yùn)行在system_server進(jìn)程。此服務(wù)十分重要,因?yàn)樗芾碇沧康乃拇蠼M件,是安卓APP開(kāi)發(fā)者最常接觸到的一個(gè)服務(wù)
    2023-02-02
  • Android自定義View實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖示例代碼

    Android自定義View實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖示例代碼

    這篇文章主要給大家介紹了關(guān)于Android自定義View如何實(shí)現(xiàn)多邊形統(tǒng)計(jì)圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Android用Canvas繪制貝塞爾曲線

    Android用Canvas繪制貝塞爾曲線

    這篇文章主要為大家詳細(xì)介紹了Android用Canvas繪制貝塞爾曲線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解RxJava2 Retrofit2 網(wǎng)絡(luò)框架簡(jiǎn)潔輕便封裝

    詳解RxJava2 Retrofit2 網(wǎng)絡(luò)框架簡(jiǎn)潔輕便封裝

    本篇文章主要介紹了詳解RxJava2 Retrofit2 網(wǎng)絡(luò)框架簡(jiǎn)潔輕便封裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Flutter交互并使用小工具管理其狀態(tài)widget的state詳解

    Flutter交互并使用小工具管理其狀態(tài)widget的state詳解

    這篇文章主要為大家介紹了Flutter交互并使用小工具管理其狀態(tài)widget的state詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android使用OkHttp進(jìn)行重定向攔截處理的方法

    Android使用OkHttp進(jìn)行重定向攔截處理的方法

    這篇文章主要介紹了Android使用OkHttp進(jìn)行重定向攔截處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

瓦房店市| 出国| 惠东县| 苏尼特左旗| 卢氏县| 天气| 沙田区| 库尔勒市| 上饶市| 台北县| 略阳县| 苗栗县| 广灵县| 西乌珠穆沁旗| 福泉市| 噶尔县| 刚察县| 临朐县| 大方县| 商都县| 襄垣县| 深水埗区| 林口县| 涿鹿县| 商洛市| 安乡县| 清河县| 敦煌市| 焉耆| 长葛市| 修文县| 安仁县| 称多县| 醴陵市| 汝州市| 郁南县| 镶黄旗| 荃湾区| 永丰县| 陇南市| 肇源县|