前言
利用好相關代碼檢查工具,是一種自我的CodeReview
榆鼠,可以有效降低Bug
率妆够,提升自我的代碼優(yōu)化意識。常用的代碼檢查工具有AndroidStudio
自帶的Lint
工具家妆、 Alibaba Java Coding Guidelines
什么是 Lint
Android Lint
是SDK Tools 16(ADT 16)
開始引入的一個代碼掃描工具冕茅,通過對代碼進行靜態(tài)分析伤极,可以幫助開發(fā)者發(fā)現(xiàn)代碼質(zhì)量問題和提出一些改進建議。除了檢查Android
項目源碼中潛在的錯誤嵌赠,對于代碼的正確性塑荒、安全性、性能姜挺、易用性齿税、便利性和國際化方面也會作出檢查。Android Lint
作為項目的代碼檢測工具炊豪,是因為它具有以下幾個特性:
- 已經(jīng)被集成到
Android Studio
凌箕,使用方便;- 能在編寫代碼時實時反饋出潛在的問題;
- 可以自定義規(guī)則牵舱。
Android Lint
本身包含大量已經(jīng)封裝好的接口慧妄,能提供豐富的代碼信息罪裹,開發(fā)者可以基于這些信息進行自定義規(guī)則的編寫。
1鬓椭、開始使用
Android Lint
的工作過程比較簡單,一個基礎的Lint
過程由Lint Tool
(檢測工具),Source Files
(項目源文件) 和lint.xml
(配置文件) 三個部分組成,Lint Tool
讀取Source Files
,根據(jù)lint.xml
配置的規(guī)則(issue
)輸出結(jié)果(如下圖)。
2馋劈、操作步驟
Android Studio
中,Android Lint
已經(jīng)被集成,只需要點擊Analyze
-----Inspect Code
即可運行Android Lint
:
在彈出的對話框中可以設置執(zhí)行
Lint
的范圍苦丁,可以選擇整個項目,也可以只選擇當前的子模塊或者其他自定義的范圍:
檢查完畢后會彈出
Inspection
的控制臺谢鹊,并在其中列出詳細的檢查結(jié)果:
如上圖所展示的,
Android Lint
對檢查的結(jié)果進行了分類,同一個規(guī)則(issue
)下的問題會聚合梧躺,其中針對Android
的規(guī)則類別會在分類前說明是Android
相關的塞琼,主要是六類:
Accessibility
無障礙派近,例如ImageView
缺少contentDescription
描述戒幔,String 編碼字符串等問題错沃。Correctness
正確性Internationalization
國際化,如字符缺少翻譯等問題。Performance
性能捆愁,例如在onMeasure
、onDraw
中執(zhí)行 new,內(nèi)存泄露他匪,產(chǎn)生了冗余的資源絮供,xml
結(jié)構(gòu)冗余等向拆。Security
安全性吆鹤,例如沒有使用HTTPS
連接Gradle
温鸽,AndroidManifest
中的權(quán)限問題等。Usability
易用性迷守,例如缺少某些倍數(shù)的切圖圣絮,重復圖標等。
其他的結(jié)果條目則是針對Java
語法的問題埃叭,另外每一個問題都有區(qū)分嚴重程度(severity
),從高到底依次是:Fatal
屏富、Error
、Warning
栅屏、Information
、Ignore
其中Fatal
和Error
都是指錯誤松靡,但是Fatal
類型的錯誤會直接中斷ADT
導出APK
,更為嚴重啦逆。
在結(jié)果列表中點擊一個條目瘦材,可以看到詳細的源文件名和位置,以及命中的錯誤規(guī)則(issue
)屋休、解決方案或者屏蔽提示
除了直接在菜單中運行Lint
外,大部分問題代碼在編寫時Android Studio
就會給出提醒附较。
3吃粒、自定義配置
對于執(zhí)行
Lint
操作的相關配置,是定義在gradle
文件的lintOptions
中拒课,可定義的選項及其默認值
android {
lintOptions {
// 設置為 true徐勃,則當 Lint 發(fā)現(xiàn)錯誤時停止 Gradle 構(gòu)建
abortOnError false
// 設置為 true事示,則當有錯誤時會顯示文件的全路徑或絕對路徑 (默認情況下為true)
absolutePaths true
// 僅檢查指定的問題(根據(jù) id 指定)
check 'NewApi', 'InlinedApi'
// 設置為 true 則檢查所有的問題,包括默認不檢查問題
checkAllWarnings true
// 設置為 true 后僻肖,release 構(gòu)建都會以 Fatal 的設置來運行 Lint肖爵。
// 如果構(gòu)建時發(fā)現(xiàn)了致命(Fatal)的問題,會中止構(gòu)建(具體由 abortOnError 控制)
checkReleaseBuilds true
// 不檢查指定的問題(根據(jù)問題 id 指定)
disable 'TypographyFractions','TypographyQuotes'
// 檢查指定的問題(根據(jù) id 指定)
enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
// 在報告中是否返回對應的 Lint 說明
explainIssues true
// 寫入報告的路徑臀脏,默認為構(gòu)建目錄下的 lint-results.html
htmlOutput file("lint-report.html")
// 設置為 true 則會生成一個 HTML 格式的報告
htmlReport true
// 設置為 true 則只報告錯誤
ignoreWarnings true
// 重新指定 Lint 規(guī)則配置文件
lintConfig file("default-lint.xml")
// 設置為 true 則錯誤報告中不包括源代碼的行號
noLines true
// 設置為 true 時 Lint 將不報告分析的進度
quiet true
// 覆蓋 Lint 規(guī)則的嚴重程度遏匆,例如:
severityOverrides ["MissingTranslation": LintOptions.SEVERITY_WARNING]
// 設置為 true 則顯示一個問題所在的所有地方,而不會截短列表
showAll true
// 配置寫入輸出結(jié)果的位置谁榜,格式可以是文件或 stdout
textOutput 'stdout'
// 設置為 true,則生成純文本報告(默認為 false)
textReport false
// 設置為 true凡纳,則會把所有警告視為錯誤處理
warningsAsErrors true
// 寫入檢查報告的文件(不指定默認為 lint-results.xml)
xmlOutput file("lint-report.xml")
// 設置為 true 則會生成一個 XML 報告
xmlReport false
// 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Fatal
fatal 'NewApi', 'InlineApi'
// 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Error
error 'Wakelock', 'TextViewEdits'
// 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Warning
warning 'ResourceAsColor'
// 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 ignore
ignore 'TypographyQuotes'
}
}
lint.xml
這個文件則是配置Lint
需要禁用哪些規(guī)則(issue
)窃植,以及自定義規(guī)則的嚴重程度(severity
),lint.xml
文件是通過issue
標簽指定對一個規(guī)則的控制荐糜,在項目根目錄中建立一個lint.xml
文件后Android Lint
會自動識別該文件巷怜,在執(zhí)行檢查時按照lint.xml
的內(nèi)容進行檢查。如上面提到的那樣暴氏,開發(fā)者也可以通過lintOptions
中的lintConfig
選項來指定配置文件延塑。lint.xml
示例如下:
<?xml version="1.0" encoding="utf-8" ?>
<lint>
<issue id="HardcodedText" severity="ignore" />
<issue id="SmallSp" severity="ignore" />
<issue id="AddJavascriptInterface" severity="ignore" />
<issue id="AdapterViewChildren" severity="warning" />
<issue id="AllowBackup" severity="ignore" />
<issue id="Deprecated" severity="warning">
<ignore regexp="singleLine" />
</issue>
</lint>
issue
標簽中使用id
指定一個規(guī)則,severity="ignore"
則表明禁用這個規(guī)則答渔。需要注意的是关带,某些規(guī)則可以通過ignore
標簽指定僅對某些屬性禁用,例如上面的Deprecated
沼撕,表示檢查是否有使用不推薦的屬性和方法宋雏,而在issue
標簽中包裹一個ignore
標簽,在ignore
標簽的regexp
屬性中使用正則表達式指定了singleLine
务豺,則表明對singleLine
這個屬性屏蔽檢查磨总。
另外開發(fā)者也可以使用@SuppressLint(issue id)
標注針對某些代碼忽略某些Lint
檢查,這個標注既可以加到成員變量之前笼沥,也可以加到方法聲明和類聲明之前蚪燕,分別針對不同范圍進行屏蔽。
Alibaba Java Guidelines的使用
這是一款阿里巴巴基于
Java
規(guī)范開發(fā)的AndroidStudio
插件奔浅,需要單獨安裝在AndroidStudio
中馆纳,它可以規(guī)范我們的代碼編寫,進行實時代碼規(guī)范提示汹桦。
1厕诡、如何安裝插件
Android Studio
-->File
-->Settings
... -->Plugins
--> 搜索Alibaba Java Guidelines
--> 安裝并重啟Android Studio
2、使用
在日常編寫代碼時营勤,插件會實時對代碼進行檢測給出相應的提示信息灵嫌,并給出對應的代碼優(yōu)化方案壹罚。示例如下:
下面switch
語句塊,按照Java
規(guī)范寿羞,是缺少default
語句的猖凛,插件會提示加上。
Apk 體積分析
當我們打包
apk
之后绪穆,有時候apk
有點大辨泳,想要針對apk
進行“瘦身”,此時我們需要知道哪些哪些東西占用較多玖院,才有針對性的進行apk
體積優(yōu)化菠红,可以使用AndroidStudio
自帶功能檢測apk
。
在AndroidStudio
中雙擊打包的apk
文件之后右側(cè)會彈出對應的apk分析窗口难菌,如下所示:
可以清楚看到哪些文件占用apk
大小的比重信息试溯,同時也可以將兩個apk
進行比對。
依賴占用過大郊酒,可以選擇將一些沒有使用到的依賴進行剔除遇绞,資源圖片沒有使用到的也可以剔除掉,資源圖片占用過大燎窘,可使用TinyPng
將圖片進行無損壓縮處理摹闽。