1. 程式人生 > >Gradle學習之Android-DSL AppExtension篇

Gradle學習之Android-DSL AppExtension篇

前言:上一篇文章已經講解了Gradle的語法篇,接下來我們要開始學習android-gradle-dsl了,不過我上一篇漏寫了一節函式,這個我打算接下來補上,俗話說的好墨刀不誤砍柴工,上一篇文章我們的刀已經磨好了,下面我們開始收穫我們的成果了,或者說該應用實戰了。

什麼是AppExtension

其實就是一個隊gradle配置android專案的一個拓展,對於android studio build.gradle 配置如下的屬於AppExtension

apply plugin: 'com.android.application'

其實這裡你可以認為是一個編譯好的jar包,裡面放置了一下方法,屬性之類的東西,那麼問題來了,這個jar報什麼時候引入的呢,這裡我們可以去看專案根目錄的build.gradle 配置檔案,如下

buildscript {

    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
    
}

可能這個比喻不太恰當,但是我們可以先這樣理解

AppExtension包含的常用屬性

1. applicationVariants 這個屬性是一個DomainObjectSet集合

DomainObjectSet<ApplicationVariant> applicationVariants

官方解釋是:Returns a collection of build variants that the app project includes.(返回App構建變種的集合) 大概是這個意思哈,何為變種呢,其實我們可認為是不同版本的集合,比如測試版,uat版本,金絲雀版本,正式版本,可以有不同的logo,不同的app_name,這種就叫做變體或變種。

內部方法較多,這裡就不一一展開了,我們來看下android studio裡面常用的方法吧 如果趕興趣課訪問https://docs.gradle.org/current/javadoc/org/gradle/api/DomainObjectSet.html 檢視更多方法及屬性

android.applicationVariants.all { variant ->
   variant.outputs.all {
            outputFileName = "${project.getName()}_${variant.versionName}_${variant.versionCode}_${variant.name}.apk"
        }
}

這段程式碼是對生成的apk檔案進行重新命名,這樣每次打包出來的人家就不會再是預設的,可以根據檔名來區分版本等資訊。

2. buildToolsVersion 指定構建專案時要使用的SDK構建工具的版本。

String buildToolsVersion

buildToolsVersion 構建工具的版本,這裡指Android SDK構建工具的版本號,是一個String型別,這裡也就解釋了為啥我們建立的buildToolsVersion需要用’'包起來,因為型別是String嘛,下面我們展示一下建立專案預設的配置,值得注意的是下圖的buildToolsVersion並不是一個屬性而是一個方法,類似於我們的get,set方法,用一個方法來設定值這樣也很符合封裝的概念

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.1'
    // buildToolsVersion ('27.0.1')
    defaultConfig {
        applicationId "com.tjtech.flutterapp"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName 'v1.0.0'
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

當然如果你的gradle的外掛版本高於或正好3.0.0,那麼這個屬性不設定也是可以的,gradle預設會給你設定一個與外掛版本相匹配的最低buildToolsVersion版本

3. compileSdkVersion 指定用於編譯專案的SDK code。

String compileSdkVersion

compileSdkVersion 同樣也是一個String型別的資料,在Android studio裡面的配置確實int型別,這樣就讓人很奇怪了,按說如果compileSdkVersion這個屬性是String型別,設定的時候應該也是String才對,然而當寫法如下的時候

android {
    compileSdkVersion '28'
    buildToolsVersion '27.0.1'
    defaultConfig {
        applicationId "com.tjtech.gradle"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

以上程式碼是會報錯的錯誤 Failed to find target with hash string ‘28’ in: /Users/antonio/Library/Android/sdk Install missing platform(s) and sync project 這個錯誤告訴你你沒有安裝對應版本的sdk,但是其實我本地安裝過了28版本的sdk,那問題就來了,這是為什麼呢,答案就在BaseExtension類裡面的兩個方法

    public void compileSdkVersion(String version) {
        this.checkWritability();
        this.target = version;
    }
    
    public void compileSdkVersion(int apiLevel) {
        this.compileSdkVersion("android-" + apiLevel);
    }

看到這裡應該發現了問題,compileSdkVersion是一個方法,並且有過載,分別可以傳int型的和String型的,而String型的應該為 android-版本 這樣的格式才是可以正常接收的,那麼我們下面再來列舉下例子

傳String的正確做法

android {
    compileSdkVersion 'android-28'
    //或compileSdkVersion('android-28')
    buildToolsVersion '27.0.1'
    defaultConfig {
        applicationId "com.tjtech.gradle"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

傳int的正確做法

android {
    compileSdkVersion 28
    //或 compileSdkVersion(28)
    buildToolsVersion '27.0.1'
    defaultConfig {
        applicationId "com.tjtech.gradle"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

想比之下也能解釋為啥預設建立的配置是這樣了。 好了今天的文章就先到這裡了,AppExtension的屬性太多,一篇文章寫完,後期我會繼續講解剩下的一些配置理解。

大家都在讀

本公眾號聚焦於『Android開發前沿、生活感悟、妹子圖』,歡迎大家關注AntonioShare: 公眾號圖片