一.使用Lint
工具欄 -> Analyze -> Inspect Code
彈出窗的Custom scope可以選擇對(duì)哪一指定部分進(jìn)行掃描桑李,whole project是整個(gè)項(xiàng)目,不太建議每次都掃描整個(gè)項(xiàng)目贬蛙,因?yàn)樘臅r(shí)了鹰晨。
二.觀(guān)察Lint的結(jié)果
初次掃描之后忧侧,會(huì)彈出一個(gè)顯示掃描結(jié)果的窗口年枕,比如我的掃描結(jié)果:
1萬(wàn)7個(gè)警告,尼瑪我寫(xiě)的代碼就這么糟糕嗎,我這感覺(jué)要改到下個(gè)月都改不完啊揉抵,看到這么多的警告亡容,先不要慌,首先要做的就是刪除項(xiàng)目重新做冤今,開(kāi)玩笑的闺兢,先找下資料看看每一欄目錄表示什么。
1. Accessibility意思是便利性的意思
具體什么意思我也不知道辟汰,然后點(diǎn)開(kāi)發(fā)現(xiàn)都是這個(gè)提示
這些都是針對(duì)ImageView和ImageButton的列敲,說(shuō)我缺少contentDescription這個(gè)參數(shù),這屬性是啥我也不知道帖汞,以前一直沒(méi)用過(guò),然后百度查看看凑术。
瞬間覺(jué)得很屌翩蘸,這些都是我平時(shí)開(kāi)發(fā)沒(méi)有考慮過(guò)的,雖然這個(gè)警告對(duì)我來(lái)說(shuō)影響不大淮逊,要用的話(huà)可以按教程來(lái)做催首,這里我就暫時(shí)先搞空的。
而這個(gè)也驗(yàn)證了“Accessibility”這個(gè)的含義泄鹏,主要是要你提供一些遍歷的警告郎任。
優(yōu)化優(yōu)先級(jí)很低,我覺(jué)得可以直接忽略
2. Correctness 這是正確性的意思
也看看是哪里有問(wèn)題才能推出這個(gè)目錄具體的分類(lèi)备籽。點(diǎn)開(kāi)后發(fā)現(xiàn)有很多欄
其實(shí)如果寫(xiě)android比較多的話(huà)舶治,就算英語(yǔ)不太好也大概知道是什么意思,比如第一個(gè)就是說(shuō)Class沒(méi)被注冊(cè)到manifest中车猬,那這個(gè)Class基本肯定是一個(gè)Activity
我發(fā)現(xiàn)是我的一個(gè)基類(lèi)沒(méi)注冊(cè)霉猛,不知道為什么這會(huì)提示這個(gè)BUG。這個(gè)先不管珠闰,看我第2條惜浅,它報(bào)這個(gè)警告
這個(gè)就有意思了,雖然目前沒(méi)出錯(cuò)伏嗜,但是按照它的說(shuō)法去做肯定更安全坛悉,這也體現(xiàn)Lint的優(yōu)化的好處,我們肯定是盡量消除警告的好承绸,雖然有些警告并不影響運(yùn)行的結(jié)果裸影,但是消除這些警告肯定會(huì)更為安全些。
然后改了一下其它的八酒,發(fā)現(xiàn)這個(gè)目錄就是說(shuō)你用的某個(gè)地方不太好空民,比如說(shuō)版本舊,比如說(shuō)多寫(xiě)了某些內(nèi)容,比如說(shuō)讓你在設(shè)置字體大小時(shí)用sp不要用dp界轩,它就會(huì)給你一些合理的修改方法画饥,其實(shí)我并沒(méi)有全部改完,就改了一半左右浊猾。
3.Internationalization 意思是國(guó)際化
我想它應(yīng)該是一個(gè)標(biāo)準(zhǔn)化的意思抖甘。
我這里有3個(gè),第一個(gè)其實(shí)就是我在xml中直接寫(xiě)中文葫慎,它建議我用@String寫(xiě)到資源文件中衔彻。老鐵,道理我都懂偷办,我這378個(gè)地方艰额,我要改要畫(huà)時(shí)間啊,所以先把這個(gè)優(yōu)先級(jí)降低椒涯,再看看第二個(gè)柄沮。
第二個(gè)Overlapping items in RelativeLayout意思是RelativeLayout的Item重疊,我結(jié)合了一下我的代碼废岂,它的意思就是說(shuō)RelativeLayout中的元素可以會(huì)相互覆蓋祖搓,比如說(shuō)我這樣的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="48dp"
android:padding="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:id="@+id/tv_time"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:id="@+id/tv_order_num"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
一個(gè)在左一個(gè)在右,但是如果右邊的TextView太長(zhǎng)湖苞,會(huì)出現(xiàn)覆蓋左邊TextView拯欧。這個(gè)確實(shí)是一個(gè)寫(xiě)布局時(shí)大意的地方。
要防止這個(gè)事情發(fā)生财骨,需要在第二個(gè)TextView加上
android:layout_toRightOf="@+id/tv_time"
android:gravity="right"
第三個(gè)是TextView連接顯示的問(wèn)題镐作,就是我這樣寫(xiě)
tvMoney.setText("¥" + data.act.discountAmount);
是不建議的,而是建議使用占位符蚓再,那什么是占位符呢滑肉,就是用@String文件來(lái)做,比如我這樣
<string name="fetch_again">重新獲取(%1$d秒)</string>
總的來(lái)說(shuō)摘仅,這個(gè)目錄就是建議你使用一些國(guó)際化的規(guī)范寫(xiě)法靶庙。總的來(lái)說(shuō)優(yōu)先級(jí)也不是很高娃属,但是有時(shí)間的話(huà)還是建議改下六荒,畢竟按規(guī)范寫(xiě)準(zhǔn)沒(méi)錯(cuò)。
4.Performance 性能的意思
可想而知這條目錄的重要性和優(yōu)先級(jí)肯定高矾端。點(diǎn)開(kāi)目錄
我有差不多300個(gè)性能問(wèn)題掏击,看著都想哭。
點(diǎn)開(kāi)每個(gè)目錄秩铆,它有會(huì)有詳細(xì)的英文解釋?zhuān)苋菀拙湍芸炊屯瞥瞿睦飭?wèn)題砚亭,看不懂百度翻譯灯变。
比如說(shuō)第一條
它大概是說(shuō)我這個(gè) layout_width用0dp好過(guò)用match_parent,因?yàn)槲矣昧薼ayout_weight屬性捅膘。說(shuō)真的我不知道影響多大添祸,但這里說(shuō)了是性能相關(guān),那么最好還是改了寻仗。
再比如說(shuō)第二條刃泌,是因?yàn)槲以谧远xView的繪制過(guò)程中創(chuàng)建對(duì)象,所以它建議我不要這么做署尤,確實(shí)耙替,因?yàn)檫@些方法會(huì)經(jīng)常被調(diào)用,在這些方法里面做創(chuàng)建對(duì)象的操作會(huì)創(chuàng)建出來(lái)一大堆對(duì)象曹体,于是我把
lineViews = new ArrayList();
改成
lineViews.clear();
并把創(chuàng)建對(duì)象的操作寫(xiě)在外面俗扇,這個(gè)確實(shí)是我之前沒(méi)那么認(rèn)真注意到的一個(gè)問(wèn)題。
其它的就不一一說(shuō)了箕别,那些解釋都說(shuō)得很清楚狐援,主要是想說(shuō)明這個(gè)Performance 的優(yōu)先級(jí)很高,最好把里邊涉及到的問(wèn)題都改了究孕。
然后我就再說(shuō)說(shuō)一些我這邊會(huì)影響性能的細(xì)節(jié)
(1)嵌套權(quán)重會(huì)影響性能
(2)設(shè)置背景時(shí)要注意overdraw,意思就是說(shuō)這個(gè)的上一層背景已經(jīng)設(shè)了這個(gè)背景爹凹,而這個(gè)也設(shè)相同的厨诸,就造成了overdraw
(3)注意一下這項(xiàng),是關(guān)于Context內(nèi)存泄漏的
(4)未使用到的資源會(huì)影響性能禾酱,不過(guò)我不建議馬上刪除微酬,我覺(jué)得在發(fā)布前刪除比較好。
(5)無(wú)用布局不一定要無(wú)腦刪
這個(gè)是說(shuō)沒(méi)用到的布局颤陶,但是有個(gè)地方很奇怪颗管,就是我用了ScrollView , 雖然當(dāng)前內(nèi)容夠一屏幕,我是為了防止不同機(jī)型而設(shè)置的滓走,它也提示我這是多余的布局垦江。
我目前碰到的就這些,不要看我性能這塊有300個(gè)警告搅方,其實(shí)有200多個(gè)都是多余的資源文件比吭,真正嚴(yán)重的就十幾二十個(gè)。
5.Security 安全的意思
我看了一下姨涡,警告的都是我拷貝的一些網(wǎng)上的代碼衩藤,暫時(shí)看不懂是什么問(wèn)題。
6.Usability 復(fù)用/適用 的意思
第一條是說(shuō)我的Button很多相同涛漂,可以用style赏表,這個(gè)優(yōu)先級(jí)并不是這么高,第二個(gè)說(shuō)我input類(lèi)型和提示有誤,這個(gè)我倒覺(jué)得不用管瓢剿,第三個(gè)不是我寫(xiě)的代碼逢慌,我不背鍋,第四個(gè)說(shuō)我Text的尺寸太小了
說(shuō)尺寸最好不要小于12sp跋选,我只能說(shuō)涕癣,太良心了,哥們你這都要警告我前标。
7.issues
有Lint標(biāo)簽的都看完了坠韩,發(fā)現(xiàn)還有很多是issues 標(biāo)簽的,我隨便抽了一些出來(lái)看炼列,也沒(méi)看出有什么只搁。
8.Imports
這個(gè)很容易理解,就是你在類(lèi)中導(dǎo)入沒(méi)有用到的資源俭尖,這個(gè)我覺(jué)得還是要處理一下好氢惋。
這里有個(gè)技巧,點(diǎn)擊目錄右鍵稽犁,選擇Optimize Imports就能快速把整個(gè)項(xiàng)目多余的Imports給刪除焰望。
9.Declaration redundancy
這個(gè)是聲明冗余的意思∫押ィ可以按照它的說(shuō)明去更改熊赖,優(yōu)先級(jí)的話(huà)我覺(jué)得一般,不是很高虑椎。
10.Spelling
這個(gè)是拼寫(xiě)震鹉,比較有意思的東西,你的命名不規(guī)范的話(huà)在單詞下面都會(huì)畫(huà)個(gè)灰色的波浪線(xiàn)捆姜。然而完全沒(méi)影響传趾,除了對(duì)強(qiáng)迫癥的來(lái)說(shuō)。
11.probable bugs
這個(gè)就是說(shuō)你的代碼中可能會(huì)出現(xiàn)BUG的地方泥技,我認(rèn)為這個(gè)目錄的優(yōu)先級(jí)很高浆兰,做好按照它的說(shuō)明進(jìn)行更改,比如我這個(gè)零抬。
它就說(shuō)我調(diào)用這個(gè)方法可能會(huì)產(chǎn)生空指針镊讼,所以我就必須在這塊地方加個(gè)判斷。
就暫時(shí)看這么多吧平夜,我覺(jué)得重點(diǎn)就是Performance和Correctness 蝶棋,然后開(kāi)發(fā)時(shí)要注意一下國(guó)際化和拼寫(xiě)的問(wèn)題,可能之前開(kāi)發(fā)沒(méi)太注意加上項(xiàng)目功能挺多忽妒,導(dǎo)致現(xiàn)在警告好多玩裙。
但是在使用過(guò)程中也發(fā)現(xiàn)Lint的功能挺強(qiáng)大的兼贸,能反應(yīng)出很多代碼中的問(wèn)題,有助于開(kāi)發(fā)吃溅,而且也不是很難溶诞,建議可以抽點(diǎn)時(shí)間優(yōu)化下代碼。