<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在日常的程式碼開發中,此處相信每個開發人員對程式碼質量都是高要求,有自己的一套程式碼規範,但是我們不是單獨作戰,往往大家都是團隊作戰,人是最大的變數,各人各異,如何保證團隊的程式碼質量和程式碼規範呢?靠開發者自覺嗎?也許有的團隊有嚴格的CR機制,在MR階段會進行CR,CR不通過的MR是不允許合入的,但是這樣會使Reviewer花費較多的時間去校驗,那麼這時候我們就需要在編碼過程中提供一種程式碼檢測機制。
例如:期望表現的效果就是在編碼時可以展示異常檢測的方法,高亮或者標紅,當滑鼠懸停在高亮的程式碼上時,會提供問題的描述和解決方法。需要這種效果,就需要自定義lint了。
在Android Studio中提供的程式碼掃描工具Lint,可在無需實際執行該應用,也不必編寫測試用例的情況下幫助開發者發現程式碼質量問題和提出一些改進建議。
Lint工具可檢查您的 Android 專案原始檔是否包含潛在錯誤,以及在正確性、安全性、效能、易用性、便利性和國際化方面是否需要優化改進。在使用 Android Studio 時,設定的 Lint 和 IDE 檢查會在您每次構建應用時執行。不過,您可以手動執行檢查或從命令列執行 Lint。
android studio內建了較多的lint規則,但內建的lint規則無法滿足直觀的適合我們時,就需要我們自定義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,其中lint-api就是lint相關的api,lint-checks就是android studio裡自定義的一些lint規則,我們自定義lint可以參考lint-checks裡面的寫法。
建立ViewIdDetector,直接繼承LayoutDetector(也可以繼承ResourceXmlDetector 或者 繼承Detector實現的介面是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的縮寫_xxx; ${element.tagName} 建議使用 `${expMsg}_xxx`" ) } } } companion object { val ISSUE: Issue = Issue.create( "ViewIdCheck", "ViewId命名不規範", "ViewIdName建議使用 view的縮寫加上_xxx,例如tv_xxx, iv_xxx", CORRECTNESS, 5, Severity.ERROR, Implementation( ViewIdDetector::class.java, RESOURCE_FILE_SCOPE ) ) } }
自定義Detector可以實現一個或多個Scanner介面,選擇實現哪種介面取決於你想要的掃描範圍。
Lint API 中內建了很多 Scanner:
Scanner 型別 | Desc |
---|---|
UastScanner | 掃描 Java、Kotlin 原始檔 |
XmlScanner | 掃描 XML 檔案 |
ResourceFolderScanner | 掃描資原始檔夾 |
ClassScanner | 掃描 Class 檔案 |
BinaryResourceScanner | 掃描二進位制資原始檔 |
GradleScanner | 掃描Gradle指令碼 |
class IMockIssueRegistry: IssueRegistry() { override val issues: List<Issue> get() = listOf( ViewIdDetector.ISSUE ) }
jar { manifest { attributes("Lint-registry-v2": "com.imock.lint.IMockIssueRegistry") } }
dependencies { lintChecks project(path: ':lint-tools') }
至此你可以試著自己自定義Lint了,相關語法api都可參考lint-checks中提供的Detector實現,來實現自己的Lint檢查規則。
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 ) } }
到此這篇關於Android程式碼檢查規則Lint的自定義與應用詳解的文章就介紹到這了,更多相關Android程式碼檢查規則Lint內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45