1. 程式人生 > >Android之gradle。

Android之gradle。

申明此文系掘金小路飛引進,多為雷同處。

從github或者網上搜索到自己需要的案例,下載下來並且快速執行起來是Android開發過程中最基本的生活動作,這牽扯到Android studio中gradle的相關認識了。

AS專案中有兩種gradle檔案:

1.根目錄的 build.gradle 檔案

[建立專案自動生成] [ 主要配置外掛和預設依賴庫的倉庫]

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
// NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }

2.moudle 中根目錄的 build.gradle 檔案

Android Studio這個IDE不同於eclipse,eclipse啟動開啟的是工作空間,一個工作空間下可以包括零個多個工程專案。而Android Studio則是單個工程專案啟動,一個工程專案中包括一個或多個module,其中有一個build.gradle檔案中頭部為apply plugin:'com.android.application'標識的為應用程式module,其餘以apply plugin:'com.android.library'標識為

Android Library。在編譯的時候,所有module的build.gradle依賴的類庫都會合併為一個。

【主程式中的】

apply plugin: 'com.android.application'
android {
    compileSdkVersion 19
buildToolsVersion '23.0.2'
defaultConfig {
        multiDexEnabled true
applicationId "com.sgcc.pda"
minSdkVersion 16
targetSdkVersion 23
versionCode 4
versionName 
"01.00.00.01" } buildTypes { debug{ // buildConfigField "boolean", "UseOkHttp", "true" buildConfigField "boolean", "ISDEBUG", "true" } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // buildConfigField "boolean", "UseOkHttp", "false" buildConfigField "boolean", "ISDEBUG", "false" } } //LoadingProgress中的 ivProgressSpinner.setImageResource(R.anim.loading_anim);修改好打包時,要移除 lintOptions { disable "ResourceType" } //指定JDK1.7 // compileOptions { // sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_7 // targetCompatibility org.gradle.api.JavaVersion.VERSION_1_7 // } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.0.1' //googlesupportcompile 'com.android.support:design:25.0.1' //資料庫框架 compile project(':xutils') //sdk框架 compile project(':sdk') //日誌 // compile files('libs/android-logging-log4j-1.0.3.jar') //日誌 // compile files('libs/log4j-1.2.17.jar') //註解框架 compile files('libs/butterknife-7.0.1.jar') //拍照 compile project(':imageselect') //凱立德地圖 compile files('libs/cldnavimapsdk_v1.3.5.jar') //凱立德地圖依賴訊飛包 compile files('libs/Msc.jar') //photoview compile 'com.uwetrottmann.photoview:library:1.2.4' //硬體裝置 compile project(':hardware') //aidl compile project(':cepriaidl') //andfix // compile 'com.alipay.euler:andfix:[email protected]' compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support:design:25.0.1' }
【Android Library中的】
apply plugin: 'com.android.library'
android {
    compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
        minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
    buildTypes {
        release {
            minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile project(':sdk')
//    compile 'org.greenrobot:eventbus:3.0.0'
}
【另一個
apply plugin: 'com.android.library'
android {
    compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
        minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
    buildTypes {
        release {
            minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile project(':sdk')
}

sdk版本設定規則

minSdkVersion <= targetSdkVersion <= compileSdkVersion
minSdkVersion <= buildToolsVersion <= compileSdkVersion版本這塊恰到好處是最好的。

gradle中的規章制度

1.全域性變數的使用

不知道你有沒有注意到,在多個module的情況下,不同module的build.gradle檔案中有部分配置項類似,或者依賴的類庫,有部分是相同的,在維護上不是很方便,這個時候就可以考慮統一配置。

專案根目錄的build.gradle檔案中新增以下程式碼和android{}同級

ext {
    //全域性變數控制,可在module中的build.gradle檔案通過rootProject.ext.xxx開頭來使用
    compileSdkVersion = 24
    buildToolsVersion = '24.0.3'
    supportVersion = '24.2.1'
    //主程式版本
    targetSdkVersion = 24
    minSdkVersion = 15
    versionCode = 1
    versionName = "v1.0.0"
    //library版本
    jjdxm_minSdkVersion = 9
    jjdxm_versionCode = 1
    jjdxm_versionName = "v1.0.0"
    jjdxm_v4 = 'com.android.support:support-v4:'+supportVersion
    jjdxm_v7 = 'com.android.support:appcompat-v7:'+supportVersion
    jjdxm_design = 'com.android.support:design:'+supportVersion
    jjdxm_cardview = 'com.android.support:cardview:'+supportVersion
    jjdxm_recyclerview = 'com.android.support:recyclerview-v7:'+supportVersion
}

全域性變數控制,可在module中的build.gradle檔案通過rootProject.ext.xxx開頭來使用,在所有module的build.gradle檔案中配置以上變數,以後在維護專案的時候,只需要在根目錄這個檔案中修改對應的配置項即可。

通過上面的全域性配置,只需要在所有的module中配置上rootProject.ext.jjdxm_v7就都統一了不僅解決了衝突問題,而且可以隨意切換不同版本的v7類庫。

2.配置打包用的簽名

在分享、授權登入功能方面,如微信或微博的分享和授權登入提供SDK,只有在指定的簽名下才能生效。而我們平是開發都習慣預設的Androidkeystore打包簽名。

這個時候要是測試分享或授權登入的功能就要手動去打包指定keystore的簽名。

為提升效率可通過配置gradle,根據release或者是debug打包指定簽名。

根目錄新建一個簽名用到的密碼管理檔案 signing.properties

signing.alias=dou361    #release
signing.password=dou361    #release
signing.jjdxm_alias=dou361   #debug
signing.jjdxm_password=dou361  #debug

在主程式build.gradle的apply plugin: 'com.android.application'下面新增

Properties props = new Properties()
props.load(new FileInputStream(file(rootProject.file("signing.properties"))))

在android{}節點裡面新增

signingConfigs {
    release {
        keyAlias props['signing.alias']
        keyPassword props['signing.password']
        storeFile file(rootProject.file("debug.keystore"))
        storePassword props['signing.password']
    }

    debug {
        keyAlias props['signing.jjdxm_alias']
        keyPassword props['signing.jjdxm_password']
        storeFile file(rootProject.file("debug.keystore"))
        storePassword props['signing.jjdxm_password']
    }
}
buildTypes {
    debug {
        signingConfig signingConfigs.debug
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    release {
        signingConfig signingConfigs.release
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

最後所有檔案如下
根目錄build.gradle

根目錄build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

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

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

ext {
    //全域性變數控制,可在module中的build.gradle檔案通過rootProject.ext.xxx開頭來使用
    compileSdkVersion = 24
    buildToolsVersion = '24.0.3'
    supportVersion = '24.2.1'
    //主程式版本
    targetSdkVersion = 24
    minSdkVersion = 15
    versionCode = 1
    versionName = "v1.0.0"
    //library版本
    jjdxm_minSdkVersion = 9
    jjdxm_versionCode = 1
    jjdxm_versionName = "v1.0.0"
    jjdxm_v4 = 'com.android.support:support-v4:'+supportVersion
    jjdxm_v7 = 'com.android.support:appcompat-v7:'+supportVersion
    jjdxm_design = 'com.android.support:design:'+supportVersion
    jjdxm_cardview = 'com.android.support:cardview:'+supportVersion
    jjdxm_recyclerview = 'com.android.support:recyclerview-v7:'+supportVersion
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

主程式的build.gradle

apply plugin: 'com.android.application'

Properties props = new Properties()
props.load(new FileInputStream(file(rootProject.file("signing.properties"))))

android {
    signingConfigs {
        release {
            keyAlias props['signing.alias']
            keyPassword props['signing.password']
            storeFile file(rootProject.file("debug.keystore"))
            storePassword props['signing.password']
        }

        debug {
            keyAlias props['signing.jjdxm_alias']
            keyPassword props['signing.jjdxm_password']
            storeFile file(rootProject.file("debug.keystore"))
            storePassword props['signing.jjdxm_password']
        }
    }
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.dou361.demogradle"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName
        multiDexEnabled true
        ndk {
            // 指定要ndk需要相容的架構(這樣其他依賴包裡mips,x86,armeabi,arm-v8之類的so會被過濾掉)
            abiFilters "armeabi-v7a", "armeabi"
        }
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

repositories { flatDir { dirs 'libs' } }

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'
    })
    testCompile 'junit:junit:4.12'
    compile rootProject.ext.jjdxm_v7
    compile rootProject.ext.jjdxm_design
}

其他module的build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.jjdxm_minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.jjdxm_versionCode
        versionName rootProject.ext.jjdxm_versionName

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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'
    })
    testCompile 'junit:junit:4.12'
    compile rootProject.ext.jjdxm_v7
    compile rootProject.ext.jjdxm_design
}

keystore密碼管理檔案signing.properties

signing.alias=dou361
signing.password=dou361
signing.jjdxm_alias=dou361
signing.jjdxm_password=dou361

github上專案下載執行

之所以先介紹gradle的一些配置,是因為一個AS專案的啟動基本上都是在根據gradle檔案裡面的配置去聯網同步內容下來的。先了解gradle的一些配置和具體的用法以後會比較容易理解。其中類庫內容同步失敗、架包衝突、sdk版本等問題都可能會導致專案執行不起來。所以從github上面下載下來的專案,不要著急立馬開啟專案,要是網路不好你會發現一隻卡在同步中的介面,這個是因為不同開發者環境不盡相同導致的。

既然開發環境不同,那就可以考慮修改為自己已有的環境,可以省去大部分聯網同步操作,在網路差的情況是很明智的一個舉動,主要有以下幾個步驟:

1.先修改根目錄的build.gradle配置

根目錄裡面無非就一個gradle版本的差異,修改為你當前已有的版本,例如下載的demo是

classpath 'com.android.tools.build:gradle:2.2.3'

版本號2.2.3,而你的環境只有2.1.0的,那就可以修改為

classpath 'com.android.tools.build:gradle:2.1.0'

版本跨越不大的情況下,可以採用以上做法,如果有部分方法不可用,則還是建議聯網下載,一勞永逸。

2.module目錄中的build.gradle配置

大部分module都會依賴到v4 v7等一些support家族的類庫,這個時候有兩種情況會導致出問題,一是module之間的v4包版本號不一致,二是v4版本你的環境沒有。
針對第一種情況,匯入別人的module到你的專案中經常會遇到,解決辦法是參考上面的配置全域性的依賴或者移除重複的;
針對第二種情況,開啟別人的專案經常會遇到,解決辦法是修為你環境已有的版本或者聯網同步下載。

修改完所有module的build.gradle檔案以後,這個時候在開啟專案,有個別不存在類庫會同步去下載,完成以後基本上都是可以執行起來的。


相關推薦

Androidgradle

申明此文系掘金小路飛引進,多為雷同處。 從github或者網上搜索到自己需要的案例,下載下來並且快速執行起來是Android開發過程中最基本的生活動作,這牽扯到Android studio中gradle的相關認識了。 AS專案中有兩種gradle檔案: 1.根目錄的 bui

androidGradle構建專案流程

對於android開發,java語言那肯定都是很熟悉了,但對於android專案的構建應該就不是那麼的瞭解了,android專案的構建是通過gradle,而gradle所使用的語言確實groovy,這對於很多人來說可能就不是那麼的瞭解,groovy是基於java語言,並且也是

Android業務組件化Gradle和Sonatype Nexus搭建私有maven倉庫

Android 前言: 公司的業務組件化推進的已經差不多三四個月的時間了,各個業務組件之間的解耦工作已經基本完成,各個業務組件以module的形式存在項目中,然後項目依賴本地的module,多少有點不太利於項目的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴

使用Android Studo開發NDKGradle的配置(能debug C代碼)

lose service ng- services lba new import dev android 配置: 用的版本號是AS1.5(也能夠嘗試更高版本號)。 Gradle地址是distributionUrl=https\://services.gradle.org

VS生成Cordova for Android應用Gradle

studio tails 文件夾 release 自動化 apach ise phoenix 整理 原文:VS生成Cordova for Android應用之Gradle

Androidbuild.gradle配置簽名

1 問題 android簽名除了我們用android studio build->generate Signed Apks ... 我們還可以自己用build.gradle構建,容易忘記還是記錄下來       2 配置如下 1

Android StudioGradleGradle外掛的區別

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

Android StudioGradle自動化構建打包

  最近一年來的工作最讓我深有感悟的就是測試動不動就是問我要測試包,弄的我實在是叫苦不堪。今天正好有個工作空檔期,也有些意外看到過些類似的博文,正好在這個工作空檔期實現了Window上跑Gradle指令碼自動構建Android專案。   首先,開發環境:     系統:Win7     Gradle版本:4.

Android Studio Gradle 安裝配置和編譯

目錄 前言 由於生產力很大一部分取決於生產工具的使用,為了緊跟時代的潮流,我也從Eclipse切換到Android Studio來進行Android開發。 使用Android Studio的時候,最先遇到的難點應該就是Gradle的安裝、配置

Android專案依賴亂象Gradle迴圈依賴

這個問題在使用eclipse進行開發時就存在,只不過當時大部分引入的是jar包,直接檢查即可排除包重複的問題; 後來使用Android Studio進行開發,用上了gradle來管理專案的依賴,很方便,極大減少工作量,一句話即可引入; 然而,最近在檢視一個執行的專案時

Android Error:Minimum supported Gradle version is 2.14.1. Current version is 2.10. If using the g

1。前沿 studio倒入專案莫名出現下面的錯誤: Error:Minimum supported Gradle version is 2.14.1. Current version is 2.10. If using the gradle wrappe

Android Studio Gradle打包實踐多渠道+版本號管理

上次介紹了 Android Studio的安裝、配置和基本使用 。這次講一下Android Studio用到的打包工具Gradle。 Gradle 是一種構建專案的框架,相容Maven、Ant,為Java專案提供了很多外掛去實現打包功能。廢話不多說,下面直接

除錯Androidsystem.img的來回切換

同事讀啟動log資訊,認為是系統掛載出問題了,在網上搜了一寫,對system.img的處理。 從一篇網文開始 step1 sdat2img.py <transfer_list> <system_new_file> <system_ext4>

androidOkHttp簡單使用,鍵值對,json資料,檔案上傳

okHttp 的簡單使用 引入Gradle依賴:compile 'com.squareup.okhttp3:okhttp:3.4.1' HTTP GET請求 MainActivity程式碼如下: import android.support.v7

Android業務元件化Gradle和Sonatype Nexus搭建私有maven倉庫

前言:      公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以module的形式存在專案中,然後專案依賴本地的module,多少有點不太利於專案的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴的module和主工程放在一個project裡

android studio gradle 多版本多apk打包(打包系列教程五)

當然從截圖也可以看出,配置多apk打包和上一篇文章配置多渠道打包是一樣的,都是在productFlavors中配置的。如上圖,我們在productFlavors中配置了兩種flavor的apk資訊一種是Beta版,一種是Releases版,同時每個flavor中我們都重新配置applicationId這個屬性

Android Studio匯入專案錯誤Gradle版本過高

後來又彈出一對話方塊"The project is using an old version of the android Gradle plugin.To take advantage of all the latest features,such as Instant run,we strongly re

修改github開源庫程式碼,快速上傳到遠端依賴庫(jitpack),進行gradle dependencies compile Android或者java

github上有許多優秀的第三方庫,但是程式碼的耦合是必不可少的。應對需求,不想從頭造輪子,又沒有完全符合的,這裡介紹怎麼樣快速的修改開源庫的程式碼,並且專案引用 2016年以前使用jcenter作為遠端依賴倉庫,簡直 入門到放棄,步驟之多,簡直 入門

Android StudioGradle配置APK自動簽名

一、生成簽名 1、命令列生成簽名,輸入命令keytool-genkey -v -keystore myapp.keystore -alias my_alias -keyalg RSA -keysize

Android Studiogradle的配置與介紹

1、gradle的簡單介紹 Gradle是可以用於Android開發的新一代的Build System,也是Android Studio預設的build工具。其實Gradle指令碼是基於一種JVM語言— Groovy,再加上DSL組成的。由於Groovy是JVM語言,