1. 程式人生 > >Android Studio compileSdkVersion minSdkVersion targetSdkVersion的區別

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:[email protected]   10:16:17
09-01 10:16:20.592 17365-17365/pers.jibai.dailytext E/My: onPostExecute:[email protected]   10:16:20
09-01 10:16:23.595 17365-17365/pers.jibai.dailytext E/My: onPostExecute:[email protected]   10:16:23
09-01 10:16:26.598 17365-17365/pers.jibai.dailytext E/My: onPostExecute:[email protected]   10:16:26
09-01 10:16:29.601 17365-17365/pers.jibai.dailytext E/My: onPostExecute:pe[email protected]   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:[email protected]    10:11:59
09-01 10:11:59.678 17148-17148/? E/My: onPostExecute:[email protected]    10:11:59
09-01 10:12:02.667 17148-17148/? E/My: onPostExecute:[email protected]    10:12:02
09-01 10:12:02.669 17148-17148/? E/My: onPostExecute:[email protected]    10:12:02
09-01 10:12:05.669 17148-17148/? E/My: onPostExecute:[email protected]    10:12:05

與上面的執行邏輯相比完全不同,是兩個兩個執行緒池併發執行的。

一點小建議:

  • 在一般情況,我們最好吧compileSdkVersion設定為當前最高的,因為這樣我們可以通過AS的預編譯功能,瞭解到經常用到的哪些程式碼已經被棄用,哪些有些的用途。

  • targetSdkVersion和compileSdkVersion最好相同。道理同上。

  • targetSdkVersion如果進行變換了之後,最好對整個專案進行重新測試。上面的AsyncTask就是很好的例子,在不同targetSdkVersion下執行邏輯不同,因此現在的targetSdkVersion改變所帶來的邏輯改變,可能會導致bug出現

最後給大家帶來一張是那種SdkVersion的關係吧:

相關推薦

Android Studio compileSdkVersion minSdkVersion targetSdkVersion區別

今天給大家帶來一片簡短的文章。雖然不是什麼非常重要的知識點,但是我們天天都在接觸的一個東西。 android { compileSdkVersion 27 defaultConfig { applicationId "pers.jiba

android studio compile api implementation 區別

compile與api 二者等同,無區別 implementation與compile或implementation與api implementation編譯的依賴只作用於當前的module。即APP module依賴了core module,core module中使用implementation編譯

Android 中compiledSDKVersion,minSdkVersion,targetSdkVersion的含義

下面這段英文來自於官方文件的如下位置:android-sdk-windows/docs/training/basics/firstapp/creating-project.html app/build.gradle Android Studio uses Gradle t

compileSdkVersion, minSdkVersiontargetSdkVersion,坑爹的Android studio

compileSdkVersion//SDK編譯版本 compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應用。使用任何新新增的 API 就需要使用對應 Level 的 Android SDK。 需要強調的是修改 com

Android Studio 版本間區別

android m 配置 ati 命令 你會 pro 通過 徹底刪除 pre    2.3.2 -》3.0.1 Gradle版本為4.1 com.android.tools.build:gradle:3.0.x Android Monitor 被換成了 And

Android Studio 3.1.1新版本 修改 compileSdkVersion sdk版本的各種錯誤

在新版本3.0以上的Android Studio裡面,有了很多的改動,大家都知道新建立一個專案,compileSdkVersion是最新版本的sdk 我的是Android Studio 3.1.1,最新的是complieSdkVesion 27 新建專案app/build.grad

android studio庫引用依賴方式本質區別

前言 implementation,api...,每次寫的時候,都不好記住差別,都要重新查資料,實在麻煩,這也說明android studio有關這塊的命名肯定不當,那麼不容易記。 在此,需要搞清楚google為何這麼搞,其動機是什麼為了解決什麼問題? 背景原因 其實追究其後面原

compileSdkVersion,minSdkVersiontargetSdkVersion

compileSdkVersion(Eclipse中叫做build target) 1.在eclipse中位於專案根目錄中的project.properties檔案中 2.在studio中位於專案中的build.gradle中 作用:用哪個 Android SDK 版本編譯你的應用 強烈推薦總是使用最新的

如何選擇 compileSdkVersion, minSdkVersiontargetSdkVersion

作者:Ian Lake,Google Android 推廣工程師;翻譯:韓國愷。 當你釋出一個應用之後,(取決於具體的釋出時間)可能沒過幾個月 Android 系統就釋出了一個新版本。這對你的應用意味著什麼,所有東西都不能用了? 別擔心,向前相容是 And

Android Studio專案打包(三)打包說明:release和debug版本的區別、v1和v2的簽名使用等等

android中匯出簽名的,apk的release和debug版本的區別 (1)debug簽名的應用程式不能在Android Market上架銷售,它會強制你使用自己的簽名;Debug模式下簽名用的證書(預設是Eclipse/ADT和Ant編譯)自從它建立之日起,1年後就會失效。 (2)

Android Studio之Gradle和Gradle外掛的區別

什麼是Gradle?什麼是Gradle外掛?Gradle           對應:gradle-wrapper.properties中的distributionUrl=https/://services.gradle.org/distribut

Android Studio中呼叫高於minSdkVersion版本API, 無提示 (Lint問題),開啟api版本檢測

一. 坑: 呼叫高於minSdkVersion版本的API時, AS無提示 ! 最近重構專案時用到了HandlerThread類, 程式碼中呼叫了此類的quitSafely()方法, 結果導致了下面的錯誤:   呼叫高版本api導致的crash.png 經過一番折騰,

安卓開發經驗——Android Studio的project中兩個build.gradle配置的區別

一般建立一個android專案後回出現兩個gradle: build.gradle(Project):用來配置整個工程的 build.gradle(app):一個是用來配置app的 對compile和classpath區別的解釋: I’m g

android studio CMAKE 檔案編譯NDK中配置 選項 include_directories 和target_include_directories的區別

晚上用AS編譯FDK-ACC庫,百度一圈,WINDOW下 AS編譯的配置很少,或者內容很舊,所以直接原始碼拖到AS中通過CMAKE編譯,大體的配置了下結果發現通過這樣配置,會報錯,原始碼中的.h檔案有的找不到,百度 google沒有發現很有用的價值,到GITHUB轉一圈,發現

compileSdkVersion, minSdkVersiontargetSdkVersion詳解

API level API level是一個整數,它指的是我們使用的框架(Framework)的版本,也就是我們使用的sdk中的各個平臺下的android.jar。 但是這個API level又和An

Android Studio project和module的區別

網上搜索得出以下結論: 1.Project相當於eclipse裡面的工作區間,module相當於其project。AS裡面的專案結構也可以像eclipse一樣,一個project新建多個module。剛開始不懂的時候,只知道新建專案,然後學習,看到其他英文一撇而過,能不用就

Android Studio中mipmap目錄和drawable目錄有什麼區別

使用Android Studio開發時發現有2個目錄可以放置圖片: mipmap vs drawable,那麼他們有什麼區別呢?該選擇哪個呢? 這裡網羅各位大神的答案,共同學習: 答案1: 圖片還是放

Android Studio,使用外部模擬器作為生成app調試的模擬器

align display 由於 .com bug android 看到了 user 出現 本文作為一個原理探究的存在。   1、作者觀察發現,逍遙和夜神模擬器自身,都是有一個adb.exe和nox_adb.exe存在的,這個東西是幹嘛用的呢。 應該是和本身模擬器進行通信的

兔子--改動Android Studio的快捷鍵,改動成eclipse的快捷鍵

pan mark 快捷 div ext blog iss gravity cli 僅僅須要2步 2 兔子--改動Android Studio的快捷鍵,改動成eclipse的快捷鍵

Android Studio debug調試教程

png undle out i++ ted cti oncreate protect edi 昨天公司領導批評我不會在Android studio上debug 所以 今天利用休息的時間研究了一下 再此寫一篇實用的文章希望大家喜歡 一、自己寫的代碼例子 prote