天天看點

Android Lint掃描優化(一)

一.使用Lint

工具欄 -> Analyze -> Inspect Code

Android Lint掃描優化(一)
Android Lint掃描優化(一)

彈出窗的Custom scope可以選擇對哪一指定部分進行掃描,whole project是整個項目,不太建議每次都掃描整個項目,因為太耗時了。

二.觀察Lint的結果

初次掃描之後,會彈出一個顯示掃描結果的視窗,比如我的掃描結果:

Android Lint掃描優化(一)

1萬7個警告,尼瑪我寫的代碼就這麼糟糕嗎,我這感覺要改到下個月都改不完啊,看到這麼多的警告,先不要慌,首先要做的就是删除項目重新做,開玩笑的,先找下資料看看每一欄目錄表示什麼。

1. Accessibility意思是便利性的意思

具體什麼意思我也不知道,然後點開發現都是這個提示

Android Lint掃描優化(一)

這些都是針對ImageView和ImageButton的,說我缺少contentDescription這個參數,這屬性是啥我也不知道,以前一直沒用過,然後百度檢視看。

Android Lint掃描優化(一)

瞬間覺得很屌,這些都是我平時開發沒有考慮過的,雖然這個警告對我來說影響不大,要用的話可以按教程來做,這裡我就暫時先搞空的。

而這個也驗證了“Accessibility”這個的含義,主要是要你提供一些周遊的警告。

優化優先級很低,我覺得可以直接忽略

2. Correctness 這是正确性的意思

也看看是哪裡有問題才能推出這個目錄具體的分類。點開後發現有很多欄

Android Lint掃描優化(一)

其實如果寫android比較多的話,就算英語不太好也大概知道是什麼意思,比如第一個就是說Class沒被注冊到manifest中,那這個Class基本肯定是一個Activity

我發現是我的一個基類沒注冊,不知道為什麼這會提示這個BUG。這個先不管,看我第2條,它報這個警告

Android Lint掃描優化(一)

這個就有意思了,雖然目前沒出錯,但是按照它的說法去做肯定更安全,這也展現Lint的優化的好處,我們肯定是盡量消除警告的好,雖然有些警告并不影響運作的結果,但是消除這些警告肯定會更為安全些。

然後改了一下其它的,發現這個目錄就是說你用的某個地方不太好,比如說版本舊,比如說多寫了某些内容,比如說讓你在設定字型大小時用sp不要用dp,它就會給你一些合理的修改方法,其實我并沒有全部改完,就改了一半左右。

3.Internationalization 意思是國際化

我想它應該是一個标準化的意思。

Android Lint掃描優化(一)

我這裡有3個,第一個其實就是我在xml中直接寫中文,它建議我用@String寫到資源檔案中。老鐵,道理我都懂,我這378個地方,我要改要畫時間啊,是以先把這個優先級降低,再看看第二個。

第二個Overlapping items in RelativeLayout意思是RelativeLayout的Item重疊,我結合了一下我的代碼,它的意思就是說RelativeLayout中的元素可以會互相覆寫,比如說我這樣的布局

<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>
           

一個在左一個在右,但是如果右邊的TextView太長,會出現覆寫左邊TextView。這個确實是一個寫布局時大意的地方。

要防止這個事情發生,需要在第二個TextView加上

android:layout_toRightOf="@+id/tv_time"
android:gravity="right"
           

第三個是TextView連接配接顯示的問題,就是我這樣寫

tvMoney.setText("¥" + data.act.discountAmount);
           

是不建議的,而是建議使用占位符,那什麼是占位符呢,就是用@String檔案來做,比如我這樣

<string name="fetch_again">重新擷取(%1$d秒)</string>
           

總的來說,這個目錄就是建議你使用一些國際化的規範寫法。總的來說優先級也不是很高,但是有時間的話還是建議改下,畢竟按規範寫準沒錯。

4.Performance 性能的意思

可想而知這條目錄的重要性和優先級肯定高。點開目錄

Android Lint掃描優化(一)

我有差不多300個性能問題,看着都想哭。

點開每個目錄,它有會有詳細的英文解釋,很容易就能看懂和推出哪裡問題,看不懂百度翻譯。

比如說第一條

Android Lint掃描優化(一)

它大概是說我這個 layout_width用0dp好過用match_parent,因為我用了layout_weight屬性。說真的我不知道影響多大,但這裡說了是性能相關,那麼最好還是改了。

再比如說第二條,是因為我在自定義View的繪制過程中建立對象,是以它建議我不要這麼做,确實,因為這些方法會經常被調用,在這些方法裡面做建立對象的操作會建立出來一大堆對象,于是我把

lineViews = new ArrayList();
           

改成

lineViews.clear();
           

并把建立對象的操作寫在外面,這個确實是我之前沒那麼認真注意到的一個問題。

其它的就不一一說了,那些解釋都說得很清楚,主要是想說明這個Performance 的優先級很高,最好把裡邊涉及到的問題都改了。

然後我就再說說一些我這邊會影響性能的細節

(1)嵌套權重會影響性能

Android Lint掃描優化(一)

(2)設定背景時要注意overdraw,意思就是說這個的上一層背景已經設了這個背景,而這個也設相同的,就造成了overdraw

(3)注意一下這項,是關于Context記憶體洩漏的

Android Lint掃描優化(一)

(4)未使用到的資源會影響性能,不過我不建議馬上删除,我覺得在釋出前删除比較好。

Android Lint掃描優化(一)

(5)無用布局不一定要無腦删

Android Lint掃描優化(一)

這個是說沒用到的布局,但是有個地方很奇怪,就是我用了ScrollView , 雖然目前内容夠一螢幕,我是為了防止不同機型而設定的,它也提示我這是多餘的布局。

我目前碰到的就這些,不要看我性能這塊有300個警告,其實有200多個都是多餘的資源檔案,真正嚴重的就十幾二十個。

5.Security 安全的意思
Android Lint掃描優化(一)

我看了一下,警告的都是我拷貝的一些網上的代碼,暫時看不懂是什麼問題。

6.Usability 複用/适用 的意思
Android Lint掃描優化(一)

第一條是說我的Button很多相同,可以用style,這個優先級并不是這麼高,第二個說我input類型和提示有誤,這個我倒覺得不用管,第三個不是我寫的代碼,我不背鍋,第四個說我Text的尺寸太小了

Android Lint掃描優化(一)

說尺寸最好不要小于12sp,我隻能說,太良心了,哥們你這都要警告我。

7.issues

有Lint标簽的都看完了,發現還有很多是issues 标簽的,我随便抽了一些出來看,也沒看出有什麼。

8.Imports

這個很容易了解,就是你在類中導入沒有用到的資源,這個我覺得還是要處理一下好。

這裡有個技巧,點選目錄右鍵,選擇Optimize Imports就能快速把整個項目多餘的Imports給删除。

Android Lint掃描優化(一)
9.Declaration redundancy

這個是聲明備援的意思。可以按照它的說明去更改,優先級的話我覺得一般,不是很高。

10.Spelling

這個是拼寫,比較有意思的東西,你的命名不規範的話在單詞下面都會畫個灰色的波浪線。然而完全沒影響,除了對強迫症的來說。

11.probable bugs

這個就是說你的代碼中可能會出現BUG的地方,我認為這個目錄的優先級很高,做好按照它的說明進行更改,比如我這個。

Android Lint掃描優化(一)

它就說我調用這個方法可能會産生空指針,是以我就必須在這塊地方加個判斷。

就暫時看這麼多吧,我覺得重點就是Performance和Correctness ,然後開發時要注意一下國際化和拼寫的問題,可能之前開發沒太注意加上項目功能挺多,導緻現在警告好多。

但是在使用過程中也發現Lint的功能挺強大的,能反應出很多代碼中的問題,有助于開發,而且也不是很難,建議可以抽點時間優化下代碼。

繼續閱讀