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

在一個Android studio的項目中,每一個module的build.gradle文件裏面都標明瞭四個版本號,他們分別是
compileSdkVersionbuildToolsVersionminSdkVersiontargetSdkVersion

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

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

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



作者:死神的記憶
鏈接:https://www.jianshu.com/p/deee7e06c8dc
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章