Android Studio compileSdkVersion minSdkVersion targetSdkVersion的区别
今天给大家带来一片简短的文章。虽然不是什么非常重要的知识点,但是我们天天都在接触的一个东西。
android {
compileSdkVersion 27
defaultConfig {
applicationId "pers.jibai.dailytext"
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
相信这段代码大家都不会陌生,在我们每个项目的Module中都会有一个对应的build.gradle文件,里面就有这样一段代码。但是刚开始看感觉完全看不懂呀有木有!其实学了Android这么长时间了,我一直也没管这块的东西,现在也是在项目依赖的时候出了问题才发现这块知识也是必不可少的。
要说SdkVersion大家都知道是SDK的版本,但是一开始接触会发现build.gradle中有三个SdkVersion,分别是compileSdkVersion、targetSdkVersion、minSdkVersion。
目录
compileSdkVersion
compileSdkVersion是指编译时的sdk版本,就是点击这个绿色三角的时候,编译的过程中会以该版本的sdk进行编译。如果发现不符合的会报错。
而且我们都知道Android Studio有预编译的功能。当我们在代码中写了一段代码时,这时候预编译的效果就出现了:如果这段代码在Android 5.0之后被弃用的,而compileSdkVersion是24(7.0),那么这时候会发现你的代码会出现删除线。
举个栗子:
在Android5.0之前getResource().getColor()方法可以使用,但是在之后该方法被打上删除线,已经被弃用。当compileSdkVersion设置为21,你就会发现这个删除线出现了,也有没有出现的情况,只能说Android Studio预编译的功能可能出了点bug。
minSdkVersion
minSdkVersion是指安装Apk的最低版本号,手机系统低于这个版本号的是无法安装Apk的。这个不用多说什么了吧。
targetSdkVersion
AsyncTask线程池在API10版本之前和之后使用情况有所不同:在API10(Android2.3.3)之前,AsyncTask线程池是可以并行执行的,而现在的AsyncTask是串行执行。
defaultConfig {
applicationId "pers.jibai.dailytext"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
现在targetSdkVersion是27,和compileSdkVersion一样。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate: ");
for (int i = 0; i < 5; i++)
new MyAsyncText().execute();
}
class MyAsyncText extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.e(TAG, "onPostExecute:" + this + new SimpleDateFormat("hh:mm:ss").format(new Date()));
}
}
在onCreate方法创建5个线程池同时启动,每个AsyncTask线程睡眠3秒后回调到主线程打印Log。结果如下:
09-01 10:16:14.580 17365-17365/pers.jibai.dailytext E/My: onCreate:
09-01 10:16:17.601 17365-17365/pers.jibai.dailytext E/My: onPostExecute:aaa@qq.com 10:16:17
09-01 10:16:20.592 17365-17365/pers.jibai.dailytext E/My: onPostExecute:aaa@qq.com 10:16:20
09-01 10:16:23.595 17365-17365/pers.jibai.dailytext E/My: onPostExecute:aaa@qq.com 10:16:23
09-01 10:16:26.598 17365-17365/pers.jibai.dailytext E/My: onPostExecute:aaa@qq.com 10:16:26
09-01 10:16:29.601 17365-17365/pers.jibai.dailytext E/My: onPostExecute:aaa@qq.com 10:16:29
很明显是在上一AsyncTask执行完毕之后才会从队列中获取下一个执行。现在把targetSdkVersion调到10。结果如下:
09-01 10:11:56.658 17148-17148/? E/My: onCreate:
09-01 10:11:59.677 17148-17148/? E/My: onPostExecute:aaa@qq.com 10:11:59
09-01 10:11:59.678 17148-17148/? E/My: onPostExecute:aaa@qq.com 10:11:59
09-01 10:12:02.667 17148-17148/? E/My: onPostExecute:aaa@qq.com 10:12:02
09-01 10:12:02.669 17148-17148/? E/My: onPostExecute:aaa@qq.com 10:12:02
09-01 10:12:05.669 17148-17148/? E/My: onPostExecute:aaa@qq.com 10:12:05
与上面的执行逻辑相比完全不同,是两个两个线程池并发执行的。
一点小建议:
-
在一般情况,我们最好吧compileSdkVersion设置为当前最高的,因为这样我们可以通过AS的预编译功能,了解到经常用到的哪些代码已经被弃用,哪些有些的用途。
-
targetSdkVersion和compileSdkVersion最好相同。道理同上。
-
targetSdkVersion如果进行变换了之后,最好对整个项目进行重新测试。上面的AsyncTask就是很好的例子,在不同targetSdkVersion下执行逻辑不同,因此现在的targetSdkVersion改变所带来的逻辑改变,可能会导致bug出现
最后给大家带来一张是那种SdkVersion的关系吧:
推荐阅读
-
Android Studio compileSdkVersion minSdkVersion targetSdkVersion的区别
-
Android Studio3.0中dependencies依赖由compile变为implementation的区别
-
如何修改Android Studio创建module时默认的compileSdkVersion
-
如何修改Android Studio创建module时默认的compileSdkVersion
-
Android中buildToolVersion与CompileSdkVersion的区别
-
Android studio的minSdkVersion及targetSdkVersion
-
Android Studio3.0中dependencies依赖由compile变为implementation的区别
-
Android中buildToolVersion与CompileSdkVersion的区别
-
Android studio的minSdkVersion及targetSdkVersion