Gradle配置那些事

Eclipse轉Android studio最大的變化就是多了gradle的配置,那麼gradle是什麼?gradle有哪些優點呢?gradle又是如何使用的呢?

gradle是什麼?

官方介紹是:Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。當前其支持的語言限於Java、Groovy和Scala,計劃未來將支持更多的語言。

通過我的使用對gradle的概括就是:Gradle是一種構建工具,它可以幫你管理項目中的差異,依賴,編譯,打包,部署......,你可以定義滿足自己需要的構建邏輯,寫入到build.gradle中供日後開發使用.

gradle有哪些優點呢?

gradle的加入使as除了一些優化配置外,還有其他優點,例如分分鐘多渠道上線包;打發布包,給測試人員打測試包,以及分包,對開源庫文件的一鍵引入等。

gradle又是如何使用的呢?

1:默認配置
聲明是要使用服務框架


 apply plugin: 'com.android.application'

依賴的框架,有的jcenter倉庫裏面的,有的可能是maven裏面的。

 dependencies { 
 compile 'com.zzti.fengyongge:imagepicker:1.0'
 compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
 compile 'com.alibaba:fastjson:1.1.52.android'
  }

  repositories {    
      maven {        
       url "https://jitpack.io"   
  }}

解決方法數超過65k

multiDexEnabled true

MultiDex的一些相關配置,這樣配置可以讓你的編譯速度更快

dexOptions {
    preDexLibraries = false
    incremental true
    //開啓incremental dexing,優化編譯效率,這個功能android studio默認是關閉的。
    javaMaxHeapSize "4g"     //增加java堆內存大小
}

2:buildTypes就是發佈類型,可以定義不同的發佈類型,例如正式,內側,公測,開發版本等,而且可以在內部定義不同版本的名稱、包名、甚至icon,其中發佈不同版本的簽名所需的別名、別名密碼、簽名文件地址和簽名密碼通過signingConfigs去配置,當然如果你感覺這樣不安全,可以將signingConfigs 常量放gradle.properties裏面,不提交到後臺。


 signingConfigs {
    release {
        keyAlias 'gradle'
        keyPassword '123456'
        storeFile file('demo.debug.jks')
        storePassword '123456'
    }

    debug {
        keyAlias 'gradle'
        keyPassword '123456'
        storeFile file('demo.release.jks')
        storePassword '123456'
    }
}

buildTypes {
    release {
        manifestPlaceholders += [APP_NAME: 'release版']
        manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo']
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }

    debug {
        manifestPlaceholders += [APP_NAME: 'Bate版']
        manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo.test']
        applicationIdSuffix '.test'
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.debug
    }
}

3:compileOptions對java版本的配置,以便使用java的新特性

 compileOptions {

   }

4:指定資源目錄,對資源文件可以進行分包處理

sourceSets {
     main {  
        assets.srcDirs = ['assets']    //資源文件  
        jni.srcDirs 'src/main/jni'     //jni文件  
        jniLibs.srcDir 'src/main/jniLibs' //jni庫  
       }  
    }

5:程序在buid的時候,會執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,我們可以將其關掉。

lintOptions {
    abortOnError false    
    //即使報錯也不會停止打包  
    checkReleaseBuilds false    
    //打包release版本的時候進行檢測  
    }

6:多渠道打包,有時需要數據統計各平臺的使用情況,例如友盟統計,需要不同渠道的安裝包。

  productFlavors {
    yingyongbao{}
    baidu {}
    google {}
    wandoujia {}
    xiaomi {}
}

productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [UMENG_CHANNEL_ID: flavor.name]
}

而且你可以設置多渠道包的名字,一般是版本名稱+版本號+日期+渠道名稱

 applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // 重命名產出的apk文件
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            File outputDirectory = new File(outputFile.parent);
            def fileName
            if (variant.buildType.name == "release") {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
            } else {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
            }
            output.outputFile = new File(outputDirectory, fileName)
        }
    }
}

最後上一個完整的 build. gradle 配置

apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"

defaultConfig {
    applicationId "com.zzti.fengyongge.gradledemo"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true  
}

compileOptions {

   }

sourceSets {
       main {  
        assets.srcDirs = ['assets']    //資源文件  
        jni.srcDirs 'src/main/jni'     //jni文件  
        jniLibs.srcDir 'src/main/jniLibs' //jni庫  
       }  
    }

lintOptions {
    abortOnError false    
    //即使報錯也不會停止打包  
    checkReleaseBuilds false    
    //打包release版本的時候進行檢測
    }

signingConfigs {
    release {
        keyAlias 'gradle'
        keyPassword '123456'
        storeFile file('demo.debug.jks')
        storePassword '123456'
    }

    debug {
        keyAlias 'gradle'
        keyPassword '123456'
        storeFile file('demo.release.jks')
        storePassword '123456'
    }
}

buildTypes {
    release {
        manifestPlaceholders += [APP_NAME: 'release版']
        manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo']
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }

    debug {
        manifestPlaceholders += [APP_NAME: 'Bate版']
        manifestPlaceholders += [CURRENT_PKG: 'com.zzti.fengyongge.gradledemo.test']
        applicationIdSuffix '.test'
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.debug
    }
}

productFlavors {
    yingyongbao{}
    baidu {}
    google {}
    wandoujia {}
    xiaomi {}
}

productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [UMENG_CHANNEL_ID: flavor.name]
}

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // 重命名產出的apk文件
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            File outputDirectory = new File(outputFile.parent);
            def fileName
            if (variant.buildType.name == "release") {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
            } else {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
            }
            output.outputFile = new File(outputDirectory, fileName)
        }
    }
}

repositories {
    maven {
        url "https://jitpack.io"
    }
}

 dexOptions {    
  preDexLibraries = false    //讓它不要對Lib做preDexing    
  incremental true    //開啓incremental dexing,優化編譯效率,這個功能android studio默認是關閉的。  
  javaMaxHeapSize "4g"     //增加java堆內存大小
  }

}

def packageTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.alibaba:fastjson:1.1.52.android'
compile 'com.zzti.fengyongge:imagepicker:1.0'

testCompile 'junit:junit:4.12'
}

多渠道批量生成apk文件如圖所示:

多渠道打包截圖


github地址:https://github.com/fengyongge/gradledemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章