minSDK和targetSDK,这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能,但又需要向后(向下)兼容到minSDK,保证这个区间内的设备都能够正常的执行你的APP。换句话说,想使用Android刚刚推出的新特性,但这对于你的APP又不是必须的。此时就能够做如下处理:
- targetSDK设置为想使用新特性的SDK版本号;
- minSDK设置成低版本号保证全部人都能够使用此APP。
eg:假如你想给你的app增加大量的手势操作(sdk 7才引入的),然而这些手势操作能够被Button啊或menu等取代,在这样的情况下,手势操作就是一个额外的加分功能,而不是一个必须的功能,因此你就须要把targetSDK设置为7,把minSDK设置为3(这是举个样例,如今没人还在用这么老的设备了)这样即使是使用老设备的用户也能够用你的app了。
然后你所要做的就是要在代码里推断版本号,假设是大于等于7的版本号中就使用手势操作,小于7的版本号中就使用button等取代,这样使用了新手机的用户就能够体验到你app中酷炫的新功能了。
eg:假设你想给你的项目增加Android 5.0的Material Design,有一些用户可能会升级到5.0而使用到你的新特性,而有一部分用户的手机硬件太老,不支持升级到5.0。那么你就要为他们进行向后(向下)兼容,不至于损失这部分用户,至此APP的targetSDK设置为21。minSDK能够设置为8(不是固定非要这个值)
minSDKVersion
minSdkVersion限制安装application所需要的系统最低版本,低于该版本的系统都不可以安装该application。
同时不能使用该level版本SDK所不具备的API,
例如在minSdkVersion为8的application中调用【this.getActionBar()】
就会出现Call requires API level 11 (current min is 8): android.app.Activity#getActionBar的错误。
这是因为ActionBar是在Android 11才出现的新功能(new API)。
targetSDKVersion
targetSdkVersion是Android提供向前兼容的主要依据,
表明该application已经兼容从minSdkVersion至tartgetSdkVersion之间所有api的变化。
在targetSdkVersion更新之前系统不会应用最新的行为变化。
compileSDKVersion
targetSdkVersion是Android提供向前兼容的主要依据,
表明该application已经兼容从minSdkVersion至tartgetSdkVersion之间所有api的变化。
在targetSdkVersion更新之前系统不会应用最新的行为变化。
三者关系
minSdkVersion <= targetSdkVersion <= compileSdkVersion
理想情况
minSdkVersion (lowest possible) <=targetSdkVersion == compileSdkVersion (latest SDK)
理想情况下:用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为。
Android主Module与依赖Module之间targetSDKVerion关系
Android项目以主Module的targetSDKVersion为准。也即是说,依赖Module targetSDKVersion的设置是无效的。
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();
}
}
参考文献:
compileSdkVersion, minSdkVersion 和 targetSdkVersion详解
彻底明确怎样设置minSdkVersion和targetSdkVersion-CSDN博客
minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析_android module targetsdkversion-CSDN博客
向原创致敬🫡