有一些人反映在github上下載的項目或者做爲module導入你的項目中,運行不起來。或者幾經折騰才勉強運行起來,不知道你有沒有這種感受,若是你有這種困惑不妨繼續閱讀下文,相信本文能幫到你。我一直認爲從github或者網上搜索到本身須要的案例,下載下來而且能快速運行起來是做爲一個Android開發者最基本的能力要求,可能挖的坑多了之後,已經懂得去處理了吧。只能說github上的項目除了一些項目自己提交不完整,實在是缺三拉四的,其他百分之九十九點九都是能夠正常運行的。在如何快速運行一個github的demo以前,先來說解下Android Studio中gradle的一些玩法。javascript
新建一個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
}複製代碼
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'
}複製代碼
不知道你有沒有注意到,在多個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類庫。網絡
主要有接過度享或者受權登陸功能的都應該知道,像微信或者微博的分享和受權登陸提供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複製代碼
之因此先介紹gradle的一些配置,是由於一個AS項目的啓動基本上都是在根據gradle文件裏面的配置去聯網同步內容下來的。先了解gradle的一些配置和具體的用法之後會比較容易理解。其中類庫內容同步失敗、架包衝突、sdk版本等問題均可能會致使項目運行不起來。因此從github上面下載下來的項目,不要着急立馬打開項目,要是網絡很差你會發現一隻卡在同步中的界面,這個是由於不一樣開發者環境不盡相同致使的。
既然開發環境不一樣,那就能夠考慮修改成本身已有的環境,能夠省去大部分聯網同步操做,在網絡差的狀況是很明智的一個舉動,主要有如下幾個步驟:
根目錄裏面無非就一個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'複製代碼
版本跨越不大的狀況下,能夠採用以上作法,若是有部分方法不可用,則仍是建議聯網下載,一勞永逸。
大部分module都會依賴到v4 v7等一些support家族的類庫,這個時候有兩種狀況會致使出問題,一是module之間的v4包版本號不一致,二是v4版本你的環境沒有。
針對第一種狀況,導入別人的module到你的項目中常常會遇到,解決辦法是參考上面的配置全局的依賴或者移除重複的;
針對第二種狀況,打開別人的項目常常會遇到,解決辦法是修爲你環境已有的版本或者聯網同步下載。
修改完全部module的build.gradle文件之後,這個時候在打開項目,有個別不存在類庫會同步去下載,完成之後基本上都是能夠運行起來的。