http://www.kuqin.com/shuoit/20150728/347238.html
http://www.kuqin.com/shuoit/20150728/347238.html
http://www.kuqin.com/shuoit/20150728/347238.html
http://www.kuqin.com/shuoit/20150728/347238.html
使用Android lint發現并解決高版本API問題
浏覽次數:3139次 技術小黑屋 2015年07月28日 字号: 大 中 小
JiaThis Button BEGIN
分享到:
QQ空間
新浪微網誌
騰訊微網誌
人人網
豆瓣網
開心網
更多
2
JiaThis Button END
PostContent begin
在編寫代碼時,為了實作一些功能,我們需要使用高版本的API,比如SharedPreference的Editor中的apply方法為API 9開始引入,在API 9 以上的機器使用沒有問題,但是在API 8上,如果運作時執行了這段代碼,就會崩潰,問題相當嚴重。尤其是該問題出現在正式版中,後果不堪設想。本文将介紹如何使用lint發現并解決這些問題。
lint是什麼
lint是Android提供的一個靜态代碼分析的工具,使用這個工具可以幫助我們找出Android項目中潛在的bug,安全,性能,可用性,輔助性和國際化等問題,同時還可以查找出錯誤拼寫,提示開發者更正。
lint的工作流程
上圖為lint的工作流程圖,下面為一些元素的簡短說明。
程式源檔案
程式源檔案就是Android工程的組成部分,包括Java和xml檔案,圖示以及混淆配置檔案
lint.xml檔案
lint配置檔案,用來排除某些檢查或者自定義檢測問題的嚴重程度。
lint工具
一個靜态代碼掃描工具,對Android工程進行掃描分析,可以從終端執行指令,也可以從Android Studio等IDE中使用。lint工具可以幫助我們找到Android應用性能和代碼品質問題。在正式釋出應用之前,強烈建議使用lint檢查并修複發現的問題。
lint檢查結果
lint的檢查結果可以從終端,Android Studio等IDE工具,或者生成結果檔案檢視。每一個問題都會标明在檔案中的位置行數,以及關于該問題的說明等資訊。
查找問題
知道了lint如何工作,就隻需執行lint查找問題,有了明确的問題,才能有的放矢地解決。
Android Sutdio
選擇菜單Analyze—>Configure Current File Analysis—>Configure Inspections 清空所有的檢查項,然後如下圖勾選Calling new methods on older versions和Using inlined constants on older versions
然後執行Analyze—> Inspect Code,然後檢視底部的Inspection即可
command line
lineos:false
1 2 | cd project_root_dir lint --check NewApi,InlinedApi --html /tmp/api_check.html ./ |
無需多時,結果就會以html形式寫入/tmp/api_check.html檔案
Gradle Command Line
配置build.gradle
lineos:false
1 2 3 4 5 6 7 8 | android{ //some other config lintOptions { abortOnError false xmlReport false check 'NewApi', 'InlinedApi' } } |
然後執行下面的指令
lineos:false
1 2 | cd project_root_dir ./gradlew lint |
結果會輸出到工程目錄build/outputs/lint-results.html。
如何解決
結合上面的輸出結果,我們接下來要做的就是如何解決,如下為一些解決思路。
必然執行高版本API
- 如果是NewApi警告,考慮其他方法代替。比如String.isEmpty自API 9才引入,但是使用TextUtils.isEmpty替換。
- 如果是InlinedApi警告,可以自定義與常量同值的另一個常量。
- 使用反射,對于不太重要的方法,我們可以使用反射來解決問題。
或然執行高版本API
如果該段代碼進行了API Level限制,確定高版本API不會在低版本設定執行,隻需對這個警告設定為忽略即可。
實戰解決
以下代碼所屬工程最低支援2.2系統,即API 8。
NewApi有警報代碼
lineos:false
1 2 3 | private void testNewApi() { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putBoolean("first_use", false).apply(); } |
上面代碼中的apply方法為Android API 9引入,使用lint檢查會提示警告。
方案一
按照API Level不同,選擇不同的方法,對于API 9以下使用commit,API 9及其以上使用apply
lineos:false
1 2 3 4 5 6 7 8 9 | private void testNewApi() { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putBoolean("first_launch", false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { editor.apply(); } else { editor.commit(); } } |
方案二
對于确定不會在低版本運作的情況,我們可以增加@TargetApi加上對應的API引入的版本即可。
lineos:false
1 2 3 4 5 | @TargetApi(Build.VERSION_CODES.GINGERBREAD) private void testNewApi() { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putBoolean("first_launch", false).apply(); } |
方案三
同樣確定新API不會在低版本運作,也可以忽略警報。
lineos:false
1 2 3 4 5 | @SuppressLint("NewApi") private void testNewApi() { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putBoolean("first_launch", false).apply(); } |