compileSdkVersion, minSdkVersion 和 targetSdkVersion詳解
阿新 • • 發佈:2019-02-03
API level
API level是一個整數,它指的是我們使用的框架(Framework)的版本,也就是我們使用的sdk中的各個平臺下的android.jar。
但是這個API level又和Android系統的版本有著對應關係,並且每個系統都會在內部記錄它所使用的API level。
https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional
compileSdkVersion(Eclipse中叫做build target)
1.在eclipse中位於專案根目錄中的project.properties檔案中 2.在studio中位於專案中的build.gradle中 作用:用哪個 Android SDK 版本編譯你的應用 強烈推薦總是使用最新的 SDK 進行編譯(預設就是最新的) 修改 compileSdkVersion 不會改變執行時的行為。當你修改了 compileSdkVersion 的時候,可能會出現新的編譯警告、編譯錯誤, 但新的 compileSdkVersion 不會被包含到 APK 中:它純粹只是在編譯的時候使用。 注意:如果使用 Support Library ,那麼使用最新發布的 Support Library 就需要使用最新的 SDK 編譯。
minSdkVersion
指明應用程式執行所需的最小API level。如果不指明的話,預設是1。也就是說該應用相容所有的android版本。我們應該總是宣告這個屬性。 如果系統的API level低於android:minSdkVersion設定的值,那麼android系統會阻止使用者安裝這個應用 如果指明瞭這個屬性,並且在專案中使用了高於這個API level的API, 那麼會在編譯時報錯。(下面會講解解決方法) 請記住:你所使用的庫,如 Support Library 或 Google Play services,可能有他們自己的 minSdkVersion 。你的應用設定的 minSdkVersion 必需大於等於這些庫的 minSdkVersion 。
targetSdkVersion
targetSdkVersion 是 Android 提供向前相容的主要依據 將 target 更新為最新的 SDK 是所有應用都應該優先處理的事情。但這不意味著你一定要使用所有新引入的功能,也不意味著你可以不 做任何測試就盲目地更新 targetSdkVersion ,請一定在更新 targetSdkVersion 之前做測試! 如果平臺的API Level高於你的應用程式中的targetSdkVersion屬性指定的值,系統會開啟相容行為來確保你的應用程式繼續以期望的 形式來執行。你可以通過指定targetSdkVersion來匹配執行程式的平臺的 API level來禁用這種相容性行為。舉例來說,設定這個值為11 或更高,當你的應用執行在Android3.0或更高的系統上時,系統會為你的應用使用新的預設主題(Holo主題),並且當執行在大螢幕的設 備上時會禁用螢幕相容模式(screen compatibility mode),因為支援了 API level 11就暗示了支援大螢幕。
Android 高版本API方法在低版本系統上的相容性處理
1.用@TargeApi($API_LEVEL) 使可以編譯通過, 不建議使用@SuppressLint("NewApi");
區別:
@SuppressLint("NewApi")遮蔽一切新api中才能使用的方法報的android lint錯誤
@TargetApi() 只遮蔽某一新api中才能使用的方法報的android lint錯誤
舉個例子,某個方法中使用了api9新加入的方法,而專案設定的android:minSdkVersion=8,此時在方法上加@SuppressLint("NewApi")
和@TargetApi(Build.VERSION_CODES.GINGERBREAD)都可以,以上是通用的情況。
而當你在此方法中又引用了一個api11才加入的方法時,@TargetApi(Build.VERSION_CODES.GINGERBREAD)註解的方法又報錯了,而
@SuppressLint("NewApi")不會報錯,這就是區別。
2.判斷執行時版本,在低版本系統不呼叫此方法,同時為了保證功能的完整性,需要提供低版本功能實現
例如:
public class MainActivity extends AppCompatActivity {
private AlertDialog.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//如果API level大於11 大於11的時候能夠指定主體
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
builder = new AlertDialog.Builder(this,
AlertDialog.THEME_HOLO_LIGHT);
}else {
builder = new AlertDialog.Builder(this);
}
builder.setItems(new String[] { "拍照","選擇" },
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.setTitle("選擇照片");
builder.create().show();
}
}