在一個Android studio的項目中,每一個module的build.gradle文件裏面都標明瞭四個版本號,他們分別是compileSdkVersion
,buildToolsVersion
,minSdkVersion
,targetSdkVersion
很多人都不是很能弄清楚這四個版本的區別。在這裏我僅發表個人理解,如果有錯,希望指正
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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。