關于build.gradle四個版本號的含義

在一個Android studio的項目中,每一個module的build.gradle文件里面都標明了四個版本號,他們分別是
compileSdkVersion,buildToolsVersion,minSdkVersiontargetSdkVersion

很多人都不是很能弄清楚這四個版本的區別。在這里我僅發表個人理解,如果有錯,希望指正

compileSdkVersion

  • compileSdkVersion 指的是編譯版本,填寫的是Android的版本號,比如說Android5.1,版本號是21.
  • 在sdk目錄下的platforms目錄里可以看到已經下載好的android版本,如果填寫的版本沒有出現在platorms目錄中,需要先下載。
  • 如填寫的是21,代表是將android-21目錄下得android.jar參與apk的編譯
  • 如果你的compileSdkVersion設置成了21,但是想要使用一個API23才出現的方法,這是不可行的,必須把compileSdkVersion設置成23或以上

buildToolsVersion

  • buildToolsVersion 只是的是build工具的版本號。一般每一個android版本都會有對應的buildTools。Android系統在不斷升級,每次添加新特性,就需要新的工具來進行build,所以老的build工具不能用來build新的版本。
  • 新的build工具可以build老的Android版本,新的工具兼容老的版本。
  • 有些時候gradle的androd插件更新,需要把buildToolsVersion提升至指定的版本才能繼續使用下去。
  • 一般來說,這個填到最高就好了,因為新的兼容舊的。

minSdkVersion

  • minSdkVersion 最小sdk版本。他代表的意思是你的App最低支持的手機版本。如果你的minSdkVersion設置成了16(Android4.0),那么Apk在16以下系統的手機無法安裝。
  • 這個選項在Android Studio中還有著代碼檢查的作用。如果你的minSdkVersion設置成了16,但是在代碼當中使用了一個API19才出現的方法,此時編譯器就會給你發出警告。
    Android Studio也會給你提出一些解決方案,比如
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
   //在API>=19的設備上的處理方案 
 }else{
    //在API<19時的處理方案
 }
  • module關聯其他module或者library的時候,被關聯者的minSdkVersion需要<=關聯者。這個想必大家都能理解,不然有些手機無法運行。如果>=會怎么樣呢?下面是編譯時報出來的錯誤。
/Users/username/Workspace/Project/app/src/main/AndroidManifest.xml Error:
        uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:update-release:] /Users/liyuanbiao/.android/build-cache/97f09e07bc542365f812e5e9f61cd044a43ee5e4/output/AndroidManifest.xml
        Suggestion: use tools:overrideLibrary="com.library.package" to force usage

See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.

解決的方法已經在錯誤日志當中提到了,在manifest文件中添加

 <uses-sdk tools:overrideLibrary="com.library.package" />

targetSdkVersion

  • targetSdkVersion指的是API目標版本。它是Android里提供的一種向下兼容的方案。Android發展得太快,每一個版本都帶來了很多新特性,開發者還來不及給apk適配新系統,難道apk就要不能用了么,答案是NO。拿一個有代表性的例子來說,Android6.0的權限檢查機制改成了動態申請,需要在在項目中加入權限的申請代碼。

調用requestPermissions進行申請權限

 public final void requestPermissions(@NonNull String[] permissions, int requestCode)

在onRequestPermissionsResult進行權限申請后結果的處理

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) {
        /* callback - no nothing */
    }

如果將targetSdkVersion設置成<23,那么在6.0及以上的設備上就不會以6.0的新特性來運行了,當然也不需要動態申請了。

  • 這個選項也有代碼檢查的作用,比如你targetSdkVersion>=23,在編寫代碼的時候,你可能會不清楚當前代碼是否需要申請動態權限,Android Studio會在你需要申請權限的地方提出警告。

總結

  • compileSdkVersion盡量填最新的,以確保你能使用最新的API。
  • buildToolsVersion盡量最高的,因為新的兼容舊的。
  • minSdkVersion可以適量填小一點,以確保更多的人群能夠使用,建議填寫16(Android4.0),4.0以下的機型已經不多了。
  • targetSdkVersion可以根據需要來,比如想要使用到新系統的一些新特性。建議22,小于Android6.0
  • 根據上述四個版本的特點,可以得出以下結論。
    minSdkVersion <= targetSdkVersion <= compileSdkVersion

如果上述有什么不對的地方,或者表達不清楚的地方,還請指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。