Android Studio Gradle 常用配置詳解

Jacksonl發表於2019-10-07

什麼是Gradle

Gradle 是一個構建工具,他可以幫我們編譯 構建 打包專案 可以配置自己的task任務,可以很方便的去引用第三方的類庫

根專案的gradle 整個專案的gradle配置檔案


apply from: "config.gradle"  //這裡可以引用自己定義的字尾為.gradle的檔案  ,可以將所有的配置資訊提取到自定義gradle

buildscript {
    //遠端maven Google   jcenter jitpack   連線所需引用的伺服器
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        //gradle 外掛引用  內有關於專案編譯構建....的任務
        classpath 'com.android.tools.build:gradle:3.4.1'
    }
}

//配置所有modle的引用伺服器
allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }

}

//清除任務  
task clean(type: Delete) {
    delete rootProject.buildDir
}
複製程式碼

app module的配置

//標明此module可執行,,其他會有libary....
apply plugin: 'com.android.application'


android {

    compileSdkVersion rootProject.ext.android.compileSdkVersion//編譯版本
    buildToolsVersion rootProject.ext.android.buildToolsVersion //編譯時使用的構建工具的版本


    defaultConfig {
        //專案包名
        applicationId rootProject.ext.android.applicationId
        //最小可執行的sdk B版本
        minSdkVersion rootProject.ext.android.minSdkVersion
        //目標版本
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        //版本號
        versionCode rootProject.ext.android.versionCode
        //版本名
        versionName rootProject.ext.android.versionName
        //開啟分包
        multiDexEnabled true
        //junit單元測試
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //中文資源
        resConfigs 'en'
        //ndk 配置
        ndk {
            // 設定支援的SO庫架構
            abiFilters 'armeabi', 'x86', 'armeabi-v7a'//,'x86_64', 'arm64-v8a'
         }
       //只使用xhdpi 下的資原始檔
        resConfigs "xhdpi"
        //分包,指定某個類在main dex
        multiDexEnabled true
        multiDexKeepProguard file('multiDexKeep.pro') // 打包到main dex的這些類的混淆規制,沒特殊需求就給個空檔案
        multiDexKeepFile file('maindexlist.txt') // 指定哪些類要放到main dex
    }
    //開啟databind支援
    dataBinding {
        enabled = true
     }
    //簽名資訊
    signingConfigs {

        production {
            //簽名檔案路徑
            storeFile rootProject.ext.signing.storeFile
            //密碼
            storePassword rootProject.ext.signing.storePassword
            //別名
            keyAlias rootProject.ext.signing.keyAlias
            //別名密碼
            keyPassword rootProject.ext.signing.keyPassword
        }
    }
    
    //構建型別
    buildTypes {
    //debug模式
        debug {
            //可以版本名稱後面追加相關資訊
            versionNameSuffix "-debug"
            //包名新增字尾 可以控制不同構建型別不同的包名
            applicationIdSuffix ".debug"
            //自定義資源資訊相當於value 下的String.xml裡的內容   debug環境下 定義響應的專案名稱
            resValue "string", "app_name", rootProject.ext.android.debugAppName
            //manifest 引數配置專案圖示  debug環境下的桌面圖示顯示 在 manifest 清單檔案中引用
            manifestPlaceholders = [app_icon: rootProject.ext.android.debugAppIcon]
            //配置簽名資訊
            signingConfig signingConfigs.production
            //是否開啟混淆
            minifyEnabled false
            //對齊優打包的apk
            zipAlignEnabled false
            //去除無用資源
            shrinkResources false
            //混淆檔案路徑
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            //開啟這個可以debug除錯
            debuggable true
            //自定義引數 在 Buildconfig使用   這裡不同的環境定義不同的url
            buildConfigField("String", "API_URL", rootProject.ext.apiUrl.debugUrl)



        }
        //預上線
        preRelease {
            resValue "string", "app_name", rootProject.ext.android.preReleaseAppName
            manifestPlaceholders = [app_icon: rootProject.ext.android.preReleaseAppIcon]
            zipAlignEnabled true
            shrinkResources true
            versionNameSuffix "-preRelease"
            applicationIdSuffix ".preRelease"
            signingConfig signingConfigs.production
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            buildConfigField("String", "API_URL", rootProject.ext.apiUrl.preRelease)

        }
        //線上正式
        release {
            resValue "string", "app_name", rootProject.ext.android.releaseAppName
            manifestPlaceholders = [app_icon: rootProject.ext.android.releaseAppIcon]
            zipAlignEnabled true
            shrinkResources true

            signingConfig signingConfigs.production
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            buildConfigField("String", "API_URL", rootProject.ext.apiUrl.release)

        }

        //修改apk包名
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                outputFileName = "app-${variant.name}-${defaultConfig.versionName}-${defaultConfig.versionCode}.apk"
            }
        }
    }
    
    //jdk 配置
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

//lib包配置
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    
     // 多渠道/多環境 的不同配置
    flavorDimensions("default")
    productFlavors {
        qudao1 {
            dimension "default"
            //自定義專案名稱
            resValue "string", "app_name", "渠道1"
            //自定義引數  在BUildConfig 裡呼叫
            buildConfigField("String", "orgId", '""')
        }
        qudao2 {
            dimension "default"
            resValue "string", "app_name", "渠道2"
            buildConfigField("String", "orgId", rootProject.ext.channel.csOrgId)
        }

    }
     //執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,我們可以將其關掉。
    lintOptions {
        abortOnError false
        checkReleaseBuilds false
    }
    
    //檔案重複
      packagingOptions {
            exclude 'lib/arm64-v8a/ffmpeg.so'
        }
        
    //混淆對應檔案輸出
     applicationVariants.all { variant ->
        variant.outputs.each { output ->
            if (variant.getBuildType().isMinifyEnabled()) {
                variant.assemble.doLast{
                        copy {
                            from variant.mappingFile
                            into "${projectDir}/mappings"
                            rename { String fileName ->
                                "mapping-${variant.name}.txt"
                            }
                        }
                }
            }
        }
    }
}
configurations {
    //編譯期排除commons模組
    compile.exclude module: 'commons'
    //在整個構建過程中排除com.squareup.retrofit2:adapter-rxjava
    all*.exclude group: 'com.squareup.retrofit2', module: 'adapter-rxjava'
}
//全域性強制使用
configurations.all {
   resolutionStrategy {
       force 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
   }
}
dependencies {
//lib jar 引用
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //動態版本號
    implementation 'com.android.support.constraint:constraint-layout:+'
    implementation project(path: ':utilslib')

    //重複引用問題
    compile (‘com.squareup.retrofit2:adapter-rxjava:2.1.0’){ 
      // 衝突時優先使用該版本
         force = true
 
     // 依據構建名稱排除
         exclude module: 'rxjava'
     // 依據組織名稱排除
         exclude group: 'com.squareup.retrofit'
     // 依據組織名稱+構件名稱排除
        exclude group: 'com.squareup.retrofit', module: 'rxjava'
 
    // 為本依賴關閉依賴傳遞特性
         transitive = false
    }

}


複製程式碼

自定義gradle

需要在根專案引用 apply from: "config.gradle"

ext {

    apiUrl = [

            releaseUrl   : '"http://www.baidu.com/"',
            preReleaseUrl: '"http://www.baidu.com/"',
            debugUrl     : '"http://www.baidu.com/"',
    ]
    appKey = [
            buglyAppId: '"4a8eea659f"'
    ]
    signing = [
            storeFile    : file("./app/jks/key.jks"),
            storePassword: "123456",
            keyAlias     : "news",
            keyPassword  : "123456"
    ]
    android = [
            applicationId    : "com.ll.ll",
            compileSdkVersion: 28,
            minSdkVersion    : 19,
            targetSdkVersion : 28,

            debugAppName     : "應用預覽版",
            releaseAppName   : "應用正式版",
            preReleaseAppName: "預上線版本",
            debugAppIcon     : "@mipmap/ic_launcher_round",
            releaseAppIcon   : "@mipmap/ic_launcher",
            preReleaseAppIcon: "@mipmap/ic_launcher",

            versionCode      : 1,
            versionName      : "1.0.0"
    ]


    libsVersion = [
            supportLibraryVersion = "28.0.0",
    ]


    dependencies = [
            //support
            appcompat_v7: "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion",
            design      : "com.android.support:design:$rootProject.supportLibraryVersion",
//            recyclerview_v7: "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion",
//            cardview_v7    : "com.android.support:cardview-v7:$rootProject.supportLibraryVersion",


    ]


}

複製程式碼

相關文章