android gradle常用配置總結

本文是針對android開發中的 build.gradle 文件中的常用配置總結,一些配置是在特定的場景下才使用,一些是為了解決一些問題才加上。所以默認還是使用在Android Studio工具中新建項目時生成的默認的 build.gradle 文件中的配置,等遇到了問題,再來加一些配置。

// apply plugin: 'com.android.library' // 庫配置
apply plugin: 'com.android.application' // 應用程序配置

repositories { // 引入AAR文件時,需要配置這個,AAR文件放在libs目錄中
    flatDir {
        dirs 'libs'
    }
}

android {
    compileSdkVersion 25 // android編譯SDK的版本,即4.0SDK、5.0SDK等的android.jar文件
    buildToolsVersion "25.0.2" // 使用SDK中編譯工具的版本
    useLibrary "org.apache.http.legacy" // 在6.0上使用apache的httpClient包,原因是google在6.0上去掉了這個http請求庫

    defaultConfig {
        applicationId "com.xxx" // 應用的包名可以在AndroidMainfest.xml中使用${applicationId}的方式引用這個包名
        minSdkVersion 15 // 最小兼容版本
        targetSdkVersion 25 // 目標版本
        versionCode 1 // 應用的版本號
        versionName SDK_VERSION // 應用的版本名稱
        multiDexEnabled true // 啟用多dex,如果app中的代碼方法數超過65535

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // android單元測試配置

    }

   sourceSets { // 指定代碼及資源的路徑,具體可以參考這里http://google.github.io/android-gradle-dsl/2.3/com.android.build.gradle.api.AndroidSourceSet.html
        main {
            manifest.srcFile 'AndroidManifest.xml' // 指定manifest.xml路徑
            java.srcDirs = ['src'] // java文件的路徑,包名的上一層,多個目錄使用逗號分隔,如['src', 'core']
            resources.srcDirs = ['src'] // resource資源所有的目錄,注意這里是指jar文件中包含的一些資源,如properties文件,而不是APK中的res資源
            aidl.srcDirs = ['src'] // aidl文件的目錄
            renderscript.srcDirs = ['src'] // renderscript文件的路徑
            res.srcDirs = ['res'] // android APK中的資源路徑
            assets.srcDirs = ['assets'] // android app中的asset目錄
            jniLibs.srcDirs = ['libs'] // SO庫的路徑
        }
    }

    lintOptions {
        checkReleaseBuilds false // release編譯時禁用lint檢查
        abortOnError false // 報錯不會停止打包,除非很嚴重的很影響
        disable 'MissingTranslation', 'ExtraTranslation' // 禁用lint檢查中的一些選項
    }

    dexOptions {
        javaMaxHeapSize "4g" // 設置編譯項目代碼時最在的堆內存大小,否則項目過大時,編譯內存溢出
    }

    compileOptions { // 具體參考這里http://google.github.io/android-gradle-dsl/2.3/com.android.build.gradle.internal.CompileOptions.html
        sourceCompatibility JavaVersion.VERSION_1_7 // 設置代碼編譯的版本,一般是在使用JDK1.8時,配置這個,使編譯出來的jar包讓別人使用時更通用
        targetCompatibility JavaVersion.VERSION_1_7
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt' // 排除這些第三方jar中的聲明文件,否則編譯時容易導致報錯
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

    buildTypes {
         debug {
             storeFile file("debug.keystore") // 簽名文件相對路徑
           storePassword "android" // 簽名的密碼
           keyAlias "androiddebugkey" // 別名
           keyPassword "android" // 別名密碼

           buildConfigField "boolean", "FLAG_DEBUG", "true" // 在BuildConfig.的類中自動生成public static final boolean FLAG_DEBUG = true;代碼
           buildConfigField "String", "API_VERSION", "\"1\""

           ndk {
            abiFilters "armeabi", "armeabi-v7a" // 只保留這幾種CPU架構的SO庫,需要高版本的gradle才支持
           }

           // jniDebuggable true // 啟用JNI debug,一般很少使用,不建議開這個選項,會影響java代碼的debug速度
        }

        release {
            buildConfigField "boolean", "FLAG_DEBUG", "false"
            buildConfigField "String", "API_VERSION", "\"1\""
            minifyEnabled true // 在混淆時去除代碼中無用的內容
            shrinkResources true // 在混淆時去除無用的資源,針對res/目錄中的內容,不用壓縮圖片的大小
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 配置混淆文件

            ndk {
                abiFilters "armeabi", "armeabi-v7a" // 只保留這幾種CPU架構的SO庫,需要高版本的gradle才支持
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs') // 導入libs目錄中的所有jar包
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { // 排除group中的modle,注意group和module名稱com.android.support:support-annotations
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0' // 使用google的appcompat-v7包
    testCompile 'junit:junit:4.12' // 引入junit單元測試

    compile 'com.android.support:multidex:1.0.0' // 加入加載多dex庫
    compile files('libs/gson.jar') // 引用libs目錄中的gson.jar包
    compile(name: 'HMS-SDK-2.4.0.300', ext: 'aar') // 引入HMS-SDK-2.4.0.300.aar文件,同時還需要參考文件頭部分的配置
    compile('com.非死book.fresco:fresco:1.0.0') { exclude module: 'support-v4' } // 引入fresco庫,但不使用其中引用的support-v4庫,否則導致重復引入,編譯報錯duplicate
    provided fileTree(dir: 'compilelibs', include: ['*.jar']) // 引入compilelibs目錄下面的jar文件參與編譯,但不將這些包的代碼打入APK、jar或AAR中。
}

// 使用jar任務生成jar文件,依賴assembleRelease的task
task buildJar(type: Jar, dependsOn: ['assembleRelease']) {
    destinationDir = file('build/outputs/jar/')
    appendix = ""
    baseName = ""
    version = SDK_VERSION

    // manifest信息
    def map = ['Version': SDK_VERSION,
               'Gradle': project.gradle.gradleVersion,
               'Vendor': 'szcomtop.com',
               'Date': new Date().getDateTimeString()
        ]
    manifest.attributes(map)

// from( 'build/intermediates/classes/release/')
    from(project.zipTree( 'build/intermediates/transforms/proguard/release/jars/3/3/main.jar'))
    exclude('**/BuildConfig.class')
    exclude('**/BuildConfig\$*.class')
    exclude('**/R.class')
    exclude('**/R\$*.class')
    include('**/*.class')
}

// 使用Copy任務復制內容
task copySDK(type: Copy, dependsOn: ['buildJar']) {
    from('build/outputs/jar')
    into('../app/libs/')
    include("*.jar")
}

使用方法

本方會持續更新,隨著android的gradle工具的升級,可能有些配置會發生變化。比如 ndk.abiFilters 需要在高版本的gradle工具中才能使用,如何升級gradle版本,也可能會帶來編譯不通過等問題,需要耗費較長時間去解決,所以請慎重。

關于一些配置的用法,下面舉其中一個例子,其他雷同。

比如怎么知道有這個 compileOptions 配置?這個配置下面的又有哪些可以設置?這些設置怎么去使用?能給哪些值?

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7 // 設置代碼編譯的版本,一般是在使用JDK1.8時,配置這個,使編譯出來的jar包讓別人使用時更通用
    targetCompatibility JavaVersion.VERSION_1_7
}

從官網入手

android官方定義的gradle工具的使用說明文檔點 這里 ,gradle官方的說明文檔點 這里

點開鏈接中有個 DSL ,這個 DSL 是啥? DSL 就是 Gradle Build Language 的縮寫。哈哈,開個玩笑,是 Domain Specific Language 的縮寫, Domain 可以理解為 Project 。

跑題了,繼續。

compileOptions示例

打開android gradle工具的官方說明文檔頁面會看到如下圖所示的版本選擇頁面:

這個版本是與 android studio 項目根目錄下的 build.gradle 文件中的gradle版本是對應起來的。同時發現,這個版本會與 android studio 的版本對應。如下圖所示:

點擊當前的2.2版本的鏈接,進入到如下界面,如下圖所示,在左側找到 compileOptions ,并點擊這個鏈接(熟悉這個官方文檔可以從左側的Home項開始):

再點擊上圖中紅色框框標記的鏈接,就會跳轉到如下圖所示位置的配置說明,這種跳轉的方式有點類似Java的API,只不過這個時候看到的應該是詳細,結果卻沒有:

需要進一步查看詳細,只能是點擊上圖紅色框框標記的鏈接,進去之后就會發現熟悉的內容了,如下圖所示:

有沒有一種久違的感覺,終于快看到真相了吧?還差一步。compileOptions中可用的選項及含義已經在上面寫的很清楚了。再點擊 sourceCompatibility 會跳到如下圖所示內容:

可以從上面看到 sourceCompatibility 可以取哪些值,終于找到結果了。

OK, compileOptions 示例就到這里,其它的配置使用也可以使用相同的方法,gradle官方使用文檔也是類似,剩下的只是熟悉的問題了。

 

來自:http://www.jacpy.com/2017/02/28/android-gradle-config-summary.html

 

 本文由用戶 hejian991 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!