compileSdkVersion,minSdkVersion,targetSdkVersion 作用和區別
Android大家都知道的,版本碎片化比較嚴重,做版本的適配是必須,從而有了下面的這些知識點。
1.compileSdkVersion,minSdkVersion,targetSdkVersion作用和如何選擇關系.
2.Support Library 包的選擇,v4,v7等包到底是干啥的。
3.我們到底該如何選擇這些東西運行項目的時候才能正確運行。
下面我將圍繞這些問題和疑問來給大家一步步講解他們的關系。
一丶compileSdkVersion,miniSdkVersion,targetSdkVersion的作用 :
1.compileSdkVersion:這個主要是我們編譯app時候用的sdk版本,就我們在AndroidStudio上面點擊運行時候的編譯時候的環境。記住這個只是在編譯時候選擇的版本,不涉及到運行時候的行為。由于androidStudio有預編譯的功能所以會提示一些警告,提前了解新的sdk
api。修改compileSdkVersion并不會影響我們的我們生成的app在手機先的行為。例如在android6.0之前的系統是不需要動態申請權限的,在6.0之后的系統需要動態申請權限。這個和你的compileSdkVersion的版本選擇是完全沒有任何關系的。也就是說你app運行時需不需要動態申請權限和你complieSdk是否設置的6.0,沒有半毛錢關系,記住compileSDK只是關系到你編譯出來的包。不是運行的表現行為。所以修改compileSdkVersion是不會改變你app在手機上運行的表現行為的。但是我們一般情況,也是最理想的情況就是把compileSdkVersion設置到最高,因為使用新的編譯檢查可以獲得很多好處,可以避免棄用的API,并且為使用新的API做好準備。
2.minSdkVersion:這個就是程序運行的最低的要求的Sdk,就是給說如果我設置的minSdkVersion是15的話那么如果你系統低于這個SdkVersion是安裝不上的。還有一個好處就是。例如你設置miniSdk是3.0的話,你寫的方法只有在4.0后才有的方法,這個時候就會提示你在3.0的時候是沒有這個方法的。
Studio會給你這樣的提示。說但前的最低版本level是15這個方法是在23上才有的。
我們得這樣做:
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {
requestPermissions(newString[]{""},REQUEST_CODE_ASK_CALL_PHONE);
}else{
//不需要申請權限直接調用我們需要處理的方法。
}
添加一張圖片緩解視覺疲勞。顯得排版好看。
3.targetSdkVersion:targetSdk主要是提供向前兼容的作用,什么意思呢?手機系統4.0的,或者
5.0或者更高,但是編譯包的時候用的compileSdk是6.0,但是表現形式得按照targetSdk。1.提供向下兼容。2.確定app的表現行為。3.這允許你在適應新的行為變化之前就可以使用新的
API (因為你已經更新了 compileSdkVersion 打出來的包就是在compileSdkVersion上打出來的)。
A.當系統版本高于targetSdkVersion時候:
假設我們的targetSdkVersion是22(就是5.0)不需要動態申請權限,但是我們的系統是6.0的。現在程序運行到了需要某個需要權限的地方了。此時想想我們的手機該怎么辦。
系統邏輯是這樣的。這不代碼系統源碼,只是說處理邏輯。
finalint sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
if(sdkVersion
//這里的M就是level 23也就是6.0的系統
//這里的判斷是如果當前的打包的targetSdkVersion小于23
那么這里就不需要動態申請權限直接可以調取開放的權限
}else{
//否則系統認為你需要動態申請權限
}
注意這里是系統處理。不需要你顯式的寫這些代碼。是系統內部的代碼和自動處理。所以targetSdkVersion是確定表現形式的。并且也做到了向下兼容。
B.當系統版本等于targetSdkVersion時候
當安裝app的時候targetSdkVersion剛好等需系統的level,這個時候Andorid平臺會認為這個程序在此版本上已經經過了充分的測試。不必為此程序開啟兼容性檢查判斷的工作了。也就是說,如果targetSdkVersion與目標設備的API版本相同時,運行效率可能會高一些。
C.當系統版本小于targetSdkVersion的時候
還是舉栗子把:targetSdkVersion=23的時候,但是系統版本是22很明顯你代碼里面做了動態權限分配。但是系統版本不支持。怎么辦呢?我們ninSdk不就是處理這個情況的嗎?
從這里看出targetSdkVersion的設置主要是當系統版本高于設置的target的時候。
http://www.race604.com/android-targetsdkversion/講targetSdkVersion作用的。
總的來說你的app的表現行為和你是否修改過targetSdkVersion是有關系的。當我們修改他的時候要做足夠的測試。
minSdkVersion<=targetSdkVersion<=compileSdkVersion
minSDKVersion查看創建項目的時候的版本分部圖表確定,然后targetSdkVersion最好和compileSdkVersion一樣。CompileSdk選最新的,因為你更新了
compileSdkVersion 打出來的包就是在compileSdkVersion上打出來的。可以使用最新的api
上面就是講的這個3個sdkVerison的作用了。要是還有不明白的可以留言,我將會盡我所能為大家解答。
二丶buildToolsVersion和這些配置的sdkVesion有什么關系呢。
buildToolsVersion是講的你構建工具的版本號是多少,規則是可以用高的構建工具來構建低版本Sdk的工程。
三丶接下來講講v4,v7,v13的
總體來說這個就是一個libs和我們在github上都的libs一模一樣。由于android版本碎片化太嚴重了。導致的,說一個案例在剛開始的時候android系統是沒有ViewPager的。是后面的系統才出現的。那么以前的系統想用ViewPager該怎么辦呢?好辦和我們項目需要自定義某些特殊的View一樣,沒有的話我們要么自己寫,要么到github上面去找然后引入到我們的項目中。這里從github上導入就是這個意思了。但是為啥叫做v4呢。就是說這個包可以兼容到1.6以后的系統可以使用。所以1.6以下的系統是用不了的。v7包的意思就是可以兼容到2.3以上的系統。另外v7包是依賴v4包的。可以看出v4包的minSdk肯定是等于1.6了。v7包的minSdk就會是2.3。v13包主要是在平板上使用,一般在手機端不會用。
再通過這里我們就會發現一個事情了,我們想要使用v7包我們project,對nimSdk是有要求的我們的minSdk不能比support包的還低吧。
看到了吧。提示我們要使用v7包必須要minSdk在9或以上
這里注意了,就是我們在使用surpport包的時候或者lbs的時候我們的minSdk不能比他的還低。
大家有什么疑問可以關注我公眾號在上面提問,每周都會給大家提供純手打干貨。謝謝大家了。
來自:http://www.jianshu.com/p/72d311d72fcb