1. 程式人生 > >compileSdkVersion,minSdkVersion 和 targetSdkVersion

compileSdkVersion,minSdkVersion 和 targetSdkVersion

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();
    }
}