Android Studio 內(nèi)置了代碼檢查工具 Lint,可在菜單欄選擇 Analyze > Inspect Code 執(zhí)行相應(yīng)的代碼檢查,代碼檢查能夠根據(jù)推斷一些不合法的潛在問題,有助于在開發(fā)階段發(fā)現(xiàn)開發(fā)者因為主管原因?qū)е碌囊幌麓a問題,Android 官方提供了注解庫 support-annotations 來幫助開發(fā)者及早發(fā)現(xiàn)問題,下面是常用的一些注解,主要內(nèi)容如下:
- Nullness注解
- 資源注解
- 線程注解
- 值約束注解
- 權(quán)限注解
- 返回值注解
- CallSuper注解
- Typedef注解
- 可訪問性注解
Nullness注解
使用 Nullness 注解可以檢查給定變量、參數(shù)和返回值是否允許 null 值,具體如下:
- @Nullable :表示可以為 null 的變量、參數(shù)或返回值,
- @NonNull :表示不可為 null 的變量、參數(shù)或返回值。

資源注解
資源注解的使用可使得在源碼階段讓編輯器檢查書寫的不規(guī)范,也可在一定程度上優(yōu)化代碼結(jié)構(gòu),下面是常見的資源注解如下:
- @StringRes: 表示檢查是否包含R.string引用
- @ColorRes: 表示檢查是否包含R.color引用
- @ColorInt: 表示檢查是否包含表示顏色的整型
- @DrawableRes: 表示檢查是否包含R.drawable引用
- @DimenRes: 表示檢查是否包含R.dimen引用
- @InterpolatorRes:表示檢查是否包含插值器引用
線程注解
線程注解可以檢查某個方法是否從某個特定類型的線程中調(diào)用,支持一下線程注解,具體如下:
- @MainThread:表示主線程
- @UiThread:表示 UI 線程
- @WorkerThread:表示工作線程
- @BinderThread:表示Binder線程
- @AnyThread:表示任何一個線程
上述注解中 @MainThread 和 @UiThread 在大多時候表示的都是同一線程,如果應(yīng)用中帶有多個試圖,UI 線程可與主線程不同,故可使用 @UIThread 標注與應(yīng)用的視圖層次相關(guān)聯(lián)的方法,使用 @MainThread 僅標注與應(yīng)用生命周期相關(guān)聯(lián)的方法。線程注解最常用的一個用途是 AsyncTask 使用中的方法替換,因為 AsyncTask 會執(zhí)行后臺操作并將結(jié)果發(fā)布到 UI 線程。
值約束注解
使用值約束注解可驗證傳遞的參數(shù)的值的合法性,可以借此指定參數(shù)的設(shè)置范圍,可在一定程度上減少代碼在主觀程度上出現(xiàn)的錯誤,常見的值約束注解如下:
- @IntRange:表示可以驗證整型參數(shù)是否在指定范圍內(nèi)
- @FloatRange:表示可以驗證浮點型參數(shù)是否在指定范圍內(nèi)
- @Size:表示可以驗證集合、數(shù)組、字符串參數(shù)是否在指定范圍內(nèi),可指定最大值、最小值以及確切值
上面的注解有一些可使用的參數(shù),如 from、to、min 等,使用時具體在某個注解體重查看定義即可。
權(quán)限注解
權(quán)限注解 @RequiresPermission 可以驗證方法調(diào)用方的權(quán)限,即當使用了權(quán)限注解的方法時會檢查有沒有指定的權(quán)限,如果沒有則會提示要在 AndroidManifest.xml 文件中申明權(quán)限,如果是危險權(quán)限還有進行權(quán)限動態(tài)申請,使用方式參考如下:

返回值注解
返回值注解 @CheckResult 會檢查某個方法的返回值是否被使用,如果沒有被使用,則會根據(jù) suggest 配置建議使用相同公民沒有返回值的另一個方法,如果返回值使用了,則和未加該注解的方法一樣,使用方式參考如下:
@CheckResult(suggest="#enforcePermission(String,int,int,String)") public int checkPermission(@NonNull String permission, int pid, int uid){ return 0; }
如果沒有使用返回值提示如下:

當返回值沒有被使用,則會建議使用相同功能沒有返回值的另一個方法,簡而言之,返回值注解 @CheckResult 能夠表示某個方法實際使用的時方法本身的處理還是方法最終的處理結(jié)果。

CallSuper注解
使用 @CallSuper 注解會驗證子類的重寫方法是否調(diào)用父類的實現(xiàn),這樣約束的好處是可保證父類的實現(xiàn)不會修改,當然,如果不使用該注解,子類重寫父類的方法可以不調(diào)用弗父類的默認實現(xiàn),具體參考如下:

下面是 Test 類的實現(xiàn)類:

Typedef注解
使用 @IntDef 和 @StringDef 注解 可以創(chuàng)建整型和字符串的枚舉注解來驗證其他代碼中使用的某些整型和字符串,可以保證代碼中的某些常量整型或常量字符串是某些具體定義的常量集,這兩個注解的位置只能是注解。
開發(fā)中總會使用到枚舉,枚舉在一定程度上可使得代碼結(jié)構(gòu)更清晰,但枚舉的使用會增加內(nèi)存的開銷,這里可以用 Typedef 注解的方式來代替枚舉,下面是 Tyoedef 注解的使用,參考如下:

下面是上述 Typedef 注解的使用方式,參考如下:

可見 Typedef 注解約束了使用到的某些整型,當然還可以是字符串,這樣也能達到枚舉的作用。
可訪問性注解
可訪問性注解是 @VisibleForTesting 和 @Keep 可以表示方法、字段、類的可訪問性。具體如下:
- @VisibleForTesting:表示注解的某個代碼塊的可見性高于能夠測試時需要的水平
- @Keep:表示被注解的代碼塊將不會被混淆。
最常用的可能就是資源注解,如 @StringRes、@ColorRes、@ColorInt等,還有Typeof 注解,該注解可以在替換枚舉在 Android 開發(fā)中帶來的性能影響,如果平時留意這些注解在 Android 源碼中也經(jīng)常使用,所以可在開發(fā)過程中嘗試去使用這些注解以進行必要的代碼檢查。
最后
如果你看到了這里,覺得文章寫得不錯就給個贊唄!歡迎大家評論討論!如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足,定期免費分享技術(shù)干貨。謝謝!