Android Studio中gradle的一些玩法

前言

有一些人反映在github上下載的項目或者做爲module導入你的項目中,運行不起來。或者幾經折騰才勉強運行起來,不知道你有沒有這種感受,若是你有這種困惑不妨繼續閱讀下文,相信本文能幫到你。我一直認爲從github或者網上搜索到本身須要的案例,下載下來而且能快速運行起來是做爲一個Android開發者最基本的能力要求,可能挖的坑多了之後,已經懂得去處理了吧。只能說github上的項目除了一些項目自己提交不完整,實在是缺三拉四的,其他百分之九十九點九都是能夠正常運行的。在如何快速運行一個github的demo以前,先來說解下Android Studio中gradle的一些玩法。javascript

Android Studio項目中兩種gradle文件

1.根目錄的build.gradle

新建一個Android Studio項目,根目錄會自動生成一個build.gradle文件,主要是配置一些插件和默認的依賴類庫的倉庫。java

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()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}複製代碼

2.module中的根目錄的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依賴的類庫都會合併爲一個。android

主程序的build.gradle文件git

apply plugin: 'com.android.application'//做爲主程序的標識

android {
    compileSdkVersion 24//當前向前兼容sdk的版本
    buildToolsVersion "24.0.3"//構建工具的版本
    defaultConfig {
        applicationId "com.dou361.demogradle"//應用程序的id,在市場上使用的包名
        minSdkVersion 15//最小sdk版本支持
        targetSdkVersion 24//目標sdk版本
        versionCode 1//應用程序版本號
        versionName "1.0"//應用程序版本名稱
        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'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}複製代碼

sdk版本設置規則github

minSdkVersion <= targetSdkVersion <= compileSdkVersion
minSdkVersion <= buildToolsVersion <= compileSdkVersion複製代碼

Android Library中的build.gradle文件android-studio

apply plugin: 'com.android.library'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"

        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'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}複製代碼

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文件中配置以上變量,之後在維護項目的時候,只須要在根目錄這個文件中修改對應的配置項便可是否是很簡單,可能當前你還以爲這樣配置很麻煩,在使用AS過程當中相信你們都遇到過架包衝突的狀況,例如主程序中依賴了com.android.support:appcompat-v7:23.3.0,而其餘module中依賴com.android.support:appcompat-v7:24.2.1的版本,這個時候就會引發衝突,而經過上面的全局配置,只須要在全部的module中配置上rootProject.ext.jjdxm_v7就都統一了不只解決了衝突問題,並且能夠隨意切換不一樣版本的v7類庫。網絡

2.配置打包用的簽名

主要有接過度享或者受權登陸功能的都應該知道,像微信或者微博的分享和受權登陸提供sdk,只有在指定的簽名下才能生效,而咱們平時開發都習慣使用默認的androidkeystore打包簽名,這個時候想要測試分享或者登陸功能就須要手動去打包指定keystore的簽名。很是影響開發效率,這個時候能夠經過配置gradle,根據release或者是debug打包指定的簽名。架構

項目根目錄新建一個簽名用到的密碼管理文件signing.propertiesapp

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

// 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文件之後,這個時候在打開項目,有個別不存在類庫會同步去下載,完成之後基本上都是能夠運行起來的。

相關文章
相關標籤/搜索