compileSdkVersion,minSdkVersion,targetSdkVersion 作用和区别

qyf404 7年前
   <p>Android大家都知道的,版本碎片化比较严重,做版本的适配是必须,从而有了下面的这些知识点。</p>    <p>1.compileSdkVersion,minSdkVersion,targetSdkVersion作用和如何选择关系.</p>    <p>2.Support Library 包的选择,v4,v7等包到底是干啥的。</p>    <p>3.我们到底该如何选择这些东西运行项目的时候才能正确运行。</p>    <p>下面我将围绕这些问题和疑问来给大家一步步讲解他们的关系。</p>    <h3>一丶compileSdkVersion,miniSdkVersion,targetSdkVersion的作用 :</h3>    <p>1.compileSdkVersion:这个主要是我们编译app时候用的sdk版本,就我们在AndroidStudio上面点击运行时候的编译时候的环境。记住这个只是在编译时候选择的版本,不涉及到运行时候的行为。由于androidStudio有预编译的功能所以会提示一些警告,提前了解新的sdk</p>    <p>api。修改compileSdkVersion并不会影响我们的我们生成的app在手机先的行为。例如在android6.0之前的系统是不需要动态申请权限的,在6.0之后的系统需要动态申请权限。这个和你的compileSdkVersion的版本选择是完全没有任何关系的。也就是说你app运行时需不需要动态申请权限和你complieSdk是否设置的6.0,没有半毛钱关系,记住compileSDK只是关系到你编译出来的包。不是运行的表现行为。所以修改compileSdkVersion是不会改变你app在手机上运行的表现行为的。但是我们一般情况,也是最理想的情况就是把compileSdkVersion设置到最高,因为使用新的编译检查可以获得很多好处,可以避免弃用的API,并且为使用新的API做好准备。</p>    <p>2.minSdkVersion:这个就是程序运行的最低的要求的Sdk,就是给说如果我设置的minSdkVersion是15的话那么如果你系统低于这个SdkVersion是安装不上的。还有一个好处就是。例如你设置miniSdk是3.0的话,你写的方法只有在4.0后才有的方法,这个时候就会提示你在3.0的时候是没有这个方法的。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/301cb587e77730d672e6349600e00647.png"></p>    <p>Studio会给你这样的提示。说但前的最低版本level是15这个方法是在23上才有的。</p>    <p>我们得这样做:</p>    <p>if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {</p>    <p>requestPermissions(newString[]{""},REQUEST_CODE_ASK_CALL_PHONE);</p>    <p>}else{</p>    <p>//不需要申请权限直接调用我们需要处理的方法。</p>    <p>}</p>    <p>添加一张图片缓解视觉疲劳。显得排版好看。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c799420d0450c00626a0da4c8551d384.jpg"></p>    <p>3.targetSdkVersion:targetSdk主要是提供向前兼容的作用,什么意思呢?手机系统4.0的,或者</p>    <p>5.0或者更高,但是编译包的时候用的compileSdk是6.0,但是表现形式得按照targetSdk。1.提供向下兼容。2.确定app的表现行为。3.这允许你在适应新的行为变化之前就可以使用新的</p>    <p>API (因为你已经更新了 compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的)。</p>    <p>A.当系统版本高于targetSdkVersion时候:</p>    <p>假设我们的targetSdkVersion是22(就是5.0)不需要动态申请权限,但是我们的系统是6.0的。现在程序运行到了需要某个需要权限的地方了。此时想想我们的手机该怎么办。</p>    <p>系统逻辑是这样的。这不代码系统源码,只是说处理逻辑。</p>    <p>finalint sdkVersion = ctx.getApplicationInfo().targetSdkVersion;</p>    <p>if(sdkVersion</p>    <p>//这里的M就是level 23也就是6.0的系统</p>    <p>//这里的判断是如果当前的打包的targetSdkVersion小于23</p>    <p>那么这里就不需要动态申请权限直接可以调取开放的权限</p>    <p>}else{</p>    <p>//否则系统认为你需要动态申请权限</p>    <p>}</p>    <p>注意这里是系统处理。不需要你显式的写这些代码。是系统内部的代码和自动处理。所以targetSdkVersion是确定表现形式的。并且也做到了向下兼容。</p>    <p>B.当系统版本等于targetSdkVersion时候</p>    <p>当安装app的时候targetSdkVersion刚好等需系统的level,这个时候Andorid平台会认为这个程序在此版本上已经经过了充分的测试。不必为此程序开启兼容性检查判断的工作了。也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。</p>    <p>C.当系统版本小于targetSdkVersion的时候</p>    <p>还是举栗子把:targetSdkVersion=23的时候,但是系统版本是22很明显你代码里面做了动态权限分配。但是系统版本不支持。怎么办呢?我们ninSdk不就是处理这个情况的吗?</p>    <p>从这里看出targetSdkVersion的设置主要是当系统版本高于设置的target的时候。</p>    <p>http://www.race604.com/android-targetsdkversion/讲targetSdkVersion作用的。</p>    <p>总的来说你的app的表现行为和你是否修改过targetSdkVersion是有关系的。当我们修改他的时候要做足够的测试。</p>    <p>minSdkVersion<=targetSdkVersion<=compileSdkVersion</p>    <p>minSDKVersion查看创建项目的时候的版本分部图表确定,然后targetSdkVersion最好和compileSdkVersion一样。CompileSdk选最新的,因为你更新了</p>    <p>compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的。可以使用最新的api</p>    <p>上面就是讲的这个3个sdkVerison的作用了。要是还有不明白的可以留言,我将会尽我所能为大家解答。</p>    <h3>二丶buildToolsVersion和这些配置的sdkVesion有什么关系呢。</h3>    <p>buildToolsVersion是讲的你构建工具的版本号是多少,规则是可以用高的构建工具来构建低版本Sdk的工程。</p>    <h3>三丶接下来讲讲v4,v7,v13的</h3>    <p>总体来说这个就是一个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包主要是在平板上使用,一般在手机端不会用。</p>    <p>再通过这里我们就会发现一个事情了,我们想要使用v7包我们project,对nimSdk是有要求的我们的minSdk不能比support包的还低吧。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/32aa965422079a764d378d46dae944b8.jpg"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f79bad8a975615a21fe296084385877b.png"></p>    <p>看到了吧。提示我们要使用v7包必须要minSdk在9或以上</p>    <p>这里注意了,就是我们在使用surpport包的时候或者lbs的时候我们的minSdk不能比他的还低。</p>    <p>大家有什么疑问可以关注我公众号在上面提问,每周都会给大家提供纯手打干货。谢谢大家了。</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/72d311d72fcb</p>    <p> </p>