天天看點

使用Android lint發現并解決高版本API問題

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(); }