minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

        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博客

向原创致敬🫡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值